如果在lucene中为null,则如何按具有替代值的字段进行排序?

时间:2010-03-19 00:05:53

标签: lucene lucene.net

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

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

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

这是否可以在lucene?

我估计我可以在索引创建阶段执行此操作(只需将相关日期值放在新字段中)但我没有足够的控制索引过程才能执行此操作,因此需要排序溶液

有什么想法吗?

由于 马特

2 个答案:

答案 0 :(得分:2)

原来这很容易。你必须实现ScoreDocComparator,正如Yuval建议的那样。但是,你只需要实现一次(我有一个带有两个日期的文档,我不想按date1然后date2排序,而是按date1排序,如果已指定,或者date2,如果没有。想想实际日期和a临时日期。我想使用实际日期,如果没有,那么临时日期就足够了。)

这是我的代码:

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,我们离开了!

答案 1 :(得分:1)

我有一个可能有用的想法:

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