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可以动态映射```yamlPUT /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"}
