日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在Lucene.net实现自定义排序

發布時間:2024/10/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在Lucene.net实现自定义排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在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)) ;

轉載于:https://www.cnblogs.com/peida/archive/2008/11/27/1341920.html

總結

以上是生活随笔為你收集整理的在Lucene.net实现自定义排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。