(转)Lucene.net实现自定义排序笔记
2012-03-13 16:42
288 查看
本文转载自:/article/4708943.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)) ;
在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)) ;
相关文章推荐
- Lucene.net实现自定义排序笔记
- Lucene.net实现自定义排序笔记
- 在Lucene.net实现自定义排序
- java Lucene 中自定义排序的实现
- Lucene 中的 自定义排序的实现
- Lucene关于实现Similarity自定义排序
- Lucene 中自定义排序的实现
- Beta笔记——搜索引擎的设计与实现(1):使用Lucene.Net建立索引与中文分词
- Lucene.Net 实现groupby并可以加入自定义过滤功能
- Asp.net学习笔记----使用GridView+ObjectDataSource进行自定义分页排序
- Lucene 中自定义排序的实现
- java Lucene 中自定义排序的实现
- 一步一步跟我学习lucene(13)---lucene搜索之自定义排序的实现原理和编写自己的自定义排序工具
- lucene自定义排序的实现
- 自定义ASP.NET Identity(三)- 实现自定义MySQL ASP.NET Identity存储提供程序
- Lucene.net实现全文搜索
- asp.net mvc 简易通用自定义Pager实现分页
- 仿造Baidu简单实现基于Lucene.net的全文检索的功能
- BIEE11G实现自定义列排序规则
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十) 之 自定义系统消息和总结