【问题标题】:What is the performance impact of using a Match All filter in elastic search?在弹性搜索中使用 Match All 过滤器对性能有何影响?
【发布时间】:2015-09-01 14:30:20
【问题描述】:

作为项目查询优化的一部分,我正在考虑用match all filter 替换日期范围过滤器(缓存并返回所有内容,如全部匹配)。我想知道这是否会提高性能?

我的假设是,在执行时系统会简单地忽略此过滤器,并且我可以改善内存使用(删除缓存的过滤器)以及一些执行时间。这是正确的吗?

【问题讨论】:

  • 这取决于您将如何处理结果。用 match all 替换日期范围会增加 elasticsearch 必须处理的结果数量,这可能会导致比删除过滤器获得的速度更慢。
  • 我要替换的范围过滤器基本上得到了一切(date_min_possible 到 date_max_possible)
  • 我想我还需要指定这是在弹性搜索 1.7 的上下文中,因为 2.0 没有过滤器和查询之间的区别。

标签: elasticsearch


【解决方案1】:

如果此过滤器匹配大部分或所有记录,删除它绝对是一个很好的优化。但是,内存收益可能比您预期的要小,因为匹配所有记录的过滤器已经过优化。

【讨论】:

  • 我更想用 MatchAll 过滤器替换,与导致所有记录的日期范围的情况相比,这是否提供了任何改进?对于所有其他情况,我需要在其中保留日期范围过滤器。
  • 是的,因为您的日期范围本质上是一个过滤器,用于检查日期字段是否存在,并且可能会导致一些开销,特别是如果您有一些没有日期字段的记录。但是,最好将其完全删除,而不是用 match all 替换它。
【解决方案2】:

深入研究 elastic 1.7 的源代码,我找到了答案——

Match_All 过滤器具有 int 大小的 RAM 使用量,它只是 返回 maxdocId 参数大小的位集(即记录数)。 不需要缓存这是一个额外的优点。

这个位集应该与范围过滤器生成的相同,假设所有记录都具有应用范围的字段(对我来说就是这种情况)。

注意:imotov 提供的答案是一个起点,但我要添加我的答案以获得完整的详细信息。

参考文献:

https://github.com/elastic/elasticsearch/blob/1.7/src/main/java/org/elasticsearch/common/lucene/search/MatchAllDocsFilter.java

https://github.com/elastic/elasticsearch/blob/1.7/src/main/java/org/elasticsearch/common/lucene/docset/AllDocIdSet.java

【讨论】:

    猜你喜欢
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    相关资源
    最近更新 更多