2010-03-19 41 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並不困難。
相關問題