Lucene精确排序

Lucene精确排序,lucene,Lucene,我有一个长期的问题,就是不太了解如何实现一个像样的Lucene排序或排名。假设我有一个城市及其人口的列表。如果有人搜索“new”或“london”,我希望前缀匹配列表按人口排序,我将前缀搜索和排序字段颠倒,其中有人口字段,即新墨西哥州、纽约州;或者伦敦,伦敦德里 然而,我也总是希望精确匹配的名字在顶部。因此,在“伦敦”的例子中,列表应该显示“伦敦,伦敦,伦敦德里”,第一个伦敦在英国,第二个伦敦在康涅狄格州,即使伦敦德里的人口比伦敦多 有人有单一的查询解决方案吗?我当前的解决方案是创建一个精确搜索

我有一个长期的问题,就是不太了解如何实现一个像样的Lucene排序或排名。假设我有一个城市及其人口的列表。如果有人搜索“new”或“london”,我希望前缀匹配列表按人口排序,我将前缀搜索和排序字段颠倒,其中有人口字段,即新墨西哥州、纽约州;或者伦敦,伦敦德里

然而,我也总是希望精确匹配的名字在顶部。因此,在“伦敦”的例子中,列表应该显示“伦敦,伦敦,伦敦德里”,第一个伦敦在英国,第二个伦敦在康涅狄格州,即使伦敦德里的人口比伦敦多


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

我当前的解决方案是创建一个精确搜索器和一个前缀搜索器,两者都按反向填充排序,然后从精确点击开始复制我的所有点击,移动到前缀点击。这让我的结果分页比我想象的要烦人一些

我还使用了一个散列来消除重复项,但后来将前缀搜索器更改为带有精确搜索(不得)的前缀搜索(MUST)的布尔查询,以便Lucene删除重复项。尽管这看起来更浪费


编辑:移动到评论(因为该功能现在已经存在):谢谢你的博客帖子。。。如果排序比较器无法访问搜索词“london”,它如何知道名称字段“london”与搜索词“london”完全匹配?

dlamblin,让我看看我是否正确地理解了这一点:您希望进行基于前缀的查询,然后按填充对结果进行排序,并可能将排序顺序与精确匹配的首选项相结合。 我建议您将搜索与分拣分开,并使用CustomSorter进行分拣: 给你。 描述这口井。

API

字段中的每个唯一术语都有一个明显的可比性-如果 有些文件中有相同的术语 字段,缓存阵列将具有 引用相同内容的条目 可比

你可以申请

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

存储对应于 按排序的每个字段


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

感谢您在博客中解释如何实现排序比较器,它不需要定义两个类。然而,因为排序比较器只能处理两个文档,而不知道搜索词,所以它不能像我在问题中描述的那样对结果进行排序。如果排序比较器无法访问搜索词,它如何知道名称字段“london”与搜索词“london”完全匹配?我认为可以执行以下操作:实现ScoreDocComparator接口的类(博客示例中的AZ09Comparator)将有一个“search term”成员,在运行查询时设置。comparing方法(blog示例中的compare()方法)可以在调用该字段期间访问该字段,并将一个完全匹配的文档排名高于另一个不完全匹配的文档。Dang,这就是我没有仔细考虑的结果(尽管我已经有一段时间没有看到该代码了)。现在,这更有意义,而且很有帮助。