ElasticSearch中的映射(Mapping)用来定义一个文档,可以定义所包含的字段以及字段的类型、分词器及属性等等。
一、什么是mapping
类似于数据库中的表结构定义,主要作用如下:
- 定义Index下字段名(Field Name)
- 定义字段的类型,比如数值型,字符串型、布尔型等
- 定义倒排索引的相关配置,比如是否索引、记录postion等
Elasticsearch 支持
如下简单域类型:
- 字符串:
用于全文索引,该类型的字段将通过分词器进行分词,最终用于构建索引keyword:
不分词,只能搜索该字段的完整的值,只用于 filteringtext:
- 整数 :
byte
,short
,integer
,long
- 浮点数:
float
,double
- 布尔型:
boolean
- 日期:
date
映射可以分为动态映射和静态映射。
1、动态映射
在关系数据库中,需要事先创建数据库,然后在该数据库实例下创建数据表,然后才能在该数据表中插入数据。而ElasticSearch中不需要事先定义映射(Mapping),文档写入ElasticSearch时,会根据文档字段自动识别类型,这种机制称之为动态映射。
JSON数据 | 自动推测的类型 |
---|---|
null | 没有字段被添加 |
true或false | boolean型 |
小数 | float型 |
数字 | long型 |
日期 | date或text |
字符串 | text |
数组 | 由数组第一个非空值决定 |
JSON对象 | object类型 |
2、静态映射
当然,在ElasticSearch中也可以事先定义好映射,包含文档的各个字段及其类型等,这种方式称之为静态映射。
相对于动态映射,静态映射可以添加更加详细字段类型、更精准的配置信息等
index
属性控制:
- analyzed 首先分析字符串,然后索引它。换句话说,以全文索引这个域。
- not_analyzed 索引这个域,所以它能够被搜索,但索引的是精确值。不会对它进行分析。
- no 不索引这个域。这个域不会被搜索到。
Elasticsearch 6.x Mapping设置_小旋锋的博客-CSDN博客
elasticsearch篇之mapping_lyzkks的博客-CSDN博客_elasticsearch mapping
二、剖析mapping
- 一个mapping由一个或多个analyzer组成, 一个analyzer又由一个或多个filter组成的。当ES索引文档的时候,它把字段中的内容传递给相应的analyzer,analyzer再传递给各自的filters。
- filter的功能很容易理解:一个filter就是一个转换数据的方法, 输入一个字符串,这个方法返回另一个字符串,比如一个将字符串转为小写的方法就是一个filter很好的例子。
- 一个analyzer由一组顺序排列的filter组成,执行分析的过程就是按顺序一个filter一个filter依次调用, ES存储和索引最后得到的结果。
总结来说, mapping的作用就是执行一系列的指令将输入的数据转成可搜索的索引项。
三、mapping相关
//创建mapping
curl -u $user:$password -H "Content-Type:application/json" -XPUT "http://$ip:$port/$index/_mapping/_doc?pretty" -d '{
"properties":{
"properties":{
"id":{
"type":"long"
},
"task_type":{
"type":"keyword"
},
"task_info":{
"type":"text",
"analyzer":"ik_max_word"
},
"t_score":{
"type":"double"
},
"create_time":{
"type":"date",
"format":"yyyy-MM-dd HH:mm:ss"
},
"tag":{
"type":"text",
"analyzer":"comma"
},
"department_tag":{
"type":"integer"
}
}
}
}'
//查看mapping
curl -u $user:$password -H "Content-Type:application/json" -XGET "http://$ip:$port/$index/_mapping?pretty"
四、analyze分析器
1、默认分析器
ES猜测description字段是string类型,于是默认创建一个string类型的mapping。默认的analyzer有三个filter:token filter, lowercase filter和stop token filter。
curl -X GET "http://$ip:port/$index/_analyze?analyzer=standard&pretty=true" -d "A Pretty cool guy."
{
"tokens" : [{
"token" : "pretty",
"start_offset" : 2,
"end_offset" : 8,
"type" : "<ALPHANUM>",
"position" : 2
}, {
"token" : "cool",
"start_offset" : 9,
"end_offset" : 13,
"type" : "<ALPHANUM>",
"position" : 3
}, {
"token" : "guy",
"start_offset" : 14,
"end_offset" : 17,
"type" : "<ALPHANUM>",
"position" : 4
}]
我们的description字段的值转换成了[pretty], [cool], [guy], 在转换过程中大写的A, 标点符号都被filter过滤掉了, Pretty也转成了全小写的pretty, 这里比较重要的是, 即使ES存储数据的时候仍然存储的是完整的数据, 但是可以搜索到这条数据的关键字只剩下这三个单词了, 其他的都是抛弃掉了。
2、IK分析器
-
ik-smart
-
ik-max-word