在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实现自定义排序相关推荐

  1. 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法

    数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...

  2. SpringDataJpA复杂查询实现自定义排序

    需求: 列表页面实现按合同状态自定义排序 private Specification<TblContractPre> whereClause(final TblContractPre en ...

  3. .NET/C#中对自定义对象集合进行自定义排序的方法

    一个集合可否排序,要看系统知不知道排序的规则,像内建的系统类型,int ,string,short,decimal这些,系统知道怎么排序,而如果一个集合里面放置的是自定义类型,比如自己定义了一个Car ...

  4. MapReduce编程实例之自定义排序

    任务描述: 给出一组数据,自定义排序的样式,第一列降序,相同时第二列升序 example Data: 2013 1 2013 5 2014 5 2014 8 2015 9 2015 4 Code: p ...

  5. R语言dplyr包arrage函数排序dataframe实战:单列排序、多列排序、自定义排序

    R语言dplyr包arrage函数排序dataframe实战:单列排序.多列排序.自定义排序 目录 R语言dplyr包arrage函数排序dataframe实战:单列排序.多列排序

  6. pandas dataframe中的列进行重新排序、倒排、正排、自定义排序详解及实践

    pandas dataframe中的列进行重新排序,pandas dataframe列重排.倒排.正排.自定义排序详解及实践 实施数据构建: import pandas as pd import nu ...

  7. 先随机后排序的oracle,Oracle用decode函数或CASE-WHEN实现自定义排序

    Oracle用decode函数或CASE-WHEN实现自定义排序 1 问题 对SQL排序,只要在order by后面加字段就可以了,可以通过加desc或asc来选择降序或升序.但排序规则是默认的,数字 ...

  8. java hashmap 无序,【Java】HashMap自定义排序

    HashMap中的对象根据成员进行自定义排序 Map是Java中最常用的存储对象的集合类之一,存储在HashMap中的对象在取出时是无序的,下文以示例介绍了如果对HashMap中存储的对象根据成员进行 ...

  9. DEV控件自定义排序实现

    一般的控件或者组件都支持按照某一列进行排序.但是,这种排序是根据数据源里的数据默认按照降序或升序排序的,同时这样的排序与字段的类型有关. 假设现在字段的类型是字符串类型 ,但是,存储的数据时数字加一些 ...

最新文章

  1. 计算机二级ms office excel,计算机二级Msoffice考试excel答案.docx
  2. Android开发常用工具类
  3. 9种高性能高可用高并发的技术架构
  4. 【示例】Lucene创建索引库编程步骤
  5. (转)快速统计二进制中1的个数
  6. 内核中用于数据接收的结构体struct msghdr以及iovec介绍
  7. 什么是VGA光纤收发器?
  8. python实现排列组合公式算法_朴素贝叶斯算法的Python实现
  9. LeetCode - Medium - 264. Ugly Number II
  10. 获知哪个函数调用了本函数及它的类名
  11. Linux Socket学习--面向非连接的协议
  12. Java基础__Integer类型中的自动装箱
  13. 拓端tecdat|R语言基于Garch波动率预测的区制转移交易策略
  14. css的写法 有点凌乱(养成这习惯 神马浏览器兼容都是浮云 so easy)
  15. tsql 和 clr 的性能实测比对
  16. 5款开源BI系统倾力推荐,企业信息化的利器
  17. 关于html的实训日志,满足你的甜蜜幻想, 《我与她的实习日志》登陆NS
  18. epson l201 l200清零软件 中文版 l111 l101清零软件 L350 L353 清零软件
  19. 谷歌浏览器翻译显示服务器失败,谷歌浏览器翻译失败怎么办
  20. 带状线超宽带电桥设计

热门文章

  1. spring boot整合freemarker及freemarker基础语法超详细讲解
  2. jQuery easyUI--zTree属性菜单
  3. Spring的jar包下载及目录详解
  4. Qt动态库的链接问题
  5. Oracle 原理: 公有同义词 和 私有同义词
  6. python打包成exe_【Python】使用pyinstaller打包成exe文件时可以显示图片的方法
  7. linux下system函数的深入理解
  8. linux / 终端常用快捷键
  9. android okio使用方法,Android 开源框架 Okio 原理剖析
  10. 百度商业大规模微服务分布式监控系统-凤睛