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