【问题标题】:elasticsearch and filters optimization弹性搜索和过滤器优化
【发布时间】:2015-10-17 12:31:46
【问题描述】:

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

"filter" : {
"and" : [
    {
    "range" : {
            "age" : {
            "gte": 10
            }
    }
    },
    {
    "range" : {
            "age" : {
                "lte": 90
            }
    }
    },
    {
    "range" : {
            "age" : {
            "gte": 30
            }
    }
    }                                                               
]}

更新

想补充一点:虽然组合边界很有意义,但我想在我的可以动态创建过滤器的用户执行这种情况时检查这一点。

【问题讨论】:

    标签: elasticsearch lucene


    【解决方案1】:

    过滤器的主要经验法则是,您应该始终首先应用最严格的过滤器,以减少匹配文档的集合并允许下一个过滤器处理尽可能少的文档。

    此外,在您展示的情况下,为同一个 age 字段设置三个不同的 range 过滤器并没有什么意义,您应该将它们合并为一个:

    "filter": {
        "range": {
            "age": {
                "gte": 30,
                "lte": 90
            }
        }
    }
    

    还请注意,您应该尽可能首选bool/must 而不是and 过滤器,如in this excellent article 所述,主要是因为and 过滤器未缓存。

    最后,以上内容仅适用于 pre-2.0 Elasticsearch 版本。从 2.0 开始,整个查询/过滤器 DSL 将是 completely overhauled 并且查询将更加智能。

    更新

    由于您的用户可以创建自己的过滤器,因此主要的经验法则仍然存在,即您应该尝试以最严格的过滤器排在第一位的方式对过滤器进行排序。但是,如果您的用户确实有权创建自己的过滤器并且您不会干扰他们提交的内容,那么您应该(如果可能的话)教育他们如何最好地创建过滤器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多