我是否需要优化Elasticsearch过滤器中的布尔表达式?
问题描述:
假设我在Elasticsearch过滤器中有一个复杂的布尔表达式(实际上,我有这个:给定N个条件,如果其中的M个评估为真,结果为真,否则为假)。我是否需要优化Elasticsearch过滤器中的布尔表达式?
在优化我的过滤器以减少参与查询的检查值的数量时是否有任何意义? Elasticsearch如何评估“或”,“和”以及“bool”过滤器?
嗯,我可以有一个简单的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
过滤器。如果原子条件是词条过滤器,则它们的结果被缓存,并且与and
/or
过滤器不同,过滤器利用缓存的位集来快速计算结果。由于术语过滤器被缓存,因此如果您在查询中重复使用这些术语,那很好。给定项过滤器的结果将只计算一次。下一次使用相同的过滤器(在相同的查询或不同的查询中),将使用其缓存的位集。
所以我说的是,你的第一个版本的查询很好。您不需要进一步优化它。
查看更多关于它here
感谢您的好评! 它看起来像: 1.和/或短路过滤器值的计算(即,或不评估文档的内部过滤器的其余部分,一旦它遇到内部过滤器匹配,结束整个或将匹配) 2.和/或不是BY DEFAULT缓存的(但是如果缓存显式启用 - 是否使用BitSet的?) 3.和/或不使用内部词条过滤器的位集缓存? (还没弄清楚!) – 2014-11-07 19:33:25
4.布尔过滤器确实使用内部词条过滤器的位集缓存 5.布尔过滤器不会短路 - 即无论如何它都会查找文档中的词条,即使已经有足够的数据有时需要弄清楚某个文件必须/应该匹配。但是充分计算术语过滤器并将它们缓存为位集合可以在未来*组合它们。 – 2014-11-07 19:34:02
6.默认情况下,bool过滤器被缓存。 7.如果在过滤器中结合了许多术语(尤其是在使用“fielddata”执行模式时),并且/或者它们是好的,特别是如果有一些严格的过滤器排除大量文档(或者可能是每次都有不同的滤波器组合,并且整个滤波器没有太多重用) - 据了解,它们可以保存例如在50%的情况下,50%的术语查找。虽然bool过滤器在其他地方很好,但它可以使用缓存的内部词条过滤器。 – 2014-11-07 19:34:23