代码之家  ›  专栏  ›  技术社区  ›  citizenmatt

如果lucene中的值为空,如何按具有可选值的字段排序?

  •  1
  • citizenmatt  · 技术社区  · 15 年前

    我想按日期字段(date1)对lucene(.net)搜索结果进行排序,但如果未设置date1,我想使用date2。

    传统的排序方法是按日期1排序,然后按日期2对相同的值进行排序。这意味着每当我回到date2时,这些值都将位于结果集的顶部(或底部)。我想将date2值与date1值交错。

    换言之,我想按(日期1)排序!= NULL?日期1:日期2)。

    这在lucene有可能吗?

    我想我可以在索引创建阶段这样做(只是把相关的日期值放在一个新的字段中),但我没有足够的索引过程控制能力来做到这一点,所以希望有一个排序解决方案。

    有什么想法吗?

    谢谢 马特

    2 回复  |  直到 15 年前
        1
  •  2
  •   citizenmatt    15 年前

    结果很简单。正如yuval建议的那样,您必须实现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]];
        }
    }
    

    我的actualorTemporationDateSortComparatorSource传入fieldcache_fields.default,我们离开了!

        2
  •  1
  •   Yuval F    15 年前

    我有一个可行的想法: