簡體   English   中英

如何在ElasticSearch中查詢一個數組中同一字段中的兩個字段?

[英]How to query for two fields in one and the same tuple in an array in 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名稱和值必須是相同屬性元組的一部分。

我怎樣才能做到這一點?

您需要將properties映射為nested類型 因此,您的映射將類似於以下內容:

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

然后,您的查詢要匹配在同一元組中具有"foo=2"但在同一元組中沒有"boo=2"文檔,則需要相應地使用nested查詢 ,例如以下查詢

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "properties",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "properties.name": "foo"
                    }
                  },
                  {
                    "match": {
                      "properties.value": "2"
                    }
                  }
                ]
              }
            }
          }
        }
      ],
      "must_not": [
        {
          "nested": {
            "path": "properties",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "properties.name": "boo"
                    }
                  },
                  {
                    "match": {
                      "properties.value": "2"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

@Val的答案是最好的。 不過,我要添加一件事,因為它使一種查詢類型與其他可能受益於nested的“相反”功能的查詢有所不同。

在Elasticsearch中, "properties":[{"name":"foo","value":"2"},{"name":"boo","value":"2"}]的默認類型是用於自動創建此類字段的objectobject object的缺點是它不會將一個子字段的值與另一個子字段的值相關聯,這意味着foo不一定與2關聯。 name僅僅是值的陣列和value是值的再次另一個數組與兩個之間沒有關聯。

如果需要上述關聯才能工作,則必須nested

但是,我遇到了同時需要這兩個功能的情況。 如果您需要兩者,則可以為映射設置include_in_parent: true以便您可以同時使用兩者。 我所看到的一種情況是在這里

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM