dyanmic 属性
当es遇到从来没有的字段,可以使用 dynamic mapping(动态映射机制),将新字段添加到类型映射,可以通过设置 mappings的dynamic属性,
- true:陌生字段就执行 dynamic mapping
- false: 遇到陌生字段就忽略
- strict: 遇到陌生字段就报错
```yaml
设置为报错
PUT /user { “settings”: { “number_of_shards”: 3, “number_of_replicas”: 0 }, “mappings”: { “dynamic”: “strict”, “properties”: {
} } }"name": {
"type": "text"
},
"address": {
"type": "object",
"dynamic": true
}
PUT /user/_doc/1 { “name”: “lisi”, “age”: “20”, “address”: { “province”: “beijing”, “city”: “beijing” } }
<a name="Jk4uM"></a>
#### 设置为true
可以动态映射
```yaml
PUT /user
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 0
},
"mappings": {
"dynamic": true,
"properties": {
"name": {
"type": "text"
},
"address": {
"type": "object",
"dynamic": true
}
}
}
}
自定义动态映射
日期检测
当 Elasticsearch 遇到一个新的字符串字段时,它会检测这个字段是否包含一个可识别的日期,比如
2014-01-01 如果它像日期,这个字段就会被作为 date 类型添加。否则,它会被作为 string 类型添加。
有些时候这个行为可能导致一些问题。
比如我们第一次 插入:{"note":"2021-12-12"}
,那么ES会将其映射为日期格式;
再次插入 {"note":"nodata"}
,就会报错, 所以我们可以关闭日期检测
PUT /my_index
{
"mappings": {
"date_detection": false
}
}
此时要通过日期格式的检测可以使用:
PUT /my_index
{
"mappings": {
"dynamic_date_formats": "MM/dd/yyyy"
}
}
dynamic_templates
# 1)匹配字段名以 _es 结尾的字段
# 2)匹配其他所有字符串类型字段
PUT /my_index2
{
"mappings": {
"dynamic_templates": [
{
"es": {
"match": "*_es",
"match_mapping_type": "string",
"mapping": {
"type": "text",
"analyzer": "spanish"
}
}
},
{
"en": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"type": "text",
"analyzer": "english"
}
}
}
]
}
}
#插入文档
PUT /my_index2/_doc/1
{
"name_es": "testes",
"name": "es"
}