1. Mapping
1.2 Mapping是什么
ElasticSearch中的Mapping,就是用来定义一个索引的结构的。 (类似于我们在mysql中创建表的时候,定义表的字段名、字段类型、字段约束等信息。)
1.3 Mapping的作用
定义一个索引中,每一个字段的类型、默认值、分词器、是否被索引等。
1.4 字段的类型
类型 | 说明 |
text | 字段将通过分词器进行分词,构建倒排索引 |
double + long
1.5 字符串类型
在
text类型适用于需要被全文检索的字段,例如新闻正文、邮件内容等比较长的文字,text 类型会被 Lucene 分词器(Analyzer)处理为一个个词项,并使用 Lucene 倒排索引存储,text 字段不能被用于排序和聚合,如果需要使用该类型的字段只需要在定义映射时指定 JSON 中对应字段的 type 为 text。
keyword:不会被分词,适合简短、结构化字符串,例如主机名、姓名、商品名称等,可以用于过滤、排序、聚合检索,也可以用于精确查询。
1.6 数字类型
数字类型分为 long、integer、short、byte、double、float、half_float。数字类型的字段在满足需求的前提下应当尽量选择范围较小的数据类型,字段长度越短,搜索效率越高。
1.7 自动类型识别
我们已经知道,当我们直接向一个不存在的索引中,索引一个文档时,该索引会被自动创建。另外,我们还需要知道,这个被自动创建的索引,会对文档中的字段做自动类型识别。
自动类型推断demo:
PUT foo/_doc/1
{
"id": 1009,
王心凌",
"birthday": "1992-10-21",
"balance": 5000.5
}
查看foo索引的定义信息:
GET foo
类型自动推断,完整规则如下:
类型 | 规则 |
字符串 | 内容若匹配日期格式,则自动推断为 date 内容为数字,则还是会自动推断为字符串其余情况,则自动推断为Text,并且会增加keyword的子字段 |
1.8 添加新的字段
PUT foo/_mapping
{
"properties": {
"hobby": {
"type": "keyword"
}
}
}
1.9 已存在的字段
针对于已存在的字段,不支持修改字段的操作。如下:
如果非要更改字段类型不可呢?那就必须使用Reindex api,即:重建索引。
也就是自己创建一个新的索引,在新的索引中,自己指定你想要的类型,然后把老索引中的数据,迁移到新索引中去。
创建一个新索引
PUT /bar
{
"mappings": {
"properties": {
"id": {
"type": "long"
},
"name": {
"type": "keyword"
},
"birthday": {
"type": "date"
},
"hobby": {
"type": "text"
}
}
}
}
foo索引中的数据,迁移到bar索引中
POST _reindex
{
"source": {
"index": "foo"
},
"dest": {
"index": "bar"
}
}
从bar索引中,查询1文档
GET bar/_doc/1
注意,在数据量多的时候,reindex操作开销将非常大!