1.前述

在《动态映射》章节,我们知道,ES默认有一套映射规则,如果我们不想完全按照这套映射规则映射字段类型,也不想每个字段都自己指定。那么,可以使用动态模版(Dynamic template)

2.组成

定义动态模板,主要有以下部分组成:

  1. "dynamic_templates": [
  2. {
  3. "my_template_name": {
  4. ... match conditions ...
  5. "mapping": { ... }
  6. }
  7. },
  8. ...
  9. ]

模板名称:my_template_name
匹配规则:包括match_mapping_type, match, match_pattern, unmatch, path_match, path_unmatch.
目标映射:mapping,对于满足匹配规则的字段应用此映射

注意:动态模板按顺序处理,第一个匹配的模板将被应用。通过 put mapping API设置新的动态模板时,将覆盖所有现有模板。

3. 匹配规则

3.1 match_mapping_type

match_mapping_type是json解析器检测到的数据类型。由于JSON解析器不区分long与integer,或double与float,它总是选择更宽的数据类型,即long表示integer,double表示float。
ES默认支持以下自动映射:

JSON输入 映射结果
true、false boolean
启用日期检测并找到与配置的日期格式相匹配的字符串时 date
有小数部分的数字 double
没有小数部分的数字 long
JSON对象 object
字符串 string

例如,如果要将所有integer类型字段映射为integer 而不是long,将所有string类型字段映射为text和keyword,则可以使用以下模板:

定义模板

  1. PUT dynamic_templates_index
  2. {
  3. "mappings": {
  4. "_doc": {
  5. "dynamic_templates": [
  6. {
  7. "integers": {
  8. "match_mapping_type": "long",
  9. "mapping": {
  10. "type": "integer"
  11. }
  12. }
  13. },
  14. {
  15. "strings": {
  16. "match_mapping_type": "string",
  17. "mapping": {
  18. "type": "text",
  19. "fields": {
  20. "raw": {
  21. "type": "keyword",
  22. "ignore_above": 256
  23. }
  24. }
  25. }
  26. }
  27. }
  28. ]
  29. }
  30. }
  31. }

插入文档

  1. PUT dynamic_templates_index/_doc/1
  2. {
  3. "my_integer": 210000236,
  4. "my_string": "Some string"
  5. }

查询结果

image.png

3.2 matchunmatch

match参数使用模式匹配字段名,而unmatch使用模式排除match匹配的字段。
以下示例匹配以long_开头的所有字符串字段(排除以_text结尾的字符串字段),并将其映射为long字段:

定义模板

  1. PUT match_index
  2. {
  3. "mappings": {
  4. "_doc": {
  5. "dynamic_templates": [
  6. {
  7. "longs_as_strings": {
  8. "match_mapping_type": "string",
  9. "match": "long_*",
  10. "unmatch": "*_text",
  11. "mapping": {
  12. "type": "long"
  13. }
  14. }
  15. }
  16. ]
  17. }
  18. }
  19. }

插入文档:

  1. PUT match_index/_doc/1
  2. {
  3. "long_num": "5",
  4. "long_text": "foo"
  5. }

查询结果

image.png

3.3 match_pattern

匹配规则还支持java正则表达式,诸如:

  1. "match_pattern": "regex",
  2. "match": "^profit_\d+$"

3.4 path_match 和 path_unmatch

定义模板

将对象name中的所有字段,排除名称为middle字段映射为text数据类型,并将其复制到full_name对象中:

  1. PUT path_match_index
  2. {
  3. "mappings": {
  4. "_doc": {
  5. "dynamic_templates": [
  6. {
  7. "full_name": {
  8. "path_match": "name.*",
  9. "path_unmatch": "*.middle",
  10. "mapping": {
  11. "type": "text",
  12. "copy_to": "full_name"
  13. }
  14. }
  15. }
  16. ]
  17. }
  18. }
  19. }

插入文档

  1. GET path_match_index/_mapping

查询结果

image.png