Mapping 类似于数据库中的表结构定义 schema
,它有以下几个作用:
在 ES 早期版本,一个索引下是可以有多个 Type 的,从 7.0 开始,一个索引只有一个 Type,也可以说一个 Type 有一个 Mapping 定义。
可以对比数据库中的Schema字义来理解Mapping:
Explict Mapping
就是像MySQL一样在创建表的时候对各个字段的属性进行设置。
Dynamic Mapping
机制使我们不需要手动定义 Mapping,ES 会自动根据文档信息来判断字段合适的类型,但是有时候也会推算的不对,比如地理位置信息有可能会判断为 Text
,当类型如果设置不对时,会导致一些功能无法正常工作,比如 Range 查询。
Elasticsearch中每个field都要精确对应一个数据类型。数据类型有以下几种:
属性名字 | 说明 |
---|---|
text | 用于全文索引,该类型的字段将通过分词器进行分词,最终用于构建索引 |
keyword | 不分词,适合简短、结构化字符串,例如主机名、姓名、商品名称等,可以用于过滤、排序、聚合检索,也可以用于精确查询。 |
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 浮点数 |
boolean | true,false |
date | 格式化的日期字符串,例如 2020-03-17 00:00、2020/03/17时间戳(和 1970-01-01 00:00:00 UTC 的差值),单位毫秒或者秒即使是格式化的日期字符串,ES 底层依然采用的是时间戳的形式存储。 |
binary | 该类型的字段把值当做经过 base64 编码的字符串,默认不存储,且不可搜索 |
在 ES2.x 版本字符串数据是没有 keyword 和 text 类型的,只有string类型。ES更新到5版本后,取消了 string 数据类型,代替它的是 keyword 和 text 数据类型。
Text 数据类型被用来索引长文本,比如说电子邮件的主体部分或者一款产品的介绍。这些文本会被分析,在建立索引前会将这些文本进行分词,转化为词的组合,建立索引。允许 ES来检索这些词语。text 数据类型不能用来排序和聚合。
使用方式:
curl -XPUT 'localhost:9200/employees/' -d '
{
"mappings":{
"employee":{
"properties": {
"intro":"text"
}
}
}
}
'
Keyword 数据类型用来建立电子邮箱地址、姓名、邮政编码和标签等数据,不需要进行分词。可以被用来检索过滤、排序和聚合。keyword 类型字段只能用本身来进行检索。
使用方式:
curl -XPUT 'localhost:9200/employees/' -d '
{
"mappings":{
"employee":{
"properties": {
"name":"keyword"
}
}
}
}
'
例如邮箱的使用场景:
keyword字段在分析时,使用的是keyword analyzer
,而不是standard analyzer
。这个keyword analyzer
其实背后什么事都不用干,因为我们就是需要原始的字符串。keyword analyzer
的输出直接放到倒排索引