但是"/>

Lucene精确排序

Lucene精确排序

Lucene exact ordering

我遇到了一个长期问题,就是不太了解如何实现不错的Lucene排序或排名。假设我有一个城市及其人口清单。如果有人搜索" new "或" london ",我希望按人口顺序对前缀匹配列表进行排序,那么我可以使用前缀搜索和反向按字段排序(其中存在人口字段,即IE New)墨西哥,纽约;或伦敦德里(Londonderry)的伦敦。

但是,我也始终希望精确匹配的名称位于顶部。因此,对于"伦敦",该列表应显示"伦敦,伦敦,伦敦德里",其中第一个伦敦在英国,第二个伦敦在康涅狄格州,即使Londonderry的人口比伦敦CT高。

有人有一个查询解决方案吗?


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,其中有一个Comparator字段,api表示...

Stores a comparator corresponding to
each field being sorted by.

因此可以对术语进行相应的排序


我当前的解决方案是创建一个精确的搜索器和一个前缀搜索器,二者均按反向填充排序,然后从精确的匹配项开始复制所有我的匹配项,然后移至前缀匹配项。分页使我的结果分页比我想象的要烦。

我也使用哈希来消除重复项,但后来将前缀搜索器更改为前缀搜索(MUST)和精确搜索(MUST NOT)的布尔查询,以使Lucene删除重复项。尽管这似乎更加浪费。

编辑:移至评论(由于该功能现在已存在):Yuval F感谢您的博客文章……排序比较器将如何知道名称字段" london "与搜索词"完全匹配伦敦",如果它无法访问搜索词?


推荐阅读