4

我在不太了解如何实现一个像样的 Lucene 排序或排名方面遇到了这个长期问题。假设我有一个城市及其人口的列表。如果有人搜索“新”或“伦敦”,我想要按人口排序的前缀匹配列表,并且我使用前缀搜索和反转的按字段排序,其中有一个人口字段,即纽约新墨西哥州; 或伦敦,伦敦德里。

但是,我也总是希望完全匹配的名称位于顶部。因此,在“伦敦”的情况下,列表应该显示“伦敦,伦敦,伦敦德里”,其中第一个伦敦在英国,第二个伦敦在康涅狄格州,即使伦敦德里的人口比伦敦 CT 高。

有没有人有一个单一的查询解决方案?

4

3 回答 3

3

dlamblin,让我看看我是否正确理解:您想要进行基于前缀的查询,然后按人口对结果进行排序,并可能将排序顺序与精确匹配的偏好结合起来。我建议您将搜索与排序分开,并使用 CustomSorter 进行排序:这是一个描述自定义排序器的博客条目经典的 Lucene 书很好地描述了这一点。

于 2008-08-31T11:40:56.760 回答
1

API 用于

排序比较器

该字段中的每个唯一术语都有一个不同的 Comparable - 如果某些文档在该字段中具有相同的术语,则缓存数组将具有引用相同 Comparable 的条目

你可以申请一个

字段排序命中队列

到有一个比较器字段的排序比较器,API 说...

存储与排序依据的每个字段对应的比较器。

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

于 2009-09-04T09:06:38.917 回答
0

我目前的解决方案是创建一个精确搜索器和一个前缀搜索器,两者都按反向填充排序,然后从精确匹配开始复制我的所有匹配,移动到前缀匹配。它使分页我的结果比我认为的更烦人。

此外,我使用哈希来消除重复项,但后来将前缀搜索器更改为具有精确搜索(不得)的前缀搜索(必须)的布尔查询,以让 Lucene 删除重复项。虽然这看起来更加浪费。

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

于 2008-08-12T05:55:04.920 回答