【问题标题】:How to sort by a field that has an alternative value if null in lucene?如果在lucene中为null,如何按具有替代值的字段进行排序?
【发布时间】:2010-03-19 00:05:52
【问题描述】:

我想按日期字段 (date1) 对我的 lucene(.net) 搜索结果进行排序,但如果没有设置 date1,我想使用 date2。

传统的排序方法是按 date1 排序,然后将相同的值按 date 2 排序。这意味着每当我回退到 date2 时,这些值将位于顶部(或底部)结果集。我想将 date2 值与 date1 值交错。

换句话说,我想按 (date1 != null ? date1 : date2) 排序。

这在 lucene 中可行吗?

我认为我可以在索引创建阶段执行此操作(只需将相关的日期值放入一个新字段中),但我没有足够的索引过程控制能够执行此操作,所以想要排序解决方案。

有什么想法吗?

谢谢 马特

【问题讨论】:

  • 呃,我讨厌特定平台(如 .Net)的 Lucene 问题。我遇到了同样的问题,但在另一个平台上,希望解决方案独立于平台:(

标签: lucene lucene.net


【解决方案1】:

事实证明这很容易。正如 Yuval 建议的那样,您必须实施 ScoreDocComparator。但是,您只需要实现一次(我有一个包含两个日期的文档,我不想按 date1 然后按 date2 排序,而是按 date1 如果指定,或者按 date2 如果没有。想想一个实际的日期和一个暂定日期。如果可用,我想使用实际日期,但如果没有,那么暂定日期就足够了。

这是我的代码:

public class ActualOrProvisionalDateSortComparator : ScoreDocComparator
{
    private readonly StringIndex actualDates;
    private readonly StringIndex provisionalDates;

    public TxOrCreatedDateSortComparator(IndexReader reader, FieldCache fieldCache)
    {
        actualDates = fieldCache.GetStringIndex(reader, "actualDate");
        provisionalDates = fieldCache.GetStringIndex(reader, "provisionalDate");
    }

    public int Compare(ScoreDoc i, ScoreDoc j)
    {
        var date1 = GetValue(i.doc);
        var date2 = GetValue(j.doc);

        return date1.CompareTo(date2);
    }

    public IComparable SortValue(ScoreDoc i)
    {
        return GetValue(i.doc);
    }

    public int SortType()
    {
        return SortField.CUSTOM;
    }

    private string GetValue(int doc)
    {
        return actualDates.Lookup[actualDates.Order[doc]] ?? provisionalDates.Lookup[provisionalDates.Order[doc]];
    }
}

我的 ActualOrProvisionalDateSortComparatorSource 传入 FieldCache_Fields.DEFAULT,我们离开了!

【讨论】:

    【解决方案2】:

    我有一个可行的想法:

    • 使用Search(Query, Filter, Sort)
    • 要创建 Sort 对象,请使用 Sort(SortField[]) 构造函数
    • 为两个日期字段创建一个 SortField。他们每个人都使用ScoreDocComparator 来处理空值的情况。在这种情况下,Compare() 函数将返回零。 请参阅this blog post 关于在 Java Lucene 中使用自定义排序。我相信将其翻译成 Lucene.net 并不难。

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 2015-05-14
      相关资源
      最近更新 更多