【问题标题】:Dynamic templates support default types?动态模板支持默认类型?
【发布时间】:2020-09-19 11:39:00
【问题描述】:

Dynamic templates 允许您定义可应用于动态添加的字段的自定义映射:

  • Elasticsearch 检测到的数据类型,带有 match_mapping_type。
  • 字段的名称,包括 match 和 unmatch 或 match_pattern。
  • 字段的完整虚线路径,包含 path_match 和 path_unmatch。

我试图为所有字段设置默认类型 keyword,而某些具有特定 *Suffixprefix* 的特殊字段可以指定如下类型,但事实证明所有字段都将是 keyword意外结束。

{
  "order": 99,
  "index_patterns": [
    "xxxx_stats_*"
  ],
  "settings": {
    "index": {
      "number_of_shards": "6",
      "number_of_replicas": "1"
    }
  },
  "mappings": {
    "_doc": {
      "dynamic": true,
      "_source": {
        "enabled": true
      },
      "dynamic_templates": [
        {
          "strings": {
            "match_mapping_type": "*",
            "unmatch": [
              "*Time",
              "*At",
              "is*"
            ],
            "mapping": {
              "ignore_above": 256,
              "null_value": "NULL",
              "type": "keyword"
            }
          }
        },
        {
          "timeSuffix": {
            "match_mapping_type": "*",
            "match": [
              "*Time",
              "*At"
            ],
            "mapping": {
              "type": "long"
            }
          }
        },
        {
          "isPrefix": {
            "match_mapping_type": "*",
            "match": "is*",
            "mapping": {
              "type": "boolean"
            }
          }
        }
      ],
      "date_detection": false,
      "numeric_detection": true
    }
  },
  "aliases": {
    "{index}-alias": {
      
    }
  }
}

【问题讨论】:

    标签: elasticsearch mapping


    【解决方案1】:

    AFAIK matchunmatch 不能是数组,只能是字符串或正则表达式。所以试试这个:

    {
      "dynamic_templates":[
        {
          "timeSuffix":{
            "match_mapping_type":"*",
            "match_pattern":"regex",
            "match":"^(.*Time)|(.*At)$",
            "mapping":{
              "type":"long"
            }
          }
        },
        {
          "isPrefix":{
            "match_mapping_type":"*",
            "match":"is*",
            "mapping":{
              "type":"boolean"
            }
          }
        },
        {
          "strings":{
            "match_mapping_type":"*",
            "mapping":{
              "ignore_above":256,
              "null_value":"NULL",
              "type":"keyword"
            }
          }
        }
      ]
    }
    

    我还发现,当你把strings移到底部时,上面的2个映射会先被解析。否则,由于每个段都包含match_mapping_type":"*",因此将应用第一个匹配段。这个issue 可能是相关的。

    【讨论】:

    • 仅供参考,我建议将类似日期的字段映射到 date 类型,不要太长。
    • 点赞! Joe 感谢您的帮助,了解regex 的工作方式非常有帮助。至于date,它无处不在,我必须使用timestamp 来遵循例程;(无论如何感谢您的额外建议。
    • 好的,没问题!您当然可以在日期中使用时间戳:elastic.co/guide/en/elasticsearch/reference/current/…
    猜你喜欢
    • 2019-09-02
    • 2016-10-06
    • 2019-09-29
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    相关资源
    最近更新 更多