ElasticSearch覆盖从文本到对象的映射

时间:2018-10-01 08:03:36

标签: elasticsearch

我正在尝试覆盖字段的映射。

有一个默认的索引模板(我无法更改),我正在用自定义模板覆盖它。

默认索引具有“消息”字段作为文本的映射,但是我需要使其像对象一样对待,并使其字段可索引/可搜索。

这是默认的索引模板,顺序为10。

{
  "mappings": {
    "_default_": {
      "dynamic_templates": [
        {
          "message_field": {
            "mapping": {
              "index": true,
              "norms": false,
              "type": "text"
            },
            "match": "message",
            "match_mapping_type": "string"
          }
        },
        ...
      ],
      "properties": {
        "message": {
          "doc_values": false,
          "index": true,
          "norms": false,
          "type": "text"
        },
        ...
      }
    }
  },
  "order": 10,
  "template": "project.*"
}

这是我的替代:

{
  "template" : "project.*",
  "order" : 100,
  "dynamic_templates": [
    {
      "message_field": {
        "mapping": {
          "type": "object"
        },
        "match": "message"
      }
    }
  ],
  "mappings": {
    "message": {
      "enabled": true,
      "properties": {
        "tag": {"type": "string", "index": "not_analyzed"},
        "requestId": {"type": "integer"},
        ...
      }
    }
  }
}

这很好用,但是我最终在“ message”对象中定义了所有字段(tag,requestId,...)。

有没有办法使“消息”对象中的所有字段都可索引/可搜索?

这是示例文档:

{
  "level": "30",
  ...
  "kubernetes": {
    "container_name": "data-sync-server",
    "namespace_name": "alitest03",
    ...
  },
  "message": {
    "tag": "AUDIT",
    "requestId": 1234,
    ...
    },
  }
  ...
}

尝试了很多东西,但我无法使其正常工作。

我正在使用ElasticSearch 2.4.4版。

1 个答案:

答案 0 :(得分:0)

您可以在动态映射中使用path_match属性:

类似:

{
  "template": "project.*",
  "order": 100,
  "mappings": {
    "<your document type here>": {
      "dynamic_templates": [
        {
          "message_field": {
            "mapping": {
              "type": "object"
            },
            "match": "message"
          }
        },
        {
          "message_properties": {
            "path_match": "message.*",
            "mapping": {
              "type": "string",
              "index": "not_analyzed"
            }
          }
        }
      ]
    }
  }
}

但是您可能需要用match_mapping_type来区分字符串/数字