首页 > 解决方案 > Elastic Search 中 doc.field_name 与 field_name 之间的区别?

问题描述

我有这样的来源:

{
      "doc" : {
        "questions" : [
          {
            "question" : "Which gold customers in Texas had bank accounts with more than $10 million last year ?",
            "state" : "COMPLETED",
            "tags" : [
              "computer"
            ]
          }
        ]
      }
    }

当我编写基于状态和标签的搜索查询时,查询看起来像这样,

 {
  "size": "2000",
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "doc.questions.state": "COMPLETED"
          }
        },
        {
          "match": {
            "doc.questions.tags": "computer"
          }
        }
      ]
    }
  },
  "from": "0",
  "_source": {
    "includes": [
      "doc.questions.question",
      "doc.questions.state",
      "doc.questions.tags"
    ]
  }
}

为什么需要写doc.questions.tag而不是questions.tags

如果我删除doc. 从任何键,没有匹配

在此处输入图像描述

区别在哪里?

标签: elasticsearchquerydsl

解决方案


基本上,Elasticsearch在 JSON 结构内有两种 JSON 变体,即 anestedobject类型。

在您的情况下,它是一种object类型。您可以使用 RDBMS 术语验证该索引的映射架构

GET <your_index_name>/_mapping

为了根据内部 json 结构的值进行搜索,您需要包含字段的整个路径,否则 elasticsearch 会将questions其视为外部字段doc

因此,如果您的 JSON 结构如下所示,则可以通过删除doc.

{
   "questions":[
      {
         "question":"Sample Question",
         "state":"Completed",
         "tags":[
            "computer"
         ]
      }
   ]
}

希望您现在明白为什么仅仅因为您的 JSON 结构questionsdoc.

我分享的链接将帮助您澄清。希望有帮助!


推荐阅读