我们先来看一下一些常用的参数的简介,大致明白这些参数的含义,后面会对一些重要的参数做一个更加详细一些的说明。
参数 | 说明 |
---|---|
index | 默认true,字段是否索引 |
enable | 默认true,字段是否索引,不索引能减少CPU使用,但是不能搜索 |
store | 默认false,如果需要获取的字段只是文档中的小数据,这些字段可以store,减少IO |
doc_values | 默认true,优化字段排序聚合脚本访问,耗用磁盘空间 |
fielddata | 默认false,针对text类型排序、聚合、脚本访问优化,尽量避免,操作昂贵 |
norms | 默认true,如果字段不需要参与评分,设置为false,减少磁盘占用 |
很多term操作的字段norms都可以设置为false,比如很多日期字段,一般很少会在日期上做全文索引的,当然具体问题具体分析。
索引结构化的字段,比如email地址、主机名、状态码和标签这些可以设置为keyword类型的字段norms都可以考虑设置为false。
参数 | 说明 |
---|---|
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类型,true\false\strict |
非常有用的一个参数,顾名思义,忽略掉不正常的字段类型。
例如,添加文档的时候一个date类型的值被设置为了email字符串,或者其他不能转换为date的类型的时候,ES就会直接抛出异常。
如果,ignore_malformed设置为true,就会忽略掉出错的字段,正常处理其他字段。
简单的来说enable控制的这个字段是否可以索引,默认为true,因为我们使用ES的目的就是希望能够进行全文索引。
如果有的字段我们希望能够查到数据,但是并不希望索引影进而响文档的评分该怎么办呢?
将enable设置为false就可以了。
注意:enable只能在最顶层,并且type为object的时候设置才生效。
enable设置为true,虽然不能被索引,但是可以通过_source获取数据。
store控制数据存储方式,设置为true就会单独存储一份。如果查询是从一个很多的文档中检索几个小的字段,就可以将小的字段设置为store来单独存储。
这种方式比从_source中检索,然后排除掉效率要高一些,因为减少IO操作。
查询:
{
"_source": false,
"stored_fields": [ "title", "date" ]
}
通过stored_fields方式,默认就不会获取_source
dynamic设置的是ES是否可以动态探测文档字段,并且在mapping中动态的修改添加相应的类型。
dynamic有3个值:
默认true,如果不需要对字段进行排序和聚合,或者脚本中访问字段,可以设置为false,节约磁盘空间
text类型不支持doc_values
因为doc_values不支持text类型,所以有了fielddata,fielddata是text版本的doc_values,也是为了优化字段进行排序、聚合和脚本访问。
和doc_values不同的是,fielddata使用的是内存,而不是磁盘。
加载fielddata是一个昂贵的过程,所以默认是false。
强烈建议不要使用fielddata,在设计的时候就应该避免使用fielddata
fielddata
存储倒排索引的哪些信息,4个可选参数:
分词字段默认是positions,其他默认时docs
{
"mappings": {
"properties": {
"date": {
"type": "date",
"format": "yyyy-MM-dd"
}
}
}
}
mapping-format
设置字段规范化处理器。
normalizer
null值不能被搜索,可以给空值设置一个默认字符串。
{
"mappings": {
"properties": {
"status_code": {
"type": "keyword",
"null_value": "NULL"
}
}
}
}
search_analyzer
如果想在一个字段上做多种操作,比如一个type为text的字段,要做全文索引,有需要排序和聚合操作。
{
"mappings": {
"properties": {
"city": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
这样query操作可以在city上进行,sort与aggs操作就可以在city.raw上进行。
fields
Elasticsearch-mapping参数