0%

elasticsearch映射参数

elasticsearch映射参数

映射参数对字段映射的特殊需求进行设置

analyzer

分析器用于将字符串转换为一连串的索引词,elasticsearch附带有一系列预定义的分析器,不需要配置就可以使用,每个查询、每个字段或每个索引都可以指定分析器,在创建索引时,elasticsearch会以该顺序查找分析器

  • 在字段映射中定义的分析器

  • 在索引设置中名为default的分析器

  • 标准分析器

查询时,会以该顺序查找分析器

  • 在全文查询中定义的搜索分析器
  • 字段映射中定义的search_analyzer
  • 字段映射中定义的analyzer
  • 索引设置中名为default_search的分析器
  • 索引设置中名为default的分析器
  • 标准分析器

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
{
"settings":{
"analysis":{
"analyzer":{
"my_analyzer":{ // 索引设置中定义的analyzer,可以在字段中使用该自定义的analyzer
"type":"custom",
"tokenizer":"standard",
"filter":[
"lowercase"
]
},
"my_stop_analyzer":{
"type":"custom",
"tokenizer":"standard",
"filter":[
"lowercase",
"english_stop"
]
}
},
"filter":{
"english_stop":{
"type":"stop",
"stopwords":"_english_"
}
}
}
},
"mappings":{
"_doc":{
"properties":{
"title": {
"type":"text",
"analyzer":"my_analyzer", // 字段映射中配置自定义的 analyzer
"search_analyzer":"my_stop_analyzer", // 字段映射中配置自定义的 search_analyzer
"search_quote_analyzer":"my_analyzer" // 字段映射中配置自定义的 search_quote_analyzer
}
}
}
}
}

normalizer

boost

在索引时,可以通过boost参数对一个字段进行加权

索引时加权

在5.0的时候废弃

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"mappings": {
"_doc": {
"properties": {
"title": {
"type": "text",
"boost": 2 // 默认是1,设置为2匹配title字段会有两倍加权
},
"content": {
"type": "text"
}
}
}
}
}

查询时加权

1
2
3
4
5
6
7
8
9
10
{
"query": {
"match" : {
"title": {
"query": "quick brown fox",
"boost": 2
}
}
}
}

coerce

数据不都是干净的,一个数字可能是5,也可能是5.0,强制尝试清理脏值来匹配字段的数据类型,如

  • 字符串会强制转换为数字
  • 浮点型数据会被截取为整型数据
  • 经纬地理点数据会归一化到标准-180:180 / -90:90坐标系统
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"mappings": {
"_doc": {
"properties": {
"number_one": {
"type": "integer"
},
"number_two": {
"type": "integer",
"coerce": false // 该字段不可进行类型转换,只能传整型的数字才能存储,字符串类型的将无法设置
}
}
}
}
}

也可以在settings中设置索引全局默认的

1
2
3
"settings": {
"index.mapping.coerce": false
}

copy_to

使用copy_to参数可以创建自定义的_all字段,也就是多个字段的值可复制为一组字段,然后可以作为单个字段进行查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"mappings": {
"_doc": {
"properties": {
"first_name": {
"type": "text",
"copy_to": "full_name"
},
"last_name": {
"type": "text",
"copy_to": "full_name"
},
"full_name": {
"type": "text" // first_name和last_name会被复制到full_name中,first_name和last_name仍可以单独查询,且full_name可以同时查询两个字段的内容
}
}
}
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PUT my_index/_doc/1
{
"first_name": "John",
"last_name": "Smith"
}

GET my_index/_search
{
"query": {
"match": {
"full_name": {
"query": "John Smith",
"operator": "and"
}
}
}
}

doc_values

大多数字段默认被索引,使它们可以被搜索到,反向索引允许查询请求在唯一的索引词有序列表中寻找搜索的索引词,找到之后立即访问包含索引词的文档列表

排序、聚合以及在脚本中访问字段需要一个不同的数据访问模式,需要能够查找文档并在一个字段中寻找存在的索引词

doc values文档值是磁盘上的数据结构,在文档索引阶段创建,使上面这种数据访问模式成为可能。doc_values支持几乎所有字段类型

所有的字段默认包含在文档值中,如果确定一个字段不需要排序、聚合或者脚本中访问字段值,可以禁用文档值来节省存储空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"mappings": {
"_doc": {
"properties": {
"status_code": {
"type": "keyword"
},
"session_id": {
"type": "keyword",
"doc_values": false
}
}
}
}
}

dynamic

默认情况下,字段可以被动态的添加到一个文档中,dynamic设置控制新字段是否可以被动态添加

  • true 新检测到的字段会被添加到映射中(默认)
  • false 新检测到的字段会被忽略,新字段必须明确被添加
  • strict 如果新字段被检测到,一个会被抛出异常
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"mappings": {
"_doc": {
"dynamic": false,
"properties": {
"user": {
"properties": {
"name": {
"type": "text"
},
"social_networks": {
"dynamic": true,
"properties": {}
}
}
}
}
}
}
}

enabled

enabled设置尽可以被应用于映射类型和对象字段,导致elasticsearch跳过字段内容的分解,JSON可以从_source字段中获取,但是不能用于搜索或以其他方式存储

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"mappings": {
"_doc": {
"properties": {
"user_id": {
"type": "keyword"
},
"last_updated": {
"type": "date"
},
"session_data": {
"enabled": false // 将忽略非JSON对象的值
}
}
}
}
}

fielddata

上面说过doc_values,但是text类型的字段不支持doc_values,其在查询时利用fielddata的数据结构,该数据结构在字段被用于聚合、排序或者脚本访问的第一时间创建

1
2
3
4
5
6
7
8
{
"properties": {
"my_field": {
"type": "text",
"fielddata": true
}
}
}

