Lucene精确排序
时间:2020-03-05 18:39:06 来源:igfitidea点击:
我有一个长期的问题,就是不太了解如何实现不错的Lucene排序或者排名。假设我有一个城市及其人口清单。如果有人搜索"新"或者"伦敦",我想要按人口顺序排列的前缀匹配项列表,而我要使用前缀搜索和反向按字段排序的方法(存在人口字段,即新墨西哥州纽约市) ;或者伦敦,伦敦德里。
但是,我也总是希望确切的匹配名称在顶部。因此,在"伦敦"的情况下,该列表应显示"伦敦,伦敦,伦敦德里",其中第一个伦敦在英国,第二个伦敦在康涅狄格州,即使Londonderry的人口高于伦敦CT。
有没有人有一个查询解决方案?
解决方案
回答
我当前的解决方案是创建一个精确的搜索器和一个前缀搜索器,二者均按反向填充排序,然后从精确的匹配项开始复制所有我的匹配项,然后移动到前缀匹配项。这使得分页我的结果比我想象的要烦一些。
我还使用哈希来消除重复项,但后来将前缀搜索器更改为前缀搜索(必须)和精确搜索(不得)的布尔查询,以使Lucene删除重复项。尽管这似乎更加浪费。
编辑:移至评论(由于该功能现已存在):Yuval F感谢博客文章……如果无法访问名称比较器,排序比较器将如何知道名称字段" london"与搜索项" london"完全匹配搜索字词?
回答
dlamblin,让我看看我是否正确:我们要进行基于前缀的查询,然后按总体对结果进行排序,并可能将排序顺序与首选项进行精确匹配。
我建议我们将搜索与排序分开,并使用CustomSorter进行排序:
这是描述自定义分类器的博客条目。
经典的Lucene书很好地描述了这一点。
回答
的API
Sortcomparator
说
There is a distinct Comparable for each unique term in the field - if some documents have the same term in the field, the cache array will have entries which reference the same Comparable
我们可以申请
FieldSortedHitQueue
到sortcomparator,它具有一个"比较器"字段,api对此表示...
Stores a comparator corresponding to each field being sorted by.
因此,该术语可以相应地排序