本节书摘来华章计算机《深入理解Elasticsearch(原书第2版)》一书中的第2章 ,第2.4.3节,[美]拉斐尔·酷奇(Rafal Ku) 马雷克·罗戈任斯基(Marek Rogoziski)著 张世武 余洪淼 商旦 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.4.3 性能考量
通常,过滤器都是很快的。这一点有多种原因。首先,最重要的一点是,由过滤器所处理的查询部分不需要计算文档得分。之前我们就提到过,打分过程与给定查询和索引中的文档集合密切相关。
使用过滤器时需要注意一点:在Elasticsearch 1.4.0版本发布后,执行嵌套查询时所使用的bitsets默认提前就加载好了。这样做的目的是使嵌套查询执行得更快,不过可能伴随内存使用问题。可以通过设置index.load_fixed_bitset_filters_eagerly配置项为false来禁用提前加载。如果需要查看固定大小bitsets的内存占用情况可以执行以下命令:curl -XGET ‘localhost:9200/_cluster/stats?human&pretty’,在响应中寻找fixed_bit_set_memory_in_bytes属性即可。
在使用过滤器时,过滤结果不依赖于查询,因此过滤结果可以被轻易地缓存起来供后续查询使用。值得一提的是,每个Lucene索引段都有一个过滤结果缓存。这意味着无需在每次commit时重建缓存,重建操作只发生在段生成和合并时。
当然,有得必有失,过滤器也有一些不好的地方。不是所有的过滤器都可以被缓存。考虑那些依赖于当前时间的过滤器,对它们做缓存不会有任何意义。在某些场景下不值得做缓存,因为可能存在非常多的唯一值,缓存命中率极低,比如基于地理位置过滤的场景。