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

lga*_*ior 4 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"}]}
Run Code Online (Sandbox Code Playgroud)

其中字段嵌套数据类型。

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

如何查询字段数组包含id 给定字段的对象?

  • 示例 1:我想要所有没有 id 101 字段的对象 - 返回 object3
  • 示例2:我想要所有没有 id 102 字段的对象 - 返回 object1、2 和 3

我正在寻找的基本上是一个接受谓词的存在查询(然后我可以否定它)。

Nis*_*ini 7

由于您正在处理嵌套文档,并且您希望如果两个嵌套文档都不匹配条件,则该文档应被视为匹配。如果我重新表述一下,我可以说不要获取具有与条件匹配的嵌套文档的文档。将其转换为查询 dsl,

GET <index>/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "nested": {
            "path": "fields",
            "query": {
              "term": {
                "fields.id": 101
              }
            }
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)