假设我在Elasticsearch过滤器中有一个复杂的布尔表达式(实际上我有这个:给定N个条件,如果M中的M计算为true,则结果为true,否则为false)。
优化我的过滤器以减少参与查询的检查值的数量是否有任何意义? Elasticsearch如何评估"或","和"和" bool"过滤器?
好吧,我可以有一个简单的KNF或DNF表达式。例如。 for(我有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
的{{1}}支持不幸。
答案 0 :(得分:2)
使用bool
过滤器代替and
/ or
过滤器。如果原子条件是术语过滤器,则会缓存其结果,bool
过滤器会使用缓存的位集来快速计算结果,而不像and
/ or
过滤器。由于缓存术语过滤器,如果在查询中重复它们,则可以。给定术语过滤器的结果只计算一次。下次使用相同的过滤器(在同一查询或不同的查询中)时,将使用其缓存的bitset。
所以我要说的是,你的第一个版本的查询很好。您不需要进一步优化它。
详细了解here