elasticsearch 弹性搜索与滤波器优化,elasticsearch,lucene,elasticsearch,Lucene" /> elasticsearch 弹性搜索与滤波器优化,elasticsearch,lucene,elasticsearch,Lucene" />

elasticsearch 弹性搜索与滤波器优化

elasticsearch 弹性搜索与滤波器优化,elasticsearch,lucene,elasticsearch,Lucene,elasticsearch是否自动优化过滤器?例如:在“和”过滤器中,如果存在多个分别为gte和lte运营商定义的数字范围过滤器,而不是同时具有lte和gte边界的一个范围过滤器,则会导致任何性能问题吗?ES会自动优化这些过滤器吗 "filter" : { "and" : [ { "range" : { "age" : { "gte": 10 } } }, { "range"

elasticsearch是否自动优化过滤器?例如:在“和”过滤器中,如果存在多个分别为gte和lte运营商定义的数字范围过滤器,而不是同时具有lte和gte边界的一个范围过滤器,则会导致任何性能问题吗?ES会自动优化这些过滤器吗

"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将变得更加灵活,查询也将更加智能

更新

由于您的用户可以创建自己的过滤器,因此主要的经验法则仍然存在,即您应该尝试以最严格的过滤器优先的方式对过滤器进行排序。然而,如果你的用户真的有能力创建他们自己的过滤器,而你没有干扰他们提交的内容,那么你应该教育他们(如果可能的话)如何最好地创建过滤器