如果lucene中为null,如何按具有可选值的字段排序?
我想按日期字段(date1)对lucene(.net)搜索结果进行排序,但如果没有设置date1,我想使用date2 传统的排序方法是按日期1排序,然后按日期2排序相同的值。这意味着无论何时我回到date2,这些值都将位于结果集的顶部(或底部)。我想将date2值与date1值交错 换句话说,我想按(date1!=null?date1:date2)排序 这在lucene有可能吗 我认为我可以在索引创建阶段这样做(只需将相关的日期值放在一个新字段中),但我对索引过程没有足够的控制能力来做到这一点,所以我想要一个排序解决方案 有什么想法吗 谢谢如果lucene中为null,如何按具有可选值的字段排序?,lucene,lucene.net,Lucene,Lucene.net,我想按日期字段(date1)对lucene(.net)搜索结果进行排序,但如果没有设置date1,我想使用date2 传统的排序方法是按日期1排序,然后按日期2排序相同的值。这意味着无论何时我回到date2,这些值都将位于结果集的顶部(或底部)。我想将date2值与date1值交错 换句话说,我想按(date1!=null?date1:date2)排序 这在lucene有可能吗 我认为我可以在索引创建阶段这样做(只需将相关的日期值放在一个新字段中),但我对索引过程没有足够的控制能力来做到这一点,
马特我有一个可行的想法:
- 使用
- 要创建排序对象,请使用构造函数
- 为两个日期字段创建一个排序字段。对于它们中的每一个,使用a来处理空值的情况。在这种情况下,Compare()函数将返回零。 请参阅关于在JavaLucene中使用自定义排序的内容。我相信这并不难翻译成Lucene.net
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]];
}
}
我的ActualRorTemperationDateSortComparatorSource在FieldCache\u Fields.DEFAULT中传递,我们离开了 呃,我讨厌针对.Net这样特定平台的Lucene问题。。我也有同样的问题,但在另一个平台上,我希望解决方案是平台独立的:(