本文转自: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)) ;