为什么80%的码农都做不了架构师?>>>
在Lucene4.6中,想要实现搜索结果按照时间倒序的效果:如果两个文档得分相同,那么就按照发布时间倒序排列;否则就按照分数排列。这种效果在 Lucene4.6中实现起来极其简单,直接利用search接口的Sort参数即可达成,完全不需要像某些人说的重写Similarity那么麻烦。三 两行代码的事情,体现了Make it simple, stupid的精髓。
package com.hankcs.test;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.*;
import org.apache.lucene.queries.CustomScoreQuery;
import org.apache.lucene.queries.function.FunctionQuery;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;import org.wltea.analyzer.lucene.IKAnalyzer;
import java.io.IOException;
/** * @author hankcs */
public class TestSortByTime{ public static void main(String[] args) { // Lucene Document的主要域名 String fieldName &#61; "text"; // 实例化IKAnalyzer分词器 Analyzer analyzer &#61; new IKAnalyzer(); Directory directory &#61; null; IndexWriter iwriter; IndexReader ireader &#61; null; IndexSearcher isearcher; try { //索引过程********************************** //建立内存索引对象 directory &#61; new RAMDirectory(); //配置IndexWriterConfig IndexWriterConfig iwConfig &#61; new IndexWriterConfig(Version.LUCENE_46, analyzer); iwConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND); iwriter &#61; new IndexWriter(directory, iwConfig); //写入索引 for (int i &#61; 0; i < 3; &#43;&#43;i) { int year &#61; 2004 &#43; i; Document doc &#61; new Document(); doc.add(new TextField(fieldName, year &#43; "全民突击攻略", Field.Store.YES));doc.add(new IntField("date", year * 10000 &#43; 1111, Field.Store.YES)); iwriter.addDocument(doc);} // 加入一个干扰文档 Document doc &#61; new Document(); doc.add(new TextField(fieldName, "天天酷跑攻略", Field.Store.YES)); doc.add(new IntField("date", 20141111, Field.Store.YES)); iwriter.addDocument(doc); iwriter.close(); //搜索过程********************************** //实例化搜索器 ireader &#61; DirectoryReader.open(directory); isearcher &#61; new IndexSearcher(ireader); String keyword &#61; "全民突击攻略"; //使用QueryParser查询分析器构造Query对象 QueryParser qp &#61; new QueryParser(Version.LUCENE_46, fieldName, analyzer); Query query &#61; qp.parse(keyword); System.out.println("Query &#61; " &#43; query); //搜索相似度最高的5条记录 Sort sort &#61; new Sort(new SortField("text", SortField.Type.SCORE), new SortField("date", SortField.Type.INT, true)); TopDocs topDocs &#61; isearcher.search(query, 5, sort); System.out.println("命中&#xff1a;" &#43; topDocs.totalHits); //输出结果 ScoreDoc[] scoreDocs &#61; topDocs.scoreDocs; for (int i &#61; 0; i < Math.min(5, scoreDocs.length); i&#43;&#43;){ Document targetDoc &#61; isearcher.doc(scoreDocs[i].doc); System.out.print(targetDoc.getField(fieldName).stringValue()); System.out.print(" , " &#43; targetDoc.getField("date").numericValue()); System.out.println(" , " &#43; scoreDocs[i].score); } } catch (CorruptIndexException e) { e.printStackTrace(); } catch (LockObtainFailedException e) { e.printStackTrace(); } catch (IOException e){ e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } finally { if (ireader !&#61; null) {try{ ireader.close(); } catch (IOException e) { e.printStackTrace(); } } if (directory !&#61; null) { try { directory.close(); } catch (IOException e) {e.printStackTrace(); } } } }}