eager_global_ordinals

format

对于日期格式可以使用format来指定时间格式

1
2
3
4
5
6
7
8
9
10
11
12
{
"mappings": {
"_doc": {
"properties": {
"date": {
"type": "date",
"format": "yyyy-MM-dd"
}
}
}
}
}

ignore_above

比ignore_above设置的长度还要长的字符串不会被分词或者索引,主要用于不分词的字符串字段,这些字符串通常用来过滤、聚合以及排序

1
2
3
4
5
6
7
8
9
10
11
12
{
"mappings": {
"_doc": {
"properties": {
"message": {
"type": "keyword",
"ignore_above": 20
}
}
}
}
}

ignore_malformed

如果某参数设置ignore_malformed,那么对于该参数的数据类型异常会被忽略,错误字段不会被索引,但是其他字段会正常处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"mappings": {
"_doc": {
"properties": {
"number_one": {
"type": "integer",
"ignore_malformed": true
},
"number_two": {
"type": "integer" // 如果传的不是数字类型的,会直接报错,文档不会存储
}
}
}
}
}

index_options

index_options用来控制将什么信息添加到反向索引

  • docs 只有被索引的文档数量,用来解决字段中是否包含这个索引词的问题
  • freqs 被索引的文档数量和索引词频率,频率用来使重复索引词的得分高于单个索引词
  • positions 文档数量,索引词频率以及索引词位置,位置可以用于临近或短语查询
  • offsets 文档数量,索引词频率、索引词位置以及结束字符偏移量

index_phrases

index_prefixes

index

用来控制字段值是否进行索引,有true和false两种方式

fields

fields是基于不同的目的用不同的方法索引相同的字段,如一个字符串字段可以作为分词字段被索引用于全文搜索,也可以作为不可分词字段用于排序聚合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"mappings": {
"_doc": {
"properties": {
"city": {
"type": "text", // 使用city字段用于分词
"fields": {
"raw": { // 使用city.raw用于排序、聚合
"type": "keyword"
}
}
}
}
}
}
}

norms

norms存储各种标准化系数,表示相关字段的长度和索引时相关性加权设置,虽然用于计算相关性得分很有用,但是会占用大量内存

1
2
3
4
5
6
7
8
{
"properties": {
"title": {
"type": "text",
"norms": false
}
}
}

null_value

空值不能被索引,当一个字段设置为null,会当做没有值的字段,使用null_value可以设置默认值,可以被索引和搜索

1
2
3
4
5
6
7
8
9
10
11
12
{
"mappings": {
"_doc": {
"properties": {
"status_code": {
"type": "keyword",
"null_value": "NULL"
}
}
}
}
}

position_increment_gap

为了可以支持短语查询,需要保存可分词字符串中分词的位置,当字符串字段索引多个值,一个虚拟的缺口会被加到各个值之间来防止短语查询跨值匹配,缺口大小可以使用position_increment_gap来配置,默认是100

1
2
3
4
5
6
7
8
9
10
11
12
{
"mappings": {
"_doc": {
"properties": {
"names": {
"type": "text",
"position_increment_gap": 0
}
}
}
}
}

properties

类型映射,对象字段和嵌套类型字段包含子字段,称为属性,这些属性可以是任何数据类型,包含对象和嵌套类型,属性在以下情况添加:

  • 创建索引的时候明确定义
  • 利用创建索引映射接口添加或修改映射的时候明确定义
  • 索引包含新字段的文档可以动态添加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"mappings": {
"_doc": {
"properties": {
"manager": {
"properties": {
"age": { "type": "integer" },
"name": { "type": "text" }
}
},
"employees": {
"type": "nested",
"properties": {
"age": { "type": "integer" },
"name": { "type": "text" }
}
}
}
}
}
}

search_analyzer

一般情况下,索引时和搜索时应该使用相同的分词器,确保查询时的索引词和反向索引中的索引词有相同的格式,但有些时候,需要在查询时使用不同的分词器

可以使用search_analyzer来设置查询时使用的分词器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
"settings": {
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 20
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
},
"mappings": {
"_doc": {
"properties": {
"text": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard"
}
}
}
}
}

similarity

elasticsearch允许对每个字段配置得分算法和相似算法,similarity参数提供了简单的方式来选择不同于默认的BM25

相似算法有

  • BM25 默认
  • classic
  • boolean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"mappings": {
"_doc": {
"properties": {
"default_field": {
"type": "text"
},
"boolean_sim_field": {
"type": "text",
"similarity": "boolean"
}
}
}
}
}

store

默认情况下,字段值被索引来确保可以被搜索,但是不会被存储,这意味着可以查询字段但是无法取回原始字段,但是字段值早已经被默认存储在_source字段中,一般情况下是不需要使用store来单独设置字段存储的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"mappings": {
"_doc": {
"properties": {
"title": {
"type": "text",
"store": true
},
"date": {
"type": "date",
"store": true
},
"content": {
"type": "text"
}
}
}
}
}

term_vector

索引词向量包含分析过程产生的索引词信息,包括

  • 索引词列表
  • 每个索引词的位置
  • 映射索引词到原始字符串中的原始位置中开始和结束字符的偏移量

term_vector可设置的值

  • no 不存储索引词向量,默认
  • yes 只存储字段的索引词
  • with_positions 索引词和位置将会被存储
  • with_offsets 索引词和字符偏移量会被存储
  • with_positions_offsets 索引词、位置以及字符偏移量都会被存储
  • with_positions_payloads
  • with_positions_offsets_payloads
1
2
3
4
5
6
7
8
9
10
11
12
{
"mappings": {
"_doc": {
"properties": {
"text": {
"type": "text",
"term_vector": "with_positions_offsets"
}
}
}
}
}