1、概念:mapping就是ES数据字段field的type元数据,ES在创建索引的时候,dynamic mapping会自动为不同的数据指定相应mapping,mapping中包含了字段的类型、搜索方式(exact value或者full text)、分词器等。
2、查看mapping:GET /product/_mapping
3、Dynamic mapping
① “Elasticsearch”:text/keyword
② 123456 => long
③ 123.123 => double
④ true false => boolean
⑤ 2020-05-20 => date
为啥price是long类型而不是integer?
因为es的mapping_type是由JSON分析器检测数据类型,而Json没有隐式类型转(integer=>long or float=> double),所以dynamic mapping会选择一个比较宽的数据类型。
4、搜索方式
① exact value 精确匹配:在倒排索引过程中,分词器会将field作为一个整体创建到索引中
② full text全文检索:分词、近义词同义词、混淆词、大小写、词性、过滤、时态转换等(normaliztion)
5、ES数据类型
①数字类型:long, integer, short, byte, double, float, half_float, scaled_float
在满足需求的情况下,尽可能选择范围小的数据类型
②字符串类型:keyword、text
a.适用于索引结构化的字段,可以用于过滤、排序、聚合。keyword类型的字段只能通过精确值(exact value)搜索到。Id应该用keyword
b.当一个字段是要被全文搜索的,比如Email内容、产品描述,这些字段应该使用text类型。
设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。
text类型的字段不用于排序,很少用于聚合。
解释:字段数据会占用大量堆空间,尤其是在加载高基数text字段时。字段数据一旦加载到堆中,就在该段的生命周期内保持在那里。
同样,加载字段数据是一个昂贵的过程,可能导致用户遇到延迟问题。这就是默认情况下禁用字段数据的原因
6、复杂类型:
①Object:用于单个JSON对象
②Nested:用于JSON对象数组
7、创建mapping:
PUT /product3 { "mappings": { "properties": { "date": { "type": "text" }, "desc": { "type": "text", }, "name": { "type": "text", }, "price": { "type": "long" }, "tags": { "type": "text", }, "parts": { "type": "object" }, "partlist": { "type": "nested" } } } }
8、Mapping parameters
①index:是否对创建对当前字段创建索引,默认true,如果不创建索引,该字段不会通过索引被搜索到,但是仍然会在source元数据中展示
②analyzer:指定分析器(character filter、tokenizer、Token filters)。
③boost:对当前字段相关度的评分权重,默认1
④coerce:是否允许强制类型转换 true “1”=> 1 false “1”=< 1
⑤copy_to:
"field": {
"type": "text",
"copy_to": "other_field_name"
}
⑥doc_values:为了提升排序和聚合效率,默认true,如果确定不需要对字段进行排序或聚合,也不需要通过脚本访问字段值,则可以禁用doc值以节省磁盘空间(不支持text和annotated_text)
二、聚合查询
1、 语法:
aggs:{
code...
}
GET /product/_search { "aggs": { "tag_agg_group": { "terms": { "field": "tags.keyword" } } }, "size": 0 }
2、统计价格大于1999的数据
GET /product/_search { "query": { "bool": { "filter": [ { "range": { "price": { "gt": 1999 } } } ] } }, "aggs": { "tag_agg_group": { "terms": { "field": "tags.keyword" } } }, "size": 0 }
(4) “avg”:价格大于1999的每个tag产品的平均价格
GET /product/_search { "aggs": { "avg": { "terms": { "field": "tags.keyword", "order": { "avg_price": "desc" } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } } }, "size": 0 }
(5) 分组聚合
按照千元机:1000以下 中端机:2000-3000 高端机:3000以上分组聚合,分别计算数量
GET /product/_search { "aggs": { "tag_agg_group": { "range": { "field": "price", "ranges": [ { "from": 100, "to": 1000 }, { "from": 1000, "to": 2000 }, { "from": 3000 } ] }, "aggs": { "price_agg": { "avg": { "field": "price" } } } } }, "size": 0 }