Elasticsearch 过滤同一子文档中的两个字段

Elastic Search Fliter on two fields within same sub document

我正在尝试编写一个弹性搜索查询,其中我有一组结构完全相同的子文档,我必须检查同一子文档中的两个条件。

我的数据是这样的:

{
    "_id": "5672ba7c0d71c93d159c408e",
    "productId": "1723913526",
    "title": "Digitab Tablet",
    "instock": true,
    "specifications": [{
        "category": "In the box",
            "name": "Test1",
            "value": "No"
        }, {
            "category": "Warranty",
            "name": "Test2",
            "value": "Yes"
        }, {
            "category": "General",
            "name": "Test3",
            "value": "Abcd"
        }],
    }
}

我正在尝试的是:我应该获得 specifications.name 为 "Test1" 且同一子文档的 specifications.value 为 "Yes"

的产品

这是我为此编写的查询:

{
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "specifications.name": "Test1*"
          }
        },
        {
          "term": {
            "instock": "true"
          }
        },
        {
          "term": {
            "specifications.value": "yes"
          }
        }
      ],
      "must_not": [],
      "should": []
    }
  }
}

问题是 - 它不应该 return id 为 1723913526 的产品,因为 "value":"Yes" 对于 "name": "Test2" 而不是 "name": "Test1".

我希望问题很清楚,如果需要更多信息,请发表评论。

提前致谢。

您需要修改映射以指示 specificationsnested 类型。

映射如下:

"mappings": {
  "product": {
    "properties": {
      ...
      "specifications": {
        "type": "nested" 
      }
    }
  }
}

然后像这样查询:

"bool": {
  "must": [{
    "nested": {
      "path": "specifications",
      "query": {
        "bool": {
          "must": [
            { "wildcard": { "specifications.first": "Test1*" }},
            { "term": { "specifications.value":  "yes" }} 
          ]
        }
      }
    },
    {
      "term": { "instock": "true" }
    }
  }]
}