Elasticsearch之Mapping
什么是Mapping
Mapping是类似于数据库中的表结构定义,主要作用如下:
定义索引中的字段名
定义字段类型,比如数值型、浮点型、布尔型等
定义倒排索引相关的设置,比如是否索引、记录position等
Mapping会把Json文档映射成Lucene所需要的扁平格式
一个Mapping属于一个索引的Type
每个文档都属于一个Type
一个Type有一个Mapping的定义
7.0开始,不需要在Mapping定义中指定Type信息
字段的数据类型
简单类型
Text,keyword,date,long,double,Boolean,ip
支持json层次的数据类型
object,nested
特殊类型
geo_point&geo_shape/completion
什么是Dynamic Mapping
在写入文档时,如果索引不存在,会自动创建索引
Dynamic Mapping的机制,使得我们无需手动定义Mappings。Elasticsearch会自动根据文档信息推算出字段类型,但是有时候推算的不对。
当类型不对时,会导致一些功能无法正常使用
能否更改Mapping的字段类型
两种情况
新增加字段
Dynamic设为true时,一但有新增字段的文档写入,Mapping也同时被更新
Dynamic设为false时,Mapping不会被更新,新增字段的数据无法被索引,但是信息会出现在_source中
Dynamic设置为Strict,文档写入失败
PUT dynamic_mapping_test/_doc/1
{
"newfiled":"sonevalue"
}
PUT dynamic_mapping_test/_doc/10
{
"newfiled":"sonevalue",
"truefiled":"somevalue"
}
GET dynamic_mapping_test/_search
{
"query":{
"match":{
"truefiled":"somevalue"
}
}
}
PUT dynamic_mapping_test/_mapping
{
"dynamic":false
}
PUT dynamic_mapping_test/_doc/10
{
"newfiled":"sonevalue",
"abotherfiled":"somevalue"
}
GET dynamic_mapping_test/_search
{
"query":{
"match":{
"abotherfiled":"somevalue"
}
}
}
PUT dynamic_mapping_test/_mapping
{
"dynamic":"strict"
}
PUT dynamic_mapping_test/_doc/12
{
"lastfiled":"somevalue"
}