我想通过日期字段(date1)对我的lucene(.net)搜索结果进行排序,但是如果没有设置date1,我想使用date2。
传统的排序方法是按date1排序,然后按日期2排序相同的值。这意味着每当我回到date2时,这些值将位于顶部(或底部)结果集。我想将date2值与date1值交错。
换句话说,我想排序(date1!= null?date1:date2)。
这是否可以在lucene?
我估计我可以在索引创建阶段执行此操作(只需将相关日期值放在新字段中)但我没有足够的控制索引过程才能执行此操作,因此需要排序溶液
有什么想法吗?
由于 马特
答案 0 :(得分:2)
原来这很容易。你必须实现ScoreDocComparator,正如Yuval建议的那样。但是,你只需要实现一次(我有一个带有两个日期的文档,我不想按date1然后date2排序,而是按date1排序,如果已指定,或者date2,如果没有。想想实际日期和a临时日期。我想使用实际日期,如果没有,那么临时日期就足够了。)
这是我的代码:
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 :(得分:1)
我有一个可能有用的想法: