1

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

我的数据如下所示:

{
    "_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"
        }],
    }
}

我正在尝试的是:我应该得到规范名称为“Test1”且同一子文档的规范值为“是”的产品

这是我为此编写的查询:

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

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

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

提前致谢。

4

1 回答 1

1

您需要修改映射以指示这specifications是一种nested类型。

映射如:

"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" }
    }
  }]
}
于 2017-01-27T11:28:23.727 回答