Mapping中的字段一旦设定后,禁止直接修改。因为倒排索引生成后不允许直接修改。需要重新建立新的索引,做reindex操作。
创建索引但不设置mapping的情况下put数据进索引,es会帮我们自动创建mapping
未设置mapping的情况下写入文档并查看mapping:
PUT mapping_test/_doc/1
{
"firstName":"Chan",
"lastName": "Jackie",
"loginDate":"2018-07-24T10:29:48.103Z"
}
GET mapping_test/_mapping
返回的mapping结果:
{
"mapping_test" : {
"mappings" : {
"_doc" : {
"properties" : {
"firstName" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"lastName" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"loginDate" : {
"type" : "date"
}
}
}
}
}
}
ES自动创建mapping的映射关系如下:
能否更改mapping的字段类型,分为两种情况:
新增字段:
dynamic设为true时,一旦有新增的document写入,mapping也同时被更新
dynamic设为false,mapping不会被更新,新增字段的数据无法被索引,但是信息会出现在_source中
dynamic设为strict时,文档写入失败
已有字段:
一旦已经有数据写入,就不再支持修改字段定义:Lucene实现的倒排索引,一旦生成后,就不允许修改,如果希望修改字段的类型,必须Reindex,重建索引。
原因:1. 如果修改字段的数据类型,会导致已被索引的属于无法被搜索
2. 如果是增加新的字段,就不会有这样的影响
索引的dynamic参数设置不同,将有不同的影响:
显示设置索引的mapping语法如下:
PUT /my_index002
{
"mappings": {
"_doc" : {
"properties" : {
"dec" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256,
"index": true, //默认值是true
"index_options": "offsets",
"null_value": "NULL"
}
}
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
},
"fielddata" : true
},
"price" : {
"type" : "long"
},
"producer" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
},
"fielddata" : true
},
"tags" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
},
"fielddata" : true
}
}
}
}
}
其中字段下的index属性控制当前字段是否被索引。默认为true,如果设置成false,该字段不可被搜索。
四种不同级别的Index Options配置,可以控制倒排索引记录的内容:
Text类型默认记录positions,其他默认为docs
记录内容越多,占用存储空间越大
如何实现对NULL也支持搜索?
只需要在创建mapping时将需要支持null搜索的字段的null_value属性设置为"NULL",上面的语法可见。