【问题标题】:How does one do negative queries against nested objects in Elasticsearch?如何对 Elasticsearch 中的嵌套对象进行否定查询?
【发布时间】:2019-08-19 19:27:32
【问题描述】:

我有一个索引,其文档包含嵌套对象列表。映射的简化版本如下:

{
  "_doc": {
    "dynamic": "strict",
    "properties": {
      "things": {
        "type": "nested",
        "dynamic": "strict",
        "properties": {
          "name": {
            "type": "keyword"
          },
          "version": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

我想获取所有没有的文档具有任何具有特定值集的嵌套事物对象。类似的查询

{
  "query": {
    "nested": {
      "path": "things",
      "query": {
        "bool": { 
          "must_not": [
            {
              "term": {
                "name": "thing1"
              }
            },
            {
              "term": {
                "version": "1.0.0"
              }
            }
          ]
        }
      }
    }
  }
}

似乎只返回所有包含 一些 不匹配的嵌套文档的文档...这意味着它仍然返回所有文档,即使是那些 也有 的文档匹配的嵌套对象。那么,我该如何正确过滤掉它们呢?

编辑:像这样的查询

{
  "query": {
    "bool": {
      "must_not": [
        {
          "nested": {
            "path": "things",
            "query": {
              "bool": { 
                "must": [
                  {
                    "term": {
                      "name": "thing1"
                    }
                  },
                  {
                    "term": {
                      "version": "1.0.0"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

将嵌套对象查询嵌套在 must_not 中也不起作用,仍然只是返回所有内容。

【问题讨论】:

  • 据我所知:您的嵌套查询将适用于找到的内容,但适用于该嵌套类型。您可能想要的是一个包装函数,使您的查询嵌套查询本身成为must,但您的实际查询:query: { bool: { must_not: [ nestedQuery - that does find things ] } } 这并不理想,但我发现了一种解决方法
  • @Tessmore 遗憾的是,这似乎也不起作用。 :(
  • Oki,我可能不完全理解:如果您不想将thing1 作为名称或version = 1.0.0,那么嵌套的东西可以是should,现在我又读了一遍,我想这就是你的意思?所以嵌套查询中的布尔查询可以是should。如果您的用例不同,可能会显示一个匹配的示例文档和一个不应该匹配的示例文档(但现在正在返回)

标签: elasticsearch


【解决方案1】:

好吧,我最终自己想通了。事实证明,尽管已经在嵌套对象查询中明确指定了path 字段,但嵌套对象的字段名称仍然必须是完全限定的。因此,这是可行的:

{
  "query": {
    "nested": {
      "path": "things",
      "query": {
        "bool": { 
          "must_not": [
            {
              "term": {
                "things.name": "thing1"
              }
            },
            {
              "term": {
                "things.version": "1.0.0"
              }
            }
          ]
        }
      }
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多