elasticsearch 打分 源码_Elasticsearch性能优化之valueCountAgg的8~20倍性能提升

本文详细介绍了在Elasticsearch中发现valueCountAgg性能低于其他聚合操作的问题,通过对Lucene和Java String的基础理论分析,揭示了问题根源。通过针对性的优化,实现了在计算double、long类型时性能提升8~9倍,geo_point类型提升18~20倍。优化后的代码已贡献给Elasticsearch社区。
摘要由CSDN通过智能技术生成

912c97e8ae3206e775de8ef0b72927b0.png

Elasticsearch是一款优秀的开源搜索引擎,其除了可以完成复杂的query请求外,还可以做一些统计聚合的任务,类似sql中的max、sum、count、avg等。事情的缘起在于某一次对Elasticsearch的性能测试中发现,countAgg的性能会比sum等agg性能要低的多,甚至不在一个数量级。

先说结论,在计算double、long等数值类型时候,提高8倍~9左右性能;在计算geo_point类型时候,提高18~20倍性能。优化后的代码已经贡献给alibaba内部团队共建的Elasticsearch分支,并已经通过开源途径贡献给Elasticsearch开源社区,提给ES官方的PR已经被接受,后续将随新版本发布。

测试中发现问题

测试在2亿数据上进行,使用了一个double字段进行测试,如下图所示,avg、sum等字段在进行统计时候,性能十分接近,但是value_count的性能一直表现不佳,甚至不在一个数量级上。基于一些常识性的知识,我们认为count和sum等都是类似的操作,消耗的时间应该都是一样的,因此,我们对value_count的agg进行了探讨。

200Million docs, 1shard,0replica的数据上进行测试如下。

93c5e48d5d070614bf86c8e0e87cd6a8.png

基础理论知识

这里主要介绍lucene和java的String,这两部分决定了我们后续可以进行大幅优化。

Lucene

在lucene中,Collector系列接口可以完成查询结果收集、排序、自定义结果集过滤和收集。Collector和LeafCollector是Lucene结果集收集的核心。Elasticsearch中的统计聚合直接使用了lucene的接口,仅仅是自己实现了Collector接口。核心方法还是lucene中的search接口。

LeafCollector

org.apache.lucene.search.LeafCollector&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值