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

    本文转自:http://www.cnblogs.com/peida/archive/2008/11/27/1341920.html

    在Lucene.net实现自定义排序,需要实现两个Lucene.Net.Search的两个接口:

     1 public interface SortComparatorSource
     2 {
     3    ScoreDocComparator NewComparator(IndexReader reader , System.String fieldname) ;
     4 }
     5 
     6 public interface ScoreDocComparator
     7 {
     8    int Compare(ScoreDoc i , ScoreDoc j) ;
     9    System.IComparable SortValue(ScoreDoc i) ;
    10    int SortType() ;
    11 }

    涉及到的一个类:

     1 public class ScoreDoc
     2 {
     3    public float score ;
     4    public int doc ;
     5    public ScoreDoc(int doc , float score)
     6    {
     7       this.doc = doc ;
     8       this.score = score ;
     9    }
    10 }

    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接口的实现类:

     1     public class DateDocComparator : Lucene.Net.Search.ScoreDocComparator 
     2     {
     3         private string fieldname = null;
     4         private System.IComparable[] cachedValues ;
     5 
     6         public DateDocComparator(System.IComparable[] cachedValues, string fieldname)
     7         {
     8             this.cachedValues = cachedValues;
     9             this.fieldname = string.Intern(fieldname) ;
    10         }
    11 
    12         public int Compare(ScoreDoc i, ScoreDoc j)
    13         {
    14             return this.cachedValues[i.doc].CompareTo(this.cachedValues[j.doc]) ;
    15         }
    16 
    17         public System.IComparable SortValue(ScoreDoc i)
    18         {
    19             return this.cachedValues[i.doc] ;
    20         }
    21 
    22         public int SortType()
    23         {
    24             return Lucene.Net.Search.SortField.CUSTOM ;
    25         }
    26     }

    Lucene.Net.Search.SortComparatorSource接口的实现类:

     1 public class DateSortComparatorSource : Lucene.Net.Search.SortComparatorSource
     2     {
     3         public ScoreDocComparator NewComparator(Lucene.Net.Index.IndexReader reader, System.String field)
     4         {
     5             return new DateDocComparator(GetCustom(reader, field), field);
     6         }
     7 
     8         protected virtual System.IComparable[] GetCustom(Lucene.Net.Index.IndexReader reader, System.String field)
     9         {
    10                 System.IComparable[] retArray = new System.IComparable[reader.MaxDoc()];
    11                 Lucene.Net.Index.TermDocs termDocs = reader.TermDocs();
    12                 Lucene.Net.Index.TermEnum termEnum = reader.Terms(new Lucene.Net.Index.Term(field, ""));
    13                 try
    14                 {
    15                     do
    16                     {
    17                         Lucene.Net.Index.Term term = termEnum.Term();
    18                         if (term == null || term.Field() != field)
    19                             break;
    20                         System.IComparable termval = Lucene.Net.Documents.DateTools.StringToDate(term.Text()) ;
    21                         termDocs.Seek(termEnum);
    22                         while (termDocs.Next())
    23                         {
    24                             retArray[termDocs.Doc()] = termval;
    25                         }
    26                     }
    27                     while (termEnum.Next());
    28                 }
    29                 finally
    30                 {
    31                     termDocs.Close();
    32                     termEnum.Close();
    33                 }
    34                 return retArray;
    35         }
    36     }

    使用:

    1 Sort sort = new Sort(new SortField("datecreated",new DateSortComparatorSource(),true)) ;
  • 相关阅读:
    深漂一年,一位程序员的2016年终告白
    Springlake-02 权限&文档设置&Role设置&Folder设置&登录
    Springlake-01 介绍&功能&安装
    IOS Socket 03-建立连接与登录
    IOS Socket 02-Socket基础知识
    IOS Socket 01-网络协议基础知识
    IOS Animation-CAKeyframeAnimation例子(简单动画实现)
    IOS Animation-CAShapeLayer、UIBezierPath与Animation的结合
    IOS Animation-动画基础、深入
    IOS Animation-CABasicAnimation例子(简单动画实现)
  • 原文地址:https://www.cnblogs.com/servant/p/3026418.html
Copyright © 2011-2022 走看看