首页 > 解决方案 > 具有多个条件的 Elasticsearch OR 条件

问题描述

我需要使用一组全局过滤器和一个扩展的 OR 子句查询 elasticsearch 中的特定结果,其中 OR 子句中的每个案例都由一个特定的条件元组组成。换句话说,它会是这样的:'获取与这些全局过滤器匹配的记录:category = 'foo' 和 name = 'bar'。从该集合中,获取关键字 (x, y, z) 与以下任意项匹配的记录:(1, 2, 3), (4, 5, 6) 或 (7, 8, 9)。

例如,如果我有这些项目:

Item 1:
   category: foo, name: bar,
   x: 1, y: 2, z: 3

Item 2:
   category: foo, name: baz,
   x: 1, y: 2, z: 3

Item 3:
   category: foo, name: bar,
   x: 4, y: 5, z: 6

Item 4:
   category: foo, name: bar,
   x: 10, y: 11, z: 12

搜索不应返回第 2 项(因为它不符合 name = 'bar' 的全局条件)或第 4 项(因为它具有 (x, y, z) = (10, 11, 12),这不是其中之一我指定/允许的元组)。它应该返回与全局条件都匹配并且属于 x、y、z 值的指定/允许元组列表中的其他项。

我知道我可以为每个项目发出一个简单的查询来执行此操作;但我认为这会非常低效,因为我每次都需要指定 10K 元组或更多的顺序。

抱歉,如果这已经得到回答;现有答案之一可能已经适用于此,但我对弹性搜索太陌生,无法识别如何做到这一点。

环境:Python 3.8 中的 elasticsearch 7.10.1。

标签: elasticsearch

解决方案


干得好,

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "category": "foo"
          }
        },
        {
          "term": {
            "name": "bar"
          }
        },
        {
          "bool": {
            "should": [
              {
                "bool": {
                  "must": [
                    {
                      "term": {
                        "x": 1
                      }
                    },
                    {
                      "term": {
                        "y": 2
                      }
                    },
                    {
                      "term": {
                        "z": 3
                      }
                    }
                  ]
                }
              },
              {
                "bool": {
                  "must": [
                    {
                      "term": {
                        "x": 4
                      }
                    },
                    {
                      "term": {
                        "y": 5
                      }
                    },
                    {
                      "term": {
                        "z": 6
                      }
                    }
                  ]
                }
              },
              {
                "bool": {
                  "must": [
                    {
                      "term": {
                        "x": 7
                      }
                    },
                    {
                      "term": {
                        "y": 8
                      }
                    },
                    {
                      "term": {
                        "z": 9
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}

您所需要的只是布尔查询,以及mustshould子句的组合。


推荐阅读