Mapping
概念
mapping就是ES数据字段field的type元数据,ES在创建索引的时候,dynamic mapping会自动为不同的数据指定相应mapping,mapping中包含了字段的类型、搜索方式(exact value或者full text)、分词器等
查看mapping
Dynamic mapping<动态mappring>
插入的数据 动态生成的类型
①“Elasticsearch”=> text/keyword
②123456 => long ?为什么不是integer
③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会选择一个比较宽的数据类型。
搜索方式
1. exact value 精确匹配:在倒排索引过程中,分词器会将field作为一个整体创建到索引中。keyword
2. full text 全文检索:分词、近义词同义词、混淆词、大小写、词性、过滤、时态转换等
ES数据类型
1.数字类型:
a. long, integer, short, byte, double, float, half_float, scaled_float
b. 在满足需求的情况下,尽可能选择范围小的数据类型。
2.字符串 :keyword、text
a.keyword:适用于索引结构化的字段,可以用于过滤、排序、聚合。keyword类型的字段只能通过精确值(exact value)搜索到。Id应该用keyword
b.当一个字段是要被全文搜索的,比如Email内容、产品描述,这些字段应该使用text类型。text不会被倒排索引,会被分词。
c.在同一字段中同时具有全文本(text)和关键字(keyword)版本会很有用:一个用于全文本搜索,另一个用于聚合和排序。
3.时间类型:
a.date
b.exact value精确匹配
4.布尔类型 : boolean
5.二进制 : binary
6.range : integer_range、float_range、long_range、double_range、date_range
7.复杂类型 :
a.Object:用于单个JSON对象
b.Nested:用于JSON对象数组
8.地理位置:
a.Geo-point:纬度/经度积分
b.Geo-shape:用于多边形等复杂形状
9.特有类型:
a.IP地址:ip 用于IPv4和IPv6地址
b. Alias: 为现有字段定义别名
10.数组类型:
a.数组中的所有值都必须具有相同的数据类型
手工创建mapping
PUT /product3 #这是第一次创建,和创建索引一样
{
"mappings": {
"properties": {
"parameter_value2":{ #自己起的字段名称
"type": "text" #字段类型<ES数据类型>
}
}
}
}
#创建索引
PUT /product3
向mapping中添加字段
PUT /product3/_mapping
{
"properties":{
"parameter_value2":{
"type": "text"
}
}
}
查询所有mapping
Mapping parameters
1.index 是否对创建对当前字段创建索引,默认true,如果不创建索引,该字段不会通过索引被搜索到
2.analyzer:指定分析器(character filter、tokenizer、Token filters)
3.boost:对当前字段相关度的评分权重,默认1
4.coerce:是否允许强制类型转换 true false 插入数据不能转换了
5.copy_to:
a.别的字段查询的内容可以在该字段查询
b."field": {"type": "text","copy_to": "other_field_name"}
6.doc_values:为了提升排序和聚合效率,默认true,如果确定不需要对字段进行排序或聚合,也不需要通过脚本访问字段值,则可以禁用doc值以节省磁盘空间(不支持text和annotated_text)
7.dynamic:控制是否可以动态添加新字段 true false
8.eager_global_ordinals:用于聚合的字段上,优化聚合性能。
a.Frozen indices(冻结索引) 聚合使用少的时候配置,使数据不保存在内存中,防止占用内存
9.enable:是否创建倒排索引,可以对字段操作,也可以对索引操作。谨慎使用,该状态无法修改。
10.fielddata:默认关闭,正排索引做聚合索引的时候开启,开始数据保存在JVM内存中
11.fields:给field创建多字段,用于不同目的(全文检索或者聚合分析排序)
12.format:格式化
"date": {
"type": "date",
"format": "yyyy-MM-dd"
}
13.ignore_above:超过长度将被忽略
14.ignore_malformed:忽略类型错误 错误类型可以正常插入
15.null_value:为null值设置默认值
16.search_analyzer:设置单独的查询时分析器
聚合
#每个tag产品的数量 "size":0, 不显示原始结果
GET /product/_search
{
"aggs": {
"tag_agg_group": { #自己起的名字
"terms": {
"field": "tags.keyword"
}
}
},
"size":0
}
#将字段tags第一次查询出来的数据放进内存中
PUT /product/_mapping
{
"properties": {
"tags": {
"type": "text",
"fielddata": true #将字段tags第一次查询出来的数据放进内存中
}
}
}
#价格大于1999的每个tag产品的数量
GET /product/_search
{
"query": {
"bool": {
"filter": [
{
"range": {"price": {"gt": 1999}}
}
]
}
}, # 价格大于1999
"aggs": {
"tag_agg_group": {
"terms": {
"field": "tags.keyword"
}
}
}, #对字段tags进行分组
"size": 0 # "size":0, 不显示原始结果
}
结果:
"buckets" : [
{
"key" : "fashao",
"doc_count" : 2
},
{
"key" : "xingjiabi",
"doc_count" : 2
},
{
"key" : "gongjiaoka",
"doc_count" : 1
},
{
"key" : "menjinka",
"doc_count" : 1
}
]
#平均价格
GET /product/_search
{
"aggs": {
"tag_agg_avg": {
"terms": {
"field": "tags.keyword",
"order": {
"avg_price": "desc"
}
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
},
"size":0
}
#按照千元机 1000以下 中端机[2000-3000) 高端机 [3000,∞)
GET /product/_search
{
"aggs": {
"tag_agg_group": {
"range": {
"field": "price",
"ranges": [
{
"from": 100,
"to": 1000
},
{
"from": 1000,
"to": 3000
},
{
"from": 3000
}
]
},
"aggs": {
"price_agg": {
"avg": {
"field": "price"
}
}
}
}
},
"size": 0
}