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

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

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

有帮助吗?

解决方案

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

其他提示

API 用于

排序比较器

该字段中每个唯一术语都有明显的可比

您可以申请一个

字段排序命中队列

到 sortcomparator,它有一个 Comparator 字段,api 说...

存储一个对应于每个字段的比较器。

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

我当前的解决方案是创建一个精确搜索器和一个前缀搜索器,两者都按反向总体排序,然后复制从精确命中开始的所有命中,移动到前缀命中。它使我的结果分页比我想象的更烦人。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top