elasticsearch 弹性搜索与滤波器优化
elasticsearch是否自动优化过滤器?例如:在“和”过滤器中,如果存在多个分别为gte和lte运营商定义的数字范围过滤器,而不是同时具有lte和gte边界的一个范围过滤器,则会导致任何性能问题吗?ES会自动优化这些过滤器吗elasticsearch 弹性搜索与滤波器优化,elasticsearch,lucene,elasticsearch,Lucene,elasticsearch是否自动优化过滤器?例如:在“和”过滤器中,如果存在多个分别为gte和lte运营商定义的数字范围过滤器,而不是同时具有lte和gte边界的一个范围过滤器,则会导致任何性能问题吗?ES会自动优化这些过滤器吗 "filter" : { "and" : [ { "range" : { "age" : { "gte": 10 } } }, { "range"
"filter" : {
"and" : [
{
"range" : {
"age" : {
"gte": 10
}
}
},
{
"range" : {
"age" : {
"lte": 90
}
}
},
{
"range" : {
"age" : {
"gte": 30
}
}
}
]}
更新
想要添加:虽然合并边界是有意义的,但我想检查一下,如果我的用户可以动态创建过滤器,那么这种情况会发生。过滤器的主要经验法则是,您应该始终首先应用最严格的过滤器,以减少匹配文档集,并允许下一个筛选器处理尽可能少的文档 此外,在您正在显示的情况下,对于相同的
年龄字段,使用三个不同的范围过滤器是没有意义的,您应该将它们合并为一个:
"filter": {
"range": {
"age": {
"gte": 30,
"lte": 90
}
}
}
还请注意,如前所述,您应该尽可能地选择bool/must
而不是和
过滤器,这主要是因为和
过滤器没有缓存
最后,以上仅适用于2.0之前的Elasticsearch版本。从2.0开始,整个查询/过滤DSL将变得更加灵活,查询也将更加智能
更新
由于您的用户可以创建自己的过滤器,因此主要的经验法则仍然存在,即您应该尝试以最严格的过滤器优先的方式对过滤器进行排序。然而,如果你的用户真的有能力创建他们自己的过滤器,而你没有干扰他们提交的内容,那么你应该教育他们(如果可能的话)如何最好地创建过滤器