【问题标题】:How to write an Elasticsearch mapping with dynamic type name如何使用动态类型名称编写 Elasticsearch 映射
【发布时间】:2017-07-10 17:13:53
【问题描述】:

我有一个称为测试执行的概念实体,每个测试执行都应该是 Elasticsearch 索引中的一个单独的类型。每个测试执行类型的映射应该相同,并且会动态添加到索引中。

我已经为单个测试执行创建了一个映射,如下所示,我希望将其推广到将来将创建的所有类型

PUT /test_tool/_mapping/test_execution_20151710_1324_12
{
    "properties": {
        "timestamp":{
            "type": "string",
            "index": "not_analyzed"
        },
        "source":{
            "type": "string",
            "index": "not_analyzed"
        },
            "payload":{
            "type": "string",
            "index": "not_analyzed"
        }
    }
}

我应该如何为动态类型创建一个通用映射,例如:为类型“test_execution_*”创建一个通配符。

[更新]

看了下面的答案后,我考虑过不要对不同的执行使用单独的类型,并希望在同一个测试执行中使用单独的键来识别文档。

PUT /test_tool/_mapping/executions
{
    "properties": {
        "timestamp":{
            "type": "string",
            "index": "not_analyzed"
        },
        "source":{
            "type": "string",
            "index": "not_analyzed"
        },
            "payload":{
            "type": "string",
            "index": "not_analyzed"
        },
            "test_execution":{
            "type": "string",
            "index": "not_analyzed"
        }
    }
}

【问题讨论】:

    标签: elasticsearch elasticsearch-5


    【解决方案1】:

    你需要的是使用模板,from official docs

       PUT _template/template_1
    {
      "template": "test_too*",
      "settings": {
        "number_of_shards": 1
      },
      "mappings": {
        "type1": {
          "_source": {
            "enabled": false
          },
          "properties": {
            "host_name": {
              "type": "keyword"
            },
            "created_at": {
              "type": "date",
              "format": "EEE MMM dd HH:mm:ss Z YYYY"
            }
          }
        }
      }
    }
    

    定义一个名为 template_1 的模板,模板模式为 te*。设置和映射将应用于与 te* 模式匹配的任何索引名称。

    所以在你的情况下,你会想要使用类似的东西:"template": "test_to*"

    【讨论】:

    • 在您的示例中,索引有通配符,我想要的是动态 type
    • 当你的意思是类型是文档类型对吗?所以这就是发生的情况,每当您创建一个新类型,其索引称为任何以 test_execution_ 开头的东西,模板中使用的映射将被自动应用。如果这不是您要查找的内容,请编辑您的问题以使您想要的内容更清楚。
    • 对不起,如果我误解了,如果我错了,请纠正我。就我而言,我有一个名为“test_tool”的不变索引,它应该包含具有“test_execution_*”模式的类型。这是你的意思吗?
    • 哦.. 好吧,我的错我错过了.. 所以在你的情况下,你只需要创建像'test_*'这样的模板,你在该索引下创建的任何类型他们都会有模板映射自动应用于它们,但方法是相同的。
    • 据我了解,您所说的是我放入创建的索引中的任何 type 都会具有给定的映射。如果这是真的,type 名称是如何硬编码为 'type1'
    【解决方案2】:

    我不确定每次执行都有自己的类型是否是个好主意(我会避免这样做),因为这会破坏您的映射。

    您可以在索引模板中使用_default_ 类型来实现这一点,请参阅the docs

    但是类型将在 Elasticsearch 的下一个版本中消失,所以也许您想重新考虑该策略。

    【讨论】:

      猜你喜欢
      • 2016-08-27
      • 2018-06-15
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 2019-04-09
      • 2017-12-23
      相关资源
      最近更新 更多