ElasticSearch:映射必需(非动态)字段但有一个 属性 ("meta data") 动态

ElasticSearch: map required (non-dynamic) fields but have one property ("meta data") dynamic

我想创建一个索引来保存一些代表文章的内容。

一篇文章由titleexcerptbodypublish_datemeta组成。所有这些都是必需的,除了 Meta。我不希望设置其他属性。

此外,我希望“meta”能够保存放入其中的任何数据。

我尝试将文章的动态参数设置为 false,然后将元对象设置为 true,但没有成功。 (例子可以在下面看到)

(注意:我知道使用这样的元意味着数组的所有值都将是相同的数据类型,我对此没有意见。)

{
    "mappings": {
        "article": {
            "type":"object",
            "dynamic" : "false",
            "properties": {
                "title":          {"type": "string"},
                "excerpt":        {"type": "string"},
                "body":           {"type": "string"},
                "publish_date":   {"type": "date"},
                "meta": {
                    "type":       "object"
                    "dynamic" :   "true",
                    "properties": {
                    }
                }
            }
        }
    }
}

TL:DR - 如何定义一个映射,使某些属性成为必需,但留下一个 属性(元 array/object)打开以供填充,同时防止任何不需要在元对象之外设置的 属性。

事实证明这是一个简单的错误,导致功能无法正常触发。

使用下面的 JSON,在初始文章映射上将动态 属性 设置为严格,并将 "meta-stash" 动态 属性 设置为 true,实际上确实给出了所需的功能。

原来使用 false,而不是 strict,也禁止抛出异常,导致最初的混乱。

因此,正如文档中所述,

  • true:动态添加新字段——默认
  • false: 忽略新字段
  • strict: 遇到未知字段抛出异常

正确映射:

{
    "mappings": {
        "article": {
            "type":"object",
            "dynamic" : "strict",
            "properties": {
                "title":          {"type": "string"},
                "excerpt":        {"type": "string"},
                "body":           {"type": "string"},
                "publish_date":   {"type": "date"},
                "meta": {
                    "type":       "object"
                    "dynamic" :   "true",
                }
            }
        }
    }
}