Elasticsearch 重要mapping参数详解(三)

2019-12-16 11:15:12 浏览数 (1)

一、概览

我们先来看一下一些常用的参数的简介,大致明白这些参数的含义,后面会对一些重要的参数做一个更加详细一些的说明。

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的区别:

  1. index为false,不分词但是还是能够通过完全匹配搜索到,并且会影响文档的评分。
  2. 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的时候设置才生效。

param-enable.pngparam-enable.png

enable设置为true,虽然不能被索引,但是可以通过_source获取数据。

六、store

store控制数据存储方式,设置为true就会单独存储一份。如果查询是从一个很多的文档中检索几个小的字段,就可以将小的字段设置为store来单独存储。

这种方式比从_source中检索,然后排除掉效率要高一些,因为减少IO操作。

param-store.pngparam-store.png

查询:

代码语言:txt复制
{
    "_source": false,
    "stored_fields": [ "title", "date" ] 
}

通过stored_fields方式,默认就不会获取_source

七、dynamic

dynamic设置的是ES是否可以动态探测文档字段,并且在mapping中动态的修改添加相应的类型。

dynamic有3个值:

  1. true 表示允许动态探测文档字段添加修改mapping类型
  2. false 表示不会动态修改mapping,但是如果文档中有mapping中没有的字段也能添加成功,但是不会索引该字段
  3. strict 表示如果文档中有mapping中没有的字段,就不允许添加文档
dynamic.pngdynamic.png

八、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个可选参数:

  1. docs:索引文档号
  2. freqs:文档号 词频
  3. positions:文档号 词频 位置,通常用来距离查询
  4. 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参数

0 人点赞