elasticsearch会自动优化过滤器吗?例如:在“和”过滤器中,如果为gte和lte运算符分别定义了多个数值范围过滤器而不是具有lte和gte边界的一个范围过滤器,是否会导致任何性能问题? ES会自动优化这些过滤器吗?
"filter" : {
"and" : [
{
"range" : {
"age" : {
"gte": 10
}
}
},
{
"range" : {
"age" : {
"lte": 90
}
}
},
{
"range" : {
"age" : {
"gte": 30
}
}
}
]}
更新
想要添加:虽然合并边界是有意义的,但是当我可以动态创建过滤器的用户做这样的场景时,我想检查这个问题。
答案 0 :(得分:2)
使用过滤器的主要经验法则是,您应该始终首先应用限制性最强的过滤器,以减少匹配文档的集合,并允许下一个过滤器处理尽可能少的文档。
此外,在您展示的情况下,为同一个range
字段设置三个不同的age
过滤器并不合理,您应该将它们合并为一个:< / p>
"filter": {
"range": {
"age": {
"gte": 30,
"lte": 90
}
}
}
另请注意,根据in this excellent article的说明,您应该尽可能选择bool/must
个and
过滤器,主要是因为and
过滤器未被缓存。
最后,以上仅适用于2.0之前的Elasticsearch版本。从2.0开始,整个查询/过滤器DSL将为completely overhauled,查询将更加智能化。
更新
由于您的用户可以创建自己的过滤器,因此主要的经验法则仍然存在,即您应该尝试按照最先限制过滤器的方式对过滤器进行排序。但是,如果您的用户真的有能力创建自己的过滤器并且您没有干扰他们提交的内容,那么您应该教育他们(如果可能的话)如何最好地创建过滤器。