如何在ElasticSearch中查询数组中同一个元组中的两个字段?

时间:2015-06-01 10:17:27

标签: elasticsearch

假设我的索引中有一些文档如下所示:

{
  "category":"2020",
  "properties":[
    {
     "name":"foo",
     "value":"2"
    },
    {
     "name":"boo",
     "value":"2"
    }
  ]
},
{     
  "category":"2020",
  "properties":[
    {
     "name":"foo",
     "value":"8"
    },
    {
     "name":"boo",
     "value":"2"
    }
  ]
}

我想以一种方式查询索引,只返回那些匹配"foo":"2"但不匹配"boo":"2"的文档。

我尝试编写一个与properties.name properties.value匹配的查询,但后来我得到了误报。我需要一种方法告诉ElasticSearch名称和值必须是相同属性元组的一部分。

我该怎么做?

2 个答案:

答案 0 :(得分:3)

您需要将properties映射为nestedtype。所以你的映射看起来与此类似:

{
  "your_type": {
    "properties": {
      "category": {
        "type": "string"
      },
      "properties": {
        "type": "nested",
        "properties": {
          "name": {
            "type": "string"
          },
          "value": {
            "type": "string"
          }
        }
      }
    }
  }
}

然后,您在同一元组中匹配同一元组而不是"foo=2"的{​​{1}}文档的查询需要相应地使用nested query,如下所示。

"boo=2"

答案 1 :(得分:1)

@Val的回答和它一样好。但是,我要补充一点,因为它可以区分一种类型的查询和其他可能会受益于nested s"#34;特征

在Elasticsearch中,用于自动创建此类字段的"properties":[{"name":"foo","value":"2"},{"name":"boo","value":"2"}]的默认类型为objectobject的缺点是它不会将一个子字段的值与另一个子字段的值相关联,这意味着foo不一定与{{2相关联。 1}}。 name只是一个值数组,value是另一个值的数组,两者之间没有关联。

如果需要上述协会工作,那么nested是必须的。

但是,我遇到过需要这些功能的情况。如果您需要这两个,可以设置include_in_parent: true for the mapping,以便您可以利用这两者。我见过的其中一个情况是here

"properties": {
    "type": "nested",
    "include_in_parent": true,
    "properties": {
      "name": {
        "type": "string"
    ...