在Lucene.net实现自定义排序
生活随笔
收集整理的這篇文章主要介紹了
在Lucene.net实现自定义排序
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在Lucene.net實(shí)現(xiàn)自定義排序,需要實(shí)現(xiàn)兩個(gè)Lucene.Net.Search的兩個(gè)接口:
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() ;
}
涉及到的一個(gè)類(lèi):
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 ;??//相關(guān)度
?? public const int DOC = 1 ;????//文擋號(hào)
?? public const int AUTO = 2 ;?? //自動(dòng)識(shí)別
?? public const int STRING = 3 ; //字符型
?? public const int INT = 4 ;????//int
?? public const int FLOAT = 5 ;??//float
?? public const int CUSTOM = 9 ; //自定義
?? ..
}
少了DateTime,那就實(shí)現(xiàn)DateTime類(lèi)型的自定義排序來(lái)測(cè)試下:
Lucene.Net.Search.ScoreDocComparator接口的實(shí)現(xiàn)類(lèi):
????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接口的實(shí)現(xiàn)類(lèi):
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)) ;
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() ;
}
涉及到的一個(gè)類(lèi):
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 ;??//相關(guān)度
?? public const int DOC = 1 ;????//文擋號(hào)
?? public const int AUTO = 2 ;?? //自動(dòng)識(shí)別
?? public const int STRING = 3 ; //字符型
?? public const int INT = 4 ;????//int
?? public const int FLOAT = 5 ;??//float
?? public const int CUSTOM = 9 ; //自定義
?? ..
}
少了DateTime,那就實(shí)現(xiàn)DateTime類(lèi)型的自定義排序來(lái)測(cè)試下:
Lucene.Net.Search.ScoreDocComparator接口的實(shí)現(xiàn)類(lèi):
????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接口的實(shí)現(xiàn)類(lèi):
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)) ;
轉(zhuǎn)載于:https://www.cnblogs.com/peida/archive/2008/11/27/1341920.html
總結(jié)
以上是生活随笔為你收集整理的在Lucene.net实现自定义排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: error LNK2019: unres
- 下一篇: js参数使用时常犯的一个低级错误