查询嵌套数组中不包含给定对象的文档

时间:2020-04-14 20:12:49

标签: elasticsearch elasticsearch-query

我有这样的结构:

{ "id": "object1", "fields": [{"id": 100, "value": "one"}, {"id": 101, "value": "abc"}]}
{ "id": "object2", "fields": [{"id": 100, "value": "two"}, {"id": 101, "value": "cde"}]}
{ "id": "object3", "fields": [{"id": 100, "value": "three"}]}

其中 fields 嵌套数据类型。

使用嵌套查询,我可以获取具有给定字段特定值的所有对象(例如,使用field.id = 101 && field.value =“ abc”我可以获取object1)。

如何查询其 fields 数组不包含其ID所给定字段的对象?

  • 示例1:我希望所有不具有ID为101的字段的对象- 返回object3
  • 示例2:我希望所有没有字段的对象 ID 102-返回object1、2和3

我要寻找的基本上是一个接受谓词的 exists 查询(然后可以取反)。

1 个答案:

答案 0 :(得分:2)

由于您正在处理嵌套文档,因此您希望如果两个嵌套文档都不符合条件,则应将该文档视为匹配项。如果我改写这个意思,我可以说不要获取嵌套条件与条件匹配的文档。将此转换为查询dsl,

GET <index>/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "nested": {
            "path": "fields",
            "query": {
              "term": {
                "fields.id": 101
              }
            }
          }
        }
      ]
    }
  }
}