zoukankan      html  css  js  c++  java
  • (转)Lucene.net实现自定义排序笔记

    本文转载自:http://www.cnblogs.com/kwklover/archive/2007/07/28/834819.html

    在Lucene.net实现自定义排序,需要实现两个Lucene.Net.Search的两个接口:
    public interface SortComparatorSource
    {
       ScoreDocComparator NewComparator(IndexReader reader , System.String fieldname) ;
    }

    public interface ScoreDocComparator
    {
       int Compare(ScoreDoc i , ScoreDoc j) ;
       System.IComparable SortValue(ScoreDoc i) ;
       int SortType() ;
    }

    涉及到的一个类:
    public class ScoreDoc
    {
       public float score ;
       public int doc ;
       public ScoreDoc(int doc , float score)
       {
          this.doc = doc ;
          this.score = score ;
       }
    }

    Lucene.net 2.0包含的SortType有:
    在Lucene.Net.Search.SortField里定义的:
    public class SortField
    {
       public const int SCORE = 0 ;  //相关度
       public const int DOC = 1 ;    //文挡号
       public const int AUTO = 2 ;   //自动识别
       public const int STRING = 3 ; //字符型
       public const int INT = 4 ;    //int
       public const int FLOAT = 5 ;  //float
       public const int CUSTOM = 9 ; //自定义
       .....
    }

    少了DateTime,那就实现DateTime类型的自定义排序来测试下:
    Lucene.Net.Search.ScoreDocComparator接口的实现类:
        public class DateDocComparator : Lucene.Net.Search.ScoreDocComparator
        {
            private string fieldname = null;
            private System.IComparable[] cachedValues ;

            public DateDocComparator(System.IComparable[] cachedValues, string fieldname)
            {
                this.cachedValues = cachedValues;
                this.fieldname = string.Intern(fieldname) ;
            }

            public int Compare(ScoreDoc i, ScoreDoc j)
            {
                return this.cachedValues[i.doc].CompareTo(this.cachedValues[j.doc]) ;
            }

            public System.IComparable SortValue(ScoreDoc i)
            {
                return this.cachedValues[i.doc] ;
            }

            public int SortType()
            {
                return Lucene.Net.Search.SortField.CUSTOM ;
            }
        }

    Lucene.Net.Search.SortComparatorSource接口的实现类:
        public class DateSortComparatorSource : Lucene.Net.Search.SortComparatorSource
        {
            public ScoreDocComparator NewComparator(Lucene.Net.Index.IndexReader reader, System.String field)
            {
                return new DateDocComparator(GetCustom(reader, field), field);
            }

            protected virtual System.IComparable[] GetCustom(Lucene.Net.Index.IndexReader reader, System.String field)
            {
                    System.IComparable[] retArray = new System.IComparable[reader.MaxDoc()];
                    Lucene.Net.Index.TermDocs termDocs = reader.TermDocs();
                    Lucene.Net.Index.TermEnum termEnum = reader.Terms(new Lucene.Net.Index.Term(field, ""));
                    try
                    {
                        do
                        {
                            Lucene.Net.Index.Term term = termEnum.Term();
                            if (term == null || term.Field() != field)
                                break;
                            System.IComparable termval = Lucene.Net.Documents.DateTools.StringToDate(term.Text()) ;
                            termDocs.Seek(termEnum);
                            while (termDocs.Next())
                            {
                                retArray[termDocs.Doc()] = termval;
                            }
                        }
                        while (termEnum.Next());
                    }
                    finally
                    {
                        termDocs.Close();
                        termEnum.Close();
                    }
                    return retArray;
            }
        }

    使用:
    Sort sort = new Sort(new SortField("datecreated",new DateSortComparatorSource(),true)) ;

  • 相关阅读:
    HLG 1522 子序列的和【队列的应用】
    POJ 3273 Monthly Expense【二分】
    HDU 4004 The Frog's Games 【二分】
    POJ 2001 Shortest Prefixes【第一棵字典树】
    POJ 2823 Sliding Window【单调对列经典题目】
    HDU 1969 Pie 【二分】
    POJ 3125 Printer Queue【暴力模拟】
    POJ 3250 Bad Hair Day【单调栈】
    字典树【模板】
    验证码 Code
  • 原文地址:https://www.cnblogs.com/wpcnblog/p/2394093.html
Copyright © 2011-2022 走看看