elasticsearch源码-terminate_after修改为基于segment的截断功能

1.背景

当前es 的terminate_after是基于shard级别的截断功能,在遍历每个shard到指定数量后就返回结果,这样会导致查询结果不够好(部分segment没有搜索),实现按照segment级别截断

  1. 源码改写

luence遍历每个segment的主逻辑:

类:IndexSearcher:


image.png

elasticsearch 的shard级别的截断实现类是EarlyTerminatingCollector,上面图片调用getLeafCollector(ctx)方法调用EarlyTerminatingCollector#getLeafCollectorf方法获取到FilterLeafCollector类对象,EarlyTerminatingCollector#getLeafCollector实现了截断功能,并且在上图的score中内部在命中一篇文章后,会调用内部FilterLeafCollector对象的collect方法进行累计计数,因此改写EarlyTerminatingCollector#getLeafCollector方法就可以实现按照段的指定数量进行截断。

改写类:

EarlyTerminatingCollector#getLeafCollector


image.png

QueryPhase#execute:


image.png

你可能感兴趣的:(elasticsearch源码-terminate_after修改为基于segment的截断功能)