现在开发搜索系统,使用的是开源界比较推崇的Lucene,版本是Maven库上面的3.5,这个版本里面有很多方法都不建议使用了。所以代码创建的方式
有那么点变化,我使用的分词器是IkAnalyzer。Lucene全文检索的功能是很强大的,我们在做电子商务系统的时候肯定是会遇到排序的问题,比如
销量,比如价格等等,为了方便客户我们便需要Lucene的排序功能,其实Lucene中的排序很简单也很方便,我们在创建搜索器的时候增加一个Sort
就行了,Sort的构造函数需要SortField,具体大家可以去参考Lucene的源代码,我下面写了一个简单的例子来演示怎么使用。代码如下:

    import java.io.IOException;   import java.util.Locale;   import org.apache.lucene.analysis.Analyzer;   import org.apache.lucene.document.Document;   import org.apache.lucene.document.Field;   import org.apache.lucene.document.Field.Index;   import org.apache.lucene.document.Field.Store;   import org.apache.lucene.index.IndexReader;   import org.apache.lucene.index.IndexWriter;   import org.apache.lucene.index.IndexWriterConfig;   import org.apache.lucene.search.FieldComparator;   import org.apache.lucene.search.FieldComparatorSource;   import org.apache.lucene.search.IndexSearcher;   import org.apache.lucene.search.Query;   import org.apache.lucene.search.ScoreDoc;   import org.apache.lucene.search.Sort;   import org.apache.lucene.search.SortField;   import org.apache.lucene.search.TopDocs;   import org.apache.lucene.store.RAMDirectory;   import org.apache.lucene.util.Version;   import org.junit.Test;   import org.wltea.analyzer.lucene.IKAnalyzer;   import org.wltea.analyzer.lucene.IKQueryParser;   import org.wltea.analyzer.lucene.IKSimilarity;   public class LuceneSortTest {   /**  * Lucene排序查询  */  @Test  public void testSort() throws Exception{   String name = "name";   String field = "price";   String names[] = {"衣服","睡衣","漂亮衣服","好看衣服","男士衣服","女士衣服"};   double price[] = {12.0,13.0,8.8,9.6,7.5,12.1};   RAMDirectory dir = new RAMDirectory();   Analyzer analyzer = new IKAnalyzer();   IndexWriterConfig cfg = new IndexWriterConfig(Version.LUCENE_35, analyzer);   IndexWriter writer = new IndexWriter(dir, cfg);   for (int i=0;i<names.length;i++) {   Document doc = new Document();   doc.add(new Field(name, names[i], Store.YES, Index.ANALYZED));   doc.add(new Field(field, String.valueOf(price[i]), Store.YES, Index.NOT_ANALYZED));   writer.addDocument(doc);   }   writer.commit();   writer.close();   IndexReader reader = IndexReader.open(dir);   Query query = IKQueryParser.parse(name, "衣服");   Sort sort = new Sort(new SortField(field,SortField.DOUBLE,true)); //排序 false 升序 true降序   IndexSearcher isearcher = new IndexSearcher(reader);   isearcher.setSimilarity(new IKSimilarity());   TopDocs topDocs =  isearcher.search(query, 5, sort);   ScoreDoc scoreDocs[] = topDocs.scoreDocs;   for (ScoreDoc scoreDoc : scoreDocs) {   Document doc =  isearcher.doc(scoreDoc.doc);   System.out.println(doc.get(field));   }   isearcher.close();   dir.close();   }   }  

在SortField里面有很多静态常量来提供给排序器作为排序的依据,Lucene里面自己定义好的排序实现已经基本能够满足我们的需求了,如果自己想定义一个自己的排序算法,那么可以继承FieldComparatorSource实现里面的方法:

public FieldComparator newComparator(String fieldname, int numHits,int sortPos, boolean reversed) throws IOException {// TODO Auto-generated method stubreturn new DoubleFieldComparatorSource.DoubleFieldComparator();}

里面的FieldComparator是一个抽象类,主要就是用来作比较使用的,定义自己的排序算法关键也在于继承这个抽象类,然后实现里面的方法,需要实现的方法如下:

class DoubleFieldComparator extends FieldComparator{@Overridepublic int compare(int slot1, int slot2) {return 0;}@Overridepublic void setBottom(int slot) {}@Overridepublic int compareBottom(int doc) throws IOException {return 0;}@Overridepublic void copy(int slot, int doc) throws IOException {ub}@Overridepublic void setNextReader(IndexReader reader, int docBase)throws IOException {}@Overridepublic Object value(int slot) {return null;}}

这里顺便列出Sort已经提供的比较值:

    SortField.SCORE 按积分排序   SortField.DOC 按文档排序   SortField.AUTO 域的值为int、long、float都有效   SortField.STRING 域按STRING排序   SortField.FLOAT   SortField.LONG   SortField.DOUBLE   SortField.SHORT   SortField.CUSTOM 通过比较器排序   SortField.BYTE   

转载于:https://www.cnblogs.com/lcuzhanglei/archive/2012/08/01/2618381.html

Lucene排序以及自定义排序相关推荐

  1. 在Lucene.net实现自定义排序

    在Lucene.net实现自定义排序,需要实现两个Lucene.Net.Search的两个接口: public interface SortComparatorSource {    ScoreDoc ...

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

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

  3. db2 某个字段排序_MySQL、Oracle、DB2等数据库常规排序、自定义排序和按中文拼音字母排序...

    MySQL常规排序.自定义排序和按中文拼音字母排序,在实际的SQL编写时,我们有时候需要对条件集合进行排序. 下面给出3中比较常用的排序方式,mark一下 1.常规排序ASC DESC ASC 正序 ...

  4. mysql按中文拼音字母排序_解析MySQL按常规排序、自定义排序和按中文拼音字母排序的方法...

    MySQL常规排序.自定义排序和按中文拼音字母排序,在实际的SQL编写时,我们有时候需要对条件集合进行排序.下面给出3种比较常用的排序方式,一起看看吧 MySQL常规排序.自定义排序和按中文拼音字母排 ...

  5. mysql 拼音排序_MySQL按常规排序、自定义排序和按中文拼音字母排序的方法

    MySQL常规排序.自定义排序和按中文拼音字母排序,在实际的SQL编写时,我们有时候需要对条件集合进行排序. 下面给出3种比较常用的排序方式,mark一下 1.常规排序ASC DESC ASC 正序 ...

  6. oracle 按照字母排序,MySQL、Oracle、DB2等数据库常规排序、自定义排序和按中文拼音字母排序...

    MySQL常规排序.自定义排序和按中文拼音字母排序,在实际的SQL编写时,我们有时候需要对条件集合进行排序. 下面给出3中比较常用的排序方式,mark一下 1.常规排序ASC DESC ASC 正序 ...

  7. mysql按中文拼音字母排序_MySQL按常规排序、自定义排序和按中文拼音字母排序的方法...

    MySQL常规排序.自定义排序和按中文拼音字母排序,在实际的SQL编写时,我们有时候需要对条件集合进行排序. 下面给出3种比较常用的排序方式,mark一下 1.常规排序ASC DESC ASC 正序 ...

  8. python 列表自定义排序_自定义排序的Python列表

    我有一个dicts列表: ldicts = [{'name': '120-150'}, {'name': '90-120'}, {'name': '150-180'}, {'name': '>= ...

  9. java 自定义对象 排序,使用自定义排序顺序对对象的ArrayList进行排序

    问题 我希望为我的地址簿应用程序实现一个排序功能. 我想排序anArrayList contactArray.Contact是一个包含四个字段的类:名称,家庭电话号码,手机号码和地址.我想排序name ...

最新文章

  1. iOS 汉字转拼音 PinYin4Objc
  2. 转载:比Python快100倍,利用spaCy和Cython实现高速NLP项目
  3. 触摸板库tslib的编译和配置
  4. TextBox控件中只输入整数的几种方法
  5. Ext.Net学习笔记10:Ext.Net ComboBox用法
  6. vb.net2.0 Hmac-md5加密算法
  7. idea报错Module Project1 must not contain source root ...\Project1\src. The root already belongs to .
  8. 在esx server VI里导入其它虚拟机
  9. 三维视觉前沿进展年度报告
  10. 多线程笔试题(linux)
  11. 诺基亚五摄手机终于发布了!拍摄能力无与伦比 售价699欧元
  12. Redis登陆服务器和批量删除指定的key
  13. java中有效关键字_java中有效的关键字
  14. android ajax chrome,chrome浏览器ajax请求状态200,response为空的探索
  15. Microsoft Visio premium2010激活
  16. 如何区分线性系统与时变系统
  17. BlockChain学习——Hash函数碰撞概率公式及其推导
  18. 解析:浏览器事件冒泡及事件捕获
  19. Stochastic Variance Reduced Ensemble Adversarial Attack for Boosting the Adversarial Transferability
  20. Smali语法学习三

热门文章

  1. 【Linux网络编程】TCP 和 UDP 数据报格式详解
  2. 【Linux系统编程】线程同步与互斥:POSIX无名信号量
  3. [Qt教程] 第29篇 XML(三)Qt中的SAX
  4. oledb vc访问mdb数据库_SQL SERVER数据库技术-1
  5. Win7运行QQ2010提示“应用程序无法启动”,因为应用程序的并行配置不正确
  6. 探究java-JVM的五步(三步)类加载机制(包含类加载过程的一些代码书写,如类加载代码)
  7. 如何在DB2安装重启后登陆Administrator系统账号
  8. 量子计算入门-第二部分
  9. CF-525E(E. Anya and Cubes) Meet-in-the-Middle
  10. C++ 程序内存泄漏检测方法