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”: {
    1. "name": {
    2. "type": "text"
    3. },
    4. "address": {
    5. "type": "object",
    6. "dynamic": true
    7. }
    } } }

PUT /user/_doc/1 { “name”: “lisi”, “age”: “20”, “address”: { “province”: “beijing”, “city”: “beijing” } }

  1. <a name="Jk4uM"></a>
  2. #### 设置为true
  3. 可以动态映射
  4. ```yaml
  5. PUT /user
  6. {
  7. "settings": {
  8. "number_of_shards": 3,
  9. "number_of_replicas": 0
  10. },
  11. "mappings": {
  12. "dynamic": true,
  13. "properties": {
  14. "name": {
  15. "type": "text"
  16. },
  17. "address": {
  18. "type": "object",
  19. "dynamic": true
  20. }
  21. }
  22. }
  23. }

自定义动态映射

我们可以自定义规则,例如

日期检测

当 Elasticsearch 遇到一个新的字符串字段时,它会检测这个字段是否包含一个可识别的日期,比如
2014-01-01 如果它像日期,这个字段就会被作为 date 类型添加。否则,它会被作为 string 类型添加。
有些时候这个行为可能导致一些问题。
比如我们第一次 插入:
{"note":"2021-12-12"} ,那么ES会将其映射为日期格式;
再次插入 {"note":"nodata"},就会报错, 所以我们可以关闭日期检测

  1. PUT /my_index
  2. {
  3. "mappings": {
  4. "date_detection": false
  5. }
  6. }

此时要通过日期格式的检测可以使用:

  1. PUT /my_index
  2. {
  3. "mappings": {
  4. "dynamic_date_formats": "MM/dd/yyyy"
  5. }
  6. }

dynamic_templates

  1. # 1)匹配字段名以 _es 结尾的字段
  2. # 2)匹配其他所有字符串类型字段
  3. PUT /my_index2
  4. {
  5. "mappings": {
  6. "dynamic_templates": [
  7. {
  8. "es": {
  9. "match": "*_es",
  10. "match_mapping_type": "string",
  11. "mapping": {
  12. "type": "text",
  13. "analyzer": "spanish"
  14. }
  15. }
  16. },
  17. {
  18. "en": {
  19. "match": "*",
  20. "match_mapping_type": "string",
  21. "mapping": {
  22. "type": "text",
  23. "analyzer": "english"
  24. }
  25. }
  26. }
  27. ]
  28. }
  29. }
  30. #插入文档
  31. PUT /my_index2/_doc/1
  32. {
  33. "name_es": "testes",
  34. "name": "es"
  35. }