一、概览
我们先来看一下一些常用的参数的简介,大致明白这些参数的含义,后面会对一些重要的参数做一个更加详细一些的说明。
1.1、影响性能的参数
参数 | 说明 |
---|---|
index | 默认true,字段是否analyzed,false不分词,不能被查询 |
enable | 默认true,字段是否索引,不索引能减少CPU使用,但是不能搜索 |
store | 默认false,如果需要获取的字段只是文档中的小数据,这些字段可以store,减少IO |
doc_values | 默认true,优化字段排序聚合脚本访问,耗用磁盘空间 |
fielddata | 默认false,针对text类型排序、聚合、脚本访问优化,尽量避免,操作昂贵 |
norms | 默认true,如果字段不需要参与评分,设置为false,减少磁盘占用 |
index在早些版本的时候的值是analyzed与not_analyzed,分别对应现在的true与false。
举一个简单的例子:如果一个字段的值为:"es is awsome"。
如果这个字段index设置为true,那么我们搜索的时候搜索'es'也可以搜索到这个字段所在的文档。
如果这个字段index设置为false,那么通过'es'搜索就不能搜索到改字段所在的文档。
index与enable的区别:
- index为false,不分词但是还是能够通过完全匹配搜索到,并且会影响文档的评分。
- enable为false,这个字段就完全不能配搜索,并且不会影响文档的评分。
很多term操作的字段norms都可以设置为false,比如很多日期字段,一般很少会在日期上做全文索引的,当然具体问题具体分析。
索引结构化的字段,比如email地址、主机名、状态码和标签这些可以设置为keyword类型的字段norms都可以考虑设置为false。
1.2、其他参数
参数 | 说明 |
---|---|
boost | 默认1,评分加权系数 |
analyzer | 字段使用的分析器 |
similarity | 评分使用的算法 |
fields | 一个字段多种处理方式 |
null_value | 设置空值的默认值 |
search_analyzer | 搜索使用的分析器 |
ignore_above | 设置索引和store的长度,超过长度的忽略 |
copy_to | 将该字段拷贝到指定字段,方便通过一个字段搜索 |
ignore_malformed | 默认false,添加文档时忽略该字段的异常数据 |
index_option | 倒排索引的内容,docs、freqs、positions、offsets |
coerce | 默认true,是否允许数据类型强制转换,如字符串转数字,浮点转整型 |
dynamic | 默认true,是否允许根据文档动态添加mapping类型,truefalsestrict |
四、ignore_malformed
非常有用的一个参数,顾名思义,忽略掉不正常的字段类型。
例如,添加文档的时候一个date类型的值被设置为了email字符串,或者其他不能转换为date的类型的时候,ES就会直接抛出异常。
如果,ignore_malformed设置为true,就会忽略掉出错的字段,正常处理其他字段。
五、enable
简单的来说enable控制的这个字段是否可以索引,默认为true,因为我们使用ES的目的就是希望能够进行全文索引。
如果有的字段我们希望能够查到数据,但是并不希望索引影进而响文档的评分该怎么办呢?
将enable设置为false就可以了。
注意:enable只能在最顶层,并且type为object的时候设置才生效。
enable设置为true,虽然不能被索引,但是可以通过_source获取数据。
六、store
store控制数据存储方式,设置为true就会单独存储一份。如果查询是从一个很多的文档中检索几个小的字段,就可以将小的字段设置为store来单独存储。
这种方式比从_source中检索,然后排除掉效率要高一些,因为减少IO操作。
查询:
代码语言:txt复制{
"_source": false,
"stored_fields": [ "title", "date" ]
}
通过stored_fields方式,默认就不会获取_source
七、dynamic
dynamic设置的是ES是否可以动态探测文档字段,并且在mapping中动态的修改添加相应的类型。
dynamic有3个值:
- true 表示允许动态探测文档字段添加修改mapping类型
- false 表示不会动态修改mapping,但是如果文档中有mapping中没有的字段也能添加成功,但是不会索引该字段
- strict 表示如果文档中有mapping中没有的字段,就不允许添加文档
八、doc_values
默认true,如果不需要对字段进行排序和聚合,或者脚本中访问字段,可以设置为false,节约磁盘空间,也减少添加索引的磁盘IO,因为不用创建doc_valuses这个磁盘数据结构了。
doc_value是存储在磁盘的数据结构,在添加文档的时候就创建了,它使用面向列的方式存储让它有更好的排序和聚合效率。
doc_values不支持text和annotated_text类型的字段。
九、fielddata
因为doc_values不支持text类型,所以有了fielddata,fielddata是text版本的doc_values,也是为了优化字段进行排序、聚合和脚本访问。
和doc_values不同的是,fielddata使用的是内存,而不是磁盘。
加载fielddata是一个昂贵的过程,所以默认是false。
强烈建议不要使用fielddata,在设计的时候就应该避免使用fielddata
fielddata
十、index_option
存储倒排索引的哪些信息,4个可选参数:
- docs:索引文档号
- freqs:文档号 词频
- positions:文档号 词频 位置,通常用来距离查询
- offsets:文档号 词频 位置 偏移量,通常被使用在高亮字段
位置是分词过滤后文档中的第几个单词,偏移量包括单词开始的字节和结束的字节,方便反过来从文档中查询。
分词字段默认是positions,其他默认时docs。
十一、format
代码语言:txt复制{
"mappings": {
"properties": {
"date": {
"type": "date",
"format": "yyyy-MM-dd"
}
}
}
}
mapping-format
十二、null_value
null值不能被搜索,可以给空值设置一个默认字符串。
代码语言:txt复制{
"mappings": {
"properties": {
"status_code": {
"type": "keyword",
"null_value": "NULL"
}
}
}
}
十三、fields
如果想在一个字段上做多种操作,比如一个type为text的字段,要做全文索引,有需要排序和聚合操作。
代码语言:txt复制{
"mappings": {
"properties": {
"city": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
这样query操作可以在city上进行,sort与aggs操作就可以在city.raw上进行。
fields
十四、search_analyzer
搜索的时候使用的分析器
search_analyzer
十五、normalizer
设置字段规范化处理器,主要用于过滤掉特殊字符、转换大小写等。
针对keyword,在查询或者索引之前执行。
normalizer
十六、文档
Elasticsearch-mapping参数