开发手册 欢迎您!
软件开发者资料库

Lucene - 排序

Lucene排序 - 使用java从简单易用的步骤学习Lucene,使用从Lucene搜索引擎,索引类,搜索类,索引过程,索引操作,搜索操作,查询编程,分析,排序等基础到高级知识的初学者教程。

在本章中,我们将研究Lucene默认提供搜索结果的排序顺序,或者可以根据需要进行操作.

按相关性排序

这是Lucene使用的默认排序模式. Lucene通过顶部最相关的命中提供结果.

private void sortUsingRelevance(String searchQuery)   throws IOException, ParseException {   searcher = new Searcher(indexDir);   long startTime = System.currentTimeMillis();      //create a term to search file name   Term term = new Term(LuceneConstants.FILE_NAME, searchQuery);   //create the term query object   Query query = new FuzzyQuery(term);   searcher.setDefaultFieldSortScoring(true, false);   //do the search   TopDocs hits = searcher.search(query,Sort.RELEVANCE);   long endTime = System.currentTimeMillis();   System.out.println(hits.totalHits +      " documents found. Time :" + (endTime - startTime) + "ms");   for(ScoreDoc scoreDoc : hits.scoreDocs) {      Document doc = searcher.getDocument(scoreDoc);      System.out.print("Score: "+ scoreDoc.score + " ");      System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));   }   searcher.close();}

按IndexOrder排序

此排序模式由Lucene使用.这里,索引的第一个文档首先显示在搜索结果中.

private void sortUsingIndex(String searchQuery)   throws IOException, ParseException {   searcher = new Searcher(indexDir);   long startTime = System.currentTimeMillis();      //create a term to search file name   Term term = new Term(LuceneConstants.FILE_NAME, searchQuery);   //create the term query object   Query query = new FuzzyQuery(term);   searcher.setDefaultFieldSortScoring(true, false);   //do the search   TopDocs hits = searcher.search(query,Sort.INDEXORDER);   long endTime = System.currentTimeMillis();   System.out.println(hits.totalHits +      " documents found. Time :" + (endTime - startTime) + "ms");   for(ScoreDoc scoreDoc : hits.scoreDocs) {      Document doc = searcher.getDocument(scoreDoc);      System.out.print("Score: "+ scoreDoc.score + " ");      System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));   }   searcher.close();}

示例应用程序

让我们创建一个测试Lucene应用程序来测试排序过程.

Step描述
1

在包 com.it1352.lucene 下创建一个名为 LuceneFirstApplication 的项目 Lucene  -  First Application 章节中所述.您还可以使用本章中 Lucene  -  First Application 章节中创建的项目来了解搜索过程.

2

创建 LuceneConstants.java Searcher.java ,如 Lucene  -  First Application 章节所述.保持其余文件不变.

3

创建 LuceneTester.java ,如下所述.

4

清理并构建应用程序确保业务逻辑按照要求运行.

LuceneConstants.java

此类用于提供在示例应用程序中使用的各种常量.

package com.it1352.lucene; public class LuceneConstants {   public static final String CONTENTS = "contents";   public static final String FILE_NAME = "filename";   public static final String FILE_PATH = "filepath";   public static final int MAX_SEARCH = 10;}

Searcher.java

此类用于读取对原始数据和使用Lucene库搜索数据.

  package com.it1352.lucene; import java.io.File;import java.io.IOException;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.index.CorruptIndexException;import org.apache.lucene.queryParser.ParseException;import org.apache.lucene.queryParser.QueryParser;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.TopDocs;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.util.Version;public class Searcher {IndexSearcher indexSearcher;   QueryParser queryParser;   Query query;   public Searcher(String indexDirectoryPath) throws IOException {      Directory indexDirectory          = FSDirectory.open(new File(indexDirectoryPath));      indexSearcher = new IndexSearcher(indexDirectory);      queryParser = new QueryParser(Version.LUCENE_36,         LuceneConstants.CONTENTS,         new StandardAnalyzer(Version.LUCENE_36));   }   public TopDocs search( String searchQuery)       throws IOException, ParseException {      query = queryParser.parse(searchQuery);      return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);   }   public TopDocs search(Query query)       throws IOException, ParseException {      return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);   }   public TopDocs search(Query query,Sort sort)       throws IOException, ParseException {      return indexSearcher.search(query,          LuceneConstants.MAX_SEARCH,sort);   }   public void setDefaultFieldSortScoring(boolean doTrackScores,       boolean doMaxScores) {      indexSearcher.setDefaultFieldSortScoring(         doTrackScores,doMaxScores);   }   public Document getDocument(ScoreDoc scoreDoc)       throws CorruptIndexException, IOException {      return indexSearcher.doc(scoreDoc.doc);   }   public void close() throws IOException {      indexSearcher.close();   }}

LuceneTester.java

