Elasticsearch 具有多个标准的 OR 条件

Hel*_*eer 4 elasticsearch

我需要使用一组全局过滤器和一个扩展的 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
Run Code Online (Sandbox Code Playgroud)

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

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

如果已经回答了这个问题,我们深表歉意;现有的答案之一可能已经适用于此,但我对 Elasticsearch 太陌生,无法识别如何做到这一点。

环境:Python 3.8 中的elasticsearch 7.10.1。

Nis*_*ini 6

干得好,

{
  "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
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

您所需要的只是boolmust查询,以及和子句的组合should