首页 > 解决方案 > 在 Elasticsearch 数组中查找任何不等于 X 的值

问题描述

我想构建一个查询,该查询与在不等于给定值的多值字段中具有任何值的任何文档相匹配。

索引一些文档

POST /example/type
{"array": ["a", "b", "c"]} <--- 1
{"array": ["d", "e", "x"]} <--- 2
{"array": ["x"]}           <--- 3 

我想构建一个查询,说“匹配数组中任何值不等于 x 的任何文档。在上面的示例中,将匹配 (1) 和 (2),因为它们都包含至少一个非“x”值。文档 (3) 将被拒绝,因为它只包含“x”。

我已经尝试过布尔 must_not 和查询 DSL NOT (!) 运算符,但它们的工作原理是排除原则而不是逻辑否定相等,因此只返回文档 (1)。

我应该补充一点,性能在这里很重要,因此基于脚本的解决方案可能不起作用。

标签: elasticsearch

解决方案


Lucene 索引(这是 ElasticSearch 的基础)没有数组中值的原始顺序的概念。此外,对象数组不会像您期望的那样工作:您不能独立于数组中的其他对象查询每个对象。


我相信基于脚本的解决方案是唯一的出路

或者,在索引文档时,您可以添加其他参数“长度”

PUT my_test
{
  "mappings": {
    "properties": {
      "array": {
        "type": "keyword"
      },
      "count":{
        "type": "integer"
      }
    }
  }
}

现在搜索没有的文档(count==1 并且数组包含 a)

GET /my_test/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "term": {
            "count": 1
          }
        },
        {
          "term": {
            "array": "x"
          }
        }
      ]
    }
  }
}

推荐阅读