在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)) ;
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)) ;
关注 熵减黑客 ,一起学习成长

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端