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.

因此,该术语可以相应地排序