Mapping
- Mapping 类似于 MySQL 中 Schema 的定义,作用如下:
- 定义索引中字段的名称;
- 定义索引中字段的类型;
- 设置字段 -> 倒排索引的相关配置;
- Mapping 会把 JSON 文档映射成 Lucene 所需要的扁平格式;
字段的数据类型
简单类型
- Text / Keyword
- Date
- Integer / Floating
- Boolean
- IPv4 & IPv6
复杂类型
特殊类型
- geo_point
- geo_shape / percolator
Dynamic Mapping
- 在写入文档的时候 ,如果索引不存在,索引会被自动创建;
- Dynamic Mapping 的机制,使得无需手动定义 Mappings;
- ElasticSearch 会自动根据文档信息,推算出字段的类型;
- 但有时推算的会不对,例如地理位置信息;
- 如果类型的推算不对,会导致一些功能无法使用,比如 Range 查询;
Dynamic Mapping | 操作示例
向不存在的索引新增文档
- ElasticSearch 完成 Dynamic Mapping,推断字段的类型;
PUT mapping_test/_doc/1
{
"uid" : "123",
"isVip" : false,
"isAdmin": "true",
"age":19,
"heigh":180
}
查看 Dynamic Mapping 的结果
GET mapping_test/_mapping
{
"mapping_test" : {
"mappings" : {
"properties" : {
"age" : {
"type" : "long"
},
"heigh" : {
"type" : "long"
},
"isAdmin" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"isVip" : {
"type" : "boolean"
},
"uid" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
插入包含新字段的文档
- 索引的 Mapping 的 dynamic 默认值是 true,意味着,新文档可以索引(存储)到 ElasticSearch 中,新字段可以被索引(搜索),索引的 Mapping 会更新;
PUT dynamic_mapping_test/_doc/1
{
"newField":"someValue"
}
搜索新插入的文档
- 新插入的文档的新字段可以被搜索到,新字段也出现在 _source 中;
POST dynamic_mapping_test/_search
{
"query":{
"match":{
"newField":"someValue"
}
}
}
修改索引的 Mapping 的 dynamic 为 false
- 意味着:新增的包含新字段的文档会出现在 _source 中,但是无法被搜索到,Mapping 也不会更新;
PUT dynamic_mapping_test/_mapping
{
"dynamic": false
}
新增包含新字段的文档
- 该字段不会被搜索到,mapping 也不会更新,因为 dynamic 被设置成了 false;
#新增 anotherField
PUT dynamic_mapping_test/_doc/10
{
"anotherField":"someValue"
}
但是查询这个文档
get dynamic_mapping_test/_doc/10
修改 dynamic 为 strict
- 意味着包含新字段的文档无法写入 ElasticSearch;
PUT dynamic_mapping_test/_mapping
{
"dynamic": "strict"
}
尝试写入包含新字段的文档
PUT dynamic_mapping_test/_doc/12
{
"lastField":"value"
}