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":{ "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", "search_analyzer":"my_stop_analyzer", "search_quote_analyzer":"my_analyzer" } } } } }
|
normalizer
用于解析前的标准化配置,如将所有的字符串转化为小写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| PUT index { "settings":{ "analysis":{ "normalizer":{ "my_normalizer":{ "type":"custom", "char_filter":[], "filter":["lowercase","asciifolding"] } } } }, "mappings":{ "properties":{ "foo":{ "type":"keyword", "normalizer":"my_normalizer" } } } }
|
在插入foo数据时会自动将所插入的数据变为小写
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 }, "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" } } } } }
|
如
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支持几乎所有字段类型,其是一种列存储结构,能够快速通过文档ID来找到对应的字段
text字段不会在索引中生成doc_values,在查询时会生成一个fielddata的数据结构,在字段首次被聚合、排序的时候生成
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 } } } } }
|
fielddata
上面说过doc_values,但是text类型的字段不支持doc_values,其在查询时利用fielddata的数据结构,该数据结构在字段被用于聚合、排序或者脚本访问的第一时间创建
fielddata默认是关闭的
1 2 3 4 5 6 7 8
| { "properties": { "my_field": { "type": "text", "fielddata": true } } }
|
eager_global_ordinals
对于日期格式可以使用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设置的长度还要长的字符串不会被分词或者索引,主要用于不分词的字符串字段,这些字符串通常用来过滤、聚合以及排序
只适用于keyword类型
1 2 3 4 5 6 7 8 9 10 11 12
| { "mappings": { "_doc": { "properties": { "message": { "type": "keyword", "ignore_above": 20 } } } } }
|
如果某参数设置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", "fields": { "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
相似算法有
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" } } } } }
|