lucene(13)—lucene搜索之自定义排序的实现原理和编写自己的自定义排序工具
自定义排序说明
我们在做lucene搜索的时候,可能会需要排序功能,虽然lucene内置了多种类型的排序,但是如果在需要先进行某些值的运算然后在排序的时候就有点显得无能为力了;
要做自定义查询,我们就要研究lucene已经实现的排序功能,lucene的所有排序都是要继承FieldComparator,然后重写内部实现,这里以IntComparator为例子来查看其实现;
IntComparator相关实现
其类的声明为 public static class IntComparator extends NumericComparator
IntComparator声明的参数为:
|
|
查看copy方法可知
- values随着类初始化而初始化其长度
- values用于存储NumericDocValues中读取到的内容
具体实现如下:
values的初始化
|
|
values值填充(此为IntComparator的处理方式)
|
|
这些实现都是类似的,我们的应用实现自定义排序的时候需要做的是对binaryDocValues或NumericDocValues的值进行计算,然后实现FieldComparator内部方法,对应IntComparator就是如上的值copy操作;
然后我们需要实现compareTop、compareBottom和compare,IntComparator的实现为:
|
|
|
|
实现自己的FieldComparator
要实现FieldComparator,需要对接收参数进行处理,定义处理值的集合,同时定义BinaryDocValues和接收的参数等,这里我写了一个通用的比较器,代码如下:
|
|
其中ObjectUtil是一个接口,定义了值处理的过程,最终是要服务于comparator的compare方法的,同时对comparator的内部compare方法进行了定义
ObjectUtil接口定义如下:
|
|
我们不仅要提供比较器和comparator,同时还要提供接收用户输入的FiledComparatorSource
|
|
相关测试程序,这里我们模拟一个StringComparator,对String值进行排序
|
|
其对应的ObjectUtil实现如下:
|
|