Mapping

Mapping 类似于数据库中的表结构定义 schema,它有以下几个作用:

  • 定义索引中的字段的名称
  • 定义字段的数据类型,比如字符串、数字、布尔

在 ES 早期版本,一个索引下是可以有多个 Type 的,从 7.0 开始,一个索引只有一个 Type,也可以说一个 Type 有一个 Mapping 定义。

可以对比数据库中的Schema字义来理解Mapping:

image-20220709191406571


Dynamic Mapping与Explict 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 编码的字符串,默认不存储,且不可搜索

Keyword数据类型

在 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"
             }
        }
    }
}
'

例如邮箱的使用场景:

image-20220709192451292

keyword字段在分析时,使用的是keyword analyzer,而不是standard analyzer。这个keyword analyzer其实背后什么事都不用干,因为我们就是需要原始的字符串。
keyword analyzer的输出直接放到倒排索引