此类用于测试搜索Lucene库的功能.

  package com.it1352.lucene; import java.io.IOException;import org.apache.lucene.document.Document;import org.apache.lucene.index.Term;import org.apache.lucene.queryParser.ParseException;import org.apache.lucene.search.FuzzyQuery;import org.apache.lucene.search.Query;import org.apache.lucene.search.ScoreDoc;import org.apache.lucene.search.Sort;import org.apache.lucene.search.TopDocs;public class LuceneTester {   String indexDir = "E:\\Lucene\\Index";   String dataDir = "E:\\Lucene\\Data";   Indexer indexer;   Searcher searcher;   public static void main(String[] args) {      LuceneTester tester;      try {          tester = new LuceneTester();          tester.sortUsingRelevance("cord3.txt");          tester.sortUsingIndex("cord3.txt");      } catch (IOException e) {          e.printStackTrace();      } catch (ParseException e) {          e.printStackTrace();      }   }   private void sortUsingRelevance(String searchQuery)      throws IOException, ParseException {      searcher = new Searcher(indexDir);      long startTime = System.currentTimeMillis();            //create a term to search file name      Term term = new Term(LuceneConstants.FILE_NAME, searchQuery);      //create the term query object      Query query = new FuzzyQuery(term);      searcher.setDefaultFieldSortScoring(true, false);      //do the search      TopDocs hits = searcher.search(query,Sort.RELEVANCE);      long endTime = System.currentTimeMillis();      System.out.println(hits.totalHits +         " documents found. Time :" + (endTime - startTime) + "ms");      for(ScoreDoc scoreDoc : hits.scoreDocs) {         Document doc = searcher.getDocument(scoreDoc);         System.out.print("Score: "+ scoreDoc.score + " ");         System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));      }      searcher.close();   }   private void sortUsingIndex(String searchQuery)      throws IOException, ParseException {      searcher = new Searcher(indexDir);      long startTime = System.currentTimeMillis();      //create a term to search file name      Term term = new Term(LuceneConstants.FILE_NAME, searchQuery);      //create the term query object      Query query = new FuzzyQuery(term);      searcher.setDefaultFieldSortScoring(true, false);      //do the search      TopDocs hits = searcher.search(query,Sort.INDEXORDER);      long endTime = System.currentTimeMillis();      System.out.println(hits.totalHits +      " documents found. Time :" + (endTime - startTime) + "ms");      for(ScoreDoc scoreDoc : hits.scoreDocs) {         Document doc = searcher.getDocument(scoreDoc);         System.out.print("Score: "+ scoreDoc.score + " ");         System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));      }      searcher.close();   }}

数据&索引目录创建

我们使用了record1.txt中的10个文本文件到包含学生姓名和其他详细信息的record10.txt,并将它们放在 E:\ Lucene目录中\ Data. 测试数据.应将索引目录路径创建为E:\ Lucene \ Index.在 Lucene  - 索引过程章节中运行索引程序后,您可以看到在该文件夹中创建的索引文件列表.

运行程序

完成源,原始数据,数据目录,索引目录和索引的创建后,您可以编译并运行程序.为此,请保持 LuceneTester.Java 文件选项卡处于活动状态,并使用Eclipse IDE中提供的"运行"选项或使用 Ctrl + F11 编译并运行 LuceneTester 应用程序.如果您的应用程序成功运行,它将在Eclipse IDE的控制台中打印以下消息 :

10 documents found. Time :31msScore: 1.3179655 File: E:\Lucene\Data\record3.txtScore: 0.790779 File: E:\Lucene\Data\record1.txtScore: 0.790779 File: E:\Lucene\Data\record2.txtScore: 0.790779 File: E:\Lucene\Data\record4.txtScore: 0.790779 File: E:\Lucene\Data\record5.txtScore: 0.790779 File: E:\Lucene\Data\record6.txtScore: 0.790779 File: E:\Lucene\Data\record7.txtScore: 0.790779 File: E:\Lucene\Data\record8.txtScore: 0.790779 File: E:\Lucene\Data\record9.txtScore: 0.2635932 File: E:\Lucene\Data\record10.txt10 documents found. Time :0msScore: 0.790779 File: E:\Lucene\Data\record1.txtScore: 0.2635932 File: E:\Lucene\Data\record10.txtScore: 0.790779 File: E:\Lucene\Data\record2.txtScore: 1.3179655 File: E:\Lucene\Data\record3.txtScore: 0.790779 File: E:\Lucene\Data\record4.txtScore: 0.790779 File: E:\Lucene\Data\record5.txtScore: 0.790779 File: E:\Lucene\Data\record6.txtScore: 0.790779 File: E:\Lucene\Data\record7.txtScore: 0.790779 File: E:\Lucene\Data\record8.txtScore: 0.790779 File: E:\Lucene\Data\record9.txt
})