【问题标题】:Elasticsearch dynamic template: don’t want field to be analyzed, only want a keyword subfieldElasticsearch动态模板:不想字段被分析,只想要一个关键字子字段
【发布时间】:2018-02-27 14:04:42
【问题描述】:

我们使用动态模板来指定索引中某些字段的映射。大多数文本字段在模板中没有提及,并获取到分析字段和关键字子字段的默认映射:

                      "someField" : {
                        "type" : "text",
                        "fields" : {
                          "keyword" : {
                            "type" : "keyword"
                          }
                        }
                      }

这很好。

索引中有一些我们不想分析的字段,只是做了关键字。但是,为了保持一致性,我们希望所有关键字字段都是名为“关键字”的子字段,如上所示。所以这个:

"dynamic_templates" : [

  {
    "someField" : {
      "match" : "someField",
      "mapping" : {
        "type" : "keyword",
        "norms" : false
      }
    }
  },

不合适,因为它使“someField”本身成为关键字,而我们希望“someField.keyword”成为关键字字段。但是如果我使用这个模板:

"dynamic_templates" : [

  {
    "someField" : {
      "match" : "someField",
      "mapping" : {
        "fields": {
          "keyword": {
            "type": "keyword",
            "norms" : false
          }
        }
      }
    }
  },

创建分析的“顶级”字段以及关键字子字段:

                          "someField" : {
                            "type" : "text",
                            "fields" : {
                              "keyword" : {
                                "type" : "keyword"
                              }
                            }
                          },

有没有办法不映射“someField”字段,只映射“someField.keyword”?我可以为“someField”级别设置 index : false ,但用户可能仍会尝试使用它,并想知道为什么它不起作用。

编辑:我尝试将 someField 定义为对象类型,正如haltabush 所建议的那样,但出现错误。使用此模板:

{
  "template": "test*",
  "order":    1,

    "mappings" : {
      "_default_" : {

        "dynamic_templates" : [
          {
            "someField" : {
              "match" : "someField",
              "mapping" : {
                "type" : "object",
                "fields": {
                  "keyword": {
                    "type": "keyword"
                  }
                }
              }
            }
          }
        ]
      }
    }
}

当我发布此文档时:

curl -XPUT localhost:9200/test-1/doc/1?pretty -d '
{
  "someField" : "some value"
}
'

我收到此错误:

{
  "error" : {
    "root_cause" : [
      {
        "type" : "mapper_parsing_exception",
        "reason" : "object mapping for [someField] tried to parse field [someField] as object, but found a concrete value"
      }
    ],
    "type" : "mapper_parsing_exception",
    "reason" : "object mapping for [someField] tried to parse field [someField] as object, but found a concrete value"
  },
  "status" : 400
}

【问题讨论】:

    标签: elasticsearch elasticsearch-mapping elasticsearch-template


    【解决方案1】:

    你可以创建一个对象:

                         "someField" : {
                            "type" : "object",
                            "fields" : {
                              "keyword" : {
                                "type" : "keyword"
                              }
                            }
                          },
    

    【讨论】:

    • 感谢您的回复。我试过这个,但无法让它工作。将编辑问题以包含此内容。
    • 哦,对了,当您索引时,您还需要索引“somefield.keyword”,而不仅仅是“somefield”
    • 对不起,我不太明白。您的意思是源文档现在需要包含一个实际的“关键字”子字段,而不是让映射创建它?
    • S抱歉,回复晚了,我错过了通知。我的意思是:curl -XPUT localhost:9200/test-1/doc/1?pretty -d ' { "someField": {"keyword": "some value"} } '
    • 感谢您回复我。是的,这就是我以为你的意思。这不适合我们的情况,因为传入的文档不应该包含特定于弹性的字段。但是,它可能对其他人有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    相关资源
    最近更新 更多