【问题标题】:Lucene exact orderingLucene 精确排序
【发布时间】:2010-09-05 17:30:45
【问题描述】:

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

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

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

【问题讨论】:

    标签: lucene


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      dlamblin,让我看看我是否理解正确:您想要进行基于前缀的查询,然后按人口对结果进行排序,并且可能将排序顺序与精确匹配的偏好结合起来。 我建议您将搜索与排序分开并使用 CustomSorter 进行排序: 这是a blog entry describing a custom sorterThe classic Lucene book 很好地描述了这一点。

      【讨论】:

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

      API

      Sortcomparator

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

      你可以申请一个

      FieldSortedHitQueue

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-02
        • 2023-03-12
        • 2011-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多