2010-03-19 86 views
1

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

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

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

这是可能的lucene?

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

任何想法?

感谢 马特

+0

呃,我讨厌具体到像.Net这样的特定平台的Lucene问题。我得到了同样的问题,但在另一个平台上,希望解决方案是平台独立:( – 2014-01-02 00:57:00

回答

2

原来这很容易。正如尤瓦尔所建议的那样,您必须实施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我们很远!

1

我有一个想法,可能工作:

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