原來這很容易。正如尤瓦爾所建議的那樣,您必須實施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我們很遠!
呃,我討厭具體到像.Net這樣的特定平臺的Lucene問題。我得到了同樣的問題,但在另一個平臺上,希望解決方案是平臺獨立:( – 2014-01-02 00:57:00