假设我在Elasticsearch过滤器中有一个复杂的 bool(boolean) 表达式(实际上我有这个:给定N个条件,如果其中M个条件为true,则结果为true,否则为false)。
优化我的过滤器以最小化参与查询的检查值的数量是否有意义? Elasticsearch如何评估“或”,“与”和“ bool(boolean) ”过滤器?
好吧,我只需要一个简单的KNF或DNF表达式即可。例如。对于(我有3个条件匹配4个条件):
{
"or": [
{
"and": [
cond1,
cond2,
cond3
]
},
{
"and": [
cond2,
cond3,
cond4
]
},
{
"and": [
cond1,
cond3,
cond4
]
},
{
"and": [
cond1,
cond2,
cond4
]
}
]
}
但是,是否有任何尝试对其进行优化以降低潜在的condX评估数量的感觉?
{
"or": [
{
"and": [
cond1,
{
"or": [
{
"and": [
cond2,
cond3
]
},
{
"and": [
cond3,
cond4
]
},
{
"and": [
cond2,
cond4
]
}
]
},
{
"and": [
cond2,
cond3,
cond4
]
}
]
}
]
}
说,原子条件是术语过滤器。
(我之所以陷入这种困境的原因是不幸的是在Elasticsearch中缺少对
minimum_should_match
的bool filters
的支持)。
最佳答案
使用bool
过滤器,而不是and
/ or
过滤器。如果原子条件是术语过滤器,则将其结果缓存,并且bool
过滤器与and
/ or
过滤器不同,它利用缓存的位集快速计算结果。由于术语过滤器已缓存,因此如果您在查询中重复过滤器就可以了。给定项过滤器的结果将仅计算一次。下次使用同一过滤器时(在同一查询或不同查询中),将改为使用其缓存的位集。
因此,我的意思是,查询的第一个版本很好。您无需进一步优化。
进一步了解here
关于search - 我是否需要在Elasticsearch过滤器中优化 bool 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26789278/