elasticsearch - 具有多个条件的 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。
解决方案
干得好,
{
"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
}
}
]
}
}
]
}
}
]
}
}
}
您所需要的只是布尔查询,以及must
和should
子句的组合。
推荐阅读
- javascript - 按钮单击时 Highcharts 刷新工具提示不适用于 boost 模块
- kubernetes - 是否可以在 GKE 的区域集群中创建仅限区域的节点池?
- github - 带有生成文件的 GitHub 版本
- r - 如何从“规范”类的对象中提取组件?
- mongodb - 使用 Mongodump shell 时,如何从副本集中指定数据库和集合?
- python-3.x - ValueError:无法在位置 0 (Pandas) 解析字符串“2.90 3.50 2.35”
- lua - Roblox Studio 我的脚本只能运行一次
- google-sheets - 计数值在范围内增加的次数 - Google 表格
- node.js - 任何人都可以引导我朝着正确的方向前进,让这个 Azure 函数在它输出“无法找到模块'@azure/functions'的地方?
- concatenation - Libreoffice calc 连接单元格内容和括号