如果lucene中为null,如何按具有可选值的字段排序?

如果lucene中为null,如何按具有可选值的字段排序?,lucene,lucene.net,Lucene,Lucene.net,我想按日期字段(date1)对lucene(.net)搜索结果进行排序,但如果没有设置date1,我想使用date2 传统的排序方法是按日期1排序,然后按日期2排序相同的值。这意味着无论何时我回到date2,这些值都将位于结果集的顶部(或底部)。我想将date2值与date1值交错 换句话说,我想按(date1!=null?date1:date2)排序 这在lucene有可能吗 我认为我可以在索引创建阶段这样做(只需将相关的日期值放在一个新字段中),但我对索引过程没有足够的控制能力来做到这一点,

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

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

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

这在lucene有可能吗

我认为我可以在索引创建阶段这样做(只需将相关的日期值放在一个新字段中),但我对索引过程没有足够的控制能力来做到这一点,所以我想要一个排序解决方案

有什么想法吗

谢谢
马特

我有一个可行的想法:

  • 使用
  • 要创建排序对象,请使用构造函数
  • 为两个日期字段创建一个排序字段。对于它们中的每一个,使用a来处理空值的情况。在这种情况下,Compare()函数将返回零。 请参阅关于在JavaLucene中使用自定义排序的内容。我相信这并不难翻译成Lucene.net

事实证明这很容易。正如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]];
    }
}

我的ActualRorTemperationDateSortComparatorSource在FieldCache\u Fields.DEFAULT中传递,我们离开了

呃,我讨厌针对.Net这样特定平台的Lucene问题。。我也有同样的问题,但在另一个平台上,我希望解决方案是平台独立的:(