Mapping主要类似数据库中表字段定义,主要有如下作用:
定义Index下字段名(Field Name)
定义字段的类型,比如数值型,字符串型、布尔型等
定义倒排索引的相关配置,比如是否索引、记录postion等
需要注意的是,在索引中定义太多字段可能会导致索引膨胀,出现内存不足和难以恢复的情况,下面有几个设置:
index.mapping.total_fields.limit:一个索引中能定义的字段的最大数量,默认是 1000
index.mapping.depth.limit:字段的最大深度,以内部对象的数量来计算,默认是20
index.mapping.nested_fields.limit:索引中嵌套字段的最大数量,默认是50
字符串 - text
用于全文索引,该类型的字段将通过分词器进行分词,最终用于构建索引
字符串 - keyword
不分词,只能搜索该字段的完整的值,只用于 filtering
数值型
long:有符号64-bit integer:-2^63 ~ 2^63 - 1
integer:有符号32-bit integer,-2^31 ~ 2^31 - 1
short:有符号16-bit integer,-32768 ~ 32767
byte: 有符号8-bit integer,-128 ~ 127
double:64-bit IEEE 754 浮点数
float:32-bit IEEE 754 浮点数
half_float:16-bit IEEE 754 浮点数
scaled_float
布尔 - boolean
值:false, "false", true, "true"
日期 - date
由于Json没有date类型,所以es通过识别字符串是否符合format定义的格式来判断是否为date类型
format默认为:strict_date_optional_time||epoch_millis format
实测,仅支持"yyyy-MM-dd"、"yyyyMMdd"、"yyyyMMddHHmmss"、"yyyy-MM-ddTHH:mm:ss"、"yyyy-MM-ddTHH:mm:ss.SSS"、"yyyy-MM-ddTHH:mm:ss.SSSZ"格式,不支持常用的"yyyy-MM-dd HH:mm:ss"等格式。注意,"T"和"Z"是固定的字符,在获取"yyyy-MM-ddTHH:mm:ss"、"yyyy-MM-ddTHH:mm:ss.SSS"、"yyyy-MM-ddTHH:mm:ss.SSSZ"格式字符串值时,不能直接以前面格式格式化date,而是需要多次格式化date并且拼接得到。
二进制 - binary
该类型的字段把值当做经过 base64 编码的字符串,默认不存储,且不可搜索
范围类型
范围类型表示值是一个范围,而不是一个具体的值
譬如 age 的类型是 integer_range,那么值可以是 {"gte" : 10, "lte" : 20};搜索 "term" : {"age": 15} 可以搜索该值;搜索 "range": {"age": {"gte":11, "lte": 15}} 也可以搜索到 range参数 relation 设置匹配模式
INTERSECTS :默认的匹配模式,只要搜索值与字段值有交集即可匹配到
WITHIN:字段值需要完全包含在搜索值之内,也就是字段值是搜索值的子集才能匹配
CONTAINS:与WITHIN相反,只搜索字段值包含搜索值的文档
integer_range
float_range
long_range
double_range
date_range:64-bit 无符号整数,时间戳(单位:毫秒)
ip_range:IPV4 或 IPV6 格式的字符串
复杂数据类型
数组类型 Array
字符串数组 [ "one", "two" ]
整数数组 [ 1, 2 ]
数组的数组 [ 1, [ 2, 3 ]],相当于 [ 1, 2, 3 ]
Object对象数组 [ { "name": "Mary", "age": 12 }, { "name": "John", "age": 10 }]
同一个数组只能存同类型的数据,不能混存,譬如 [ 10, "some string" ] 是错误的
数组中的 null 值将被 null_value 属性设置的值代替或者被忽略
空数组 [] 被当做 missing field 处理
对象类型 Object
对象类型可能有内部对象
被索引的形式为:manager.name.first
嵌套类型 Neste
nested 类型是一种对象类型的特殊版本,它允许索引对象数组,独立地索引每个对象
地理位置数据类型
geo_point
地理位置,其值可以有如下四中表现形式:
object对象:"location": {"lat": 41.12, "lon": -71.34}
字符串:"location": "41.12,-71.34"
geohash:"location": "drm3btev3e86"
数组:"location": [ -71.34, 41.12 ]
查询的时候通过 Geo Bounding Box Query 进行查询
geo_shape
geo详细请见:https://blog.csdn.net/u012332735/article/details/54971638
专用数据类型
记录IP地址 ip
实现自动补全 completion、suggest
记录分词数 token_count
记录字符串hash值 murmur3
Percolator
多字段特性 multi-fields
允许对同一个字段采用不同的配置,比如分词,常见例子如对人名实现拼音搜索,只需要在人名中新增一个子字段为 pinyin 即可 通过参数 fields 设置
es6.0与之前版本区别:
新增字段: eager_global_ordinals
删除的字段: include_in_all
"type" : "text", 是数据类型一般文本使用text(可分词进行模糊查询);keyword无法被分词(不需要执行分词器),用于精确查找
"analyzer" : "ik_max_word", #指定分词器,一般使用最大分词:ik_max_word
"normalizer" : "normalizer_name", #字段标准化规则;如把所有字符转为小写;具体如下举例
"boost" : 1.5, #字段权重;用于查询时评分,关键字段的权重就会高一些,默认都是1;另外查询时可临时指定权重
"coerce" : true, #清理脏数据:1,字符串会被强制转换为整数 2,浮点数被强制转换为整数;默认为true
"copy_to" : "field_name", #自定_all字段;指定某几个字段拼接成自定义;具体如下举例
"doc_values" : true, #加快排序、聚合操作,但需要额外存储空间;默认true,对于确定不需要排序和聚合的字段可false
"dynamic" : true, #新字段动态添加 true:无限制 false:数据可写入但该字段不保留 'strict':无法写入抛异常
"enabled" : true, #是否会被索引,但都会存储;可以针对一整个_doc
"fielddata" : false, #针对text字段加快排序和聚合(doc_values对text无效);此项官网建议不开启,非常消耗内存
"eager_global_ordinals": true, #是否开启全局预加载,加快查询;此参数只支持text和keyword,keyword默认可用,而text需要设置fielddata属性
"format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" ,#格式化 此参数代表可接受的时间格式 3种都接受
"ignore_above" : 100, #指定字段索引和存储的长度最大值,超过最大值的会被忽略
"ignore_malformed" : false ,#插入文档时是否忽略类型 默认是false 类型不一致无法插入
"index_options" : "docs" ,
# 4个可选参数
# docs(索引文档号),
# freqs(文档号 + 词频),
# positions(文档号 + 词频 + 位置,通常用来距离查询),
# offsets(文档号 + 词频 + 位置 + 偏移量,通常被使用在高亮字段)
# 分词字段默认是position,其他的默认是docs
"index" : true, #该字段是否会被索引和可查询 默认true
"fields": {"raw": {"type": "keyword"}} ,#可以对一个字段提供多种索引模式,使用text类型做全文检索,也可使用keyword类型做聚合和排序
"norms" : true, #用于标准化文档,以便查询时计算文档的相关性。建议不开启
"null_value" : "NULL", #可以让值为null的字段显式的可索引、可搜索
"position_increment_gap" : 0 ,#词组查询时可以跨词查询 既可变为分词查询 默认100
"properties" : {}, #嵌套属性,例如该字段是音乐,音乐还有歌词,类型,歌手等属性
"search_analyzer" : "ik_max_word" ,#查询分词器;一般情况和analyzer对应
"similarity" : "BM25",#用于指定文档评分模型,参数有三个:
# BM25 :ES和Lucene默认的评分模型
# classic :TF/IDF评分
# boolean:布尔模型评分
"store" : true, #默认情况false,其实并不是真没有存储,_source字段里会保存一份原始文档。
# 在某些情况下,store参数有意义,比如一个文档里面有title、date和超大的content字段,如果只想获取title和date
"term_vector" : "no" #默认不存储向量信息,
# 支持参数yes(term存储),
# with_positions(term + 位置),
# with_offsets(term + 偏移量),
# with_positions_offsets(term + 位置 + 偏移量)
# 对快速高亮fast vector highlighter能提升性能,但开启又会加大索引体积,不适合大数据量用