搜索过程是Lucene提供的核心功能之一.下图说明了该过程及其用途. IndexSearcher是搜索过程的核心组件之一.
我们首先创建包含索引的目录,然后将其传递给 IndexSearcher ,然后使用 Directory 打开目录 的IndexReader 的.然后我们使用 Term 创建 Query ,并使用 IndexSearcher 通过将 Query 传递给搜索器进行搜索. IndexSearcher 返回 TopDocs 对象,其中包含搜索详细信息以及作为搜索操作结果的文档的文档ID.
我们现在将向您展示一种逐步的方法,并使用基本示例帮助您理解索引过程.
创建QueryParser
QueryParser类将用户输入的输入解析为Lucene可理解的格式查询.按照以下步骤创建QueryParser :
步骤1 : 创建QueryParser的对象.
步骤2 : 初始化使用标准分析器创建的QueryParser对象,该分析器具有要在其上运行此查询的版本信息和索引名称.
QueryParser queryParser;public Searcher(String indexDirectoryPath) throws IOException { queryParser = new QueryParser(Version.LUCENE_36, LuceneConstants.CONTENTS, new StandardAnalyzer(Version.LUCENE_36));}
创建IndexSearcher
IndexSearcher类充当索引期间创建的搜索器索引的核心组件处理.按照以下步骤创建IndexSearcher :
步骤1 : 创建IndexSearcher的对象.
步骤2 : 创建一个Lucene目录,该目录应指向要存储索引的位置.
步骤3 : 初始化使用索引目录创建的IndexSearcher对象.
IndexSearcher indexSearcher;public Searcher(String indexDirectoryPath) throws IOException { Directory indexDirectory = FSDirectory.open(new File(indexDirectoryPath)); indexSearcher = new IndexSearcher(indexDirectory);}
进行搜索
按照以下步骤进行搜索和减号;
第1步 : 通过QueryParser解析搜索表达式来创建Query对象.
步骤2 : 通过调用IndexSearcher.search()方法进行搜索.
Query query;public TopDocs search( String searchQuery) throws IOException, ParseException { query = queryParser.parse(searchQuery); return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);}
获取文档
以下程序显示了如何获取文档.
public Document getDocument(ScoreDoc scoreDoc) throws CorruptIndexException, IOException { return indexSearcher.doc(scoreDoc.doc);}
关闭IndexSearcher
以下程序显示如何关闭IndexSearcher.
public void close() throws IOException { indexSearcher.close();}
示例应用程序
让我们创建一个测试Lucene应用程序来测试搜索过程.
Step | 描述 |
---|---|
1 | 在包 com.it1352.lucene LuceneFirstApplication 的项目>如 Lucene - First Application 章节所述.您还可以使用本章中 Lucene - First Application 章节中创建的项目来了解搜索过程. |
2 | 创建 LuceneConstants.java, TextFileFilter.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;}
TextFileFilter.java
此类用作 .txt 文件过滤器.
package com.it1352.lucene; import java.io.File;import java.io.FileFilter;public class TextFileFilter implements FileFilter { @Override public boolean accept(File pathname) { return pathname.getName().toLowerCase().endsWith(".txt"); }}
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.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 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.queryParser.ParseException;import org.apache.lucene.search.ScoreDoc;import org.apache.lucene.search.TopDocs;public class LuceneTester { String indexDir = "E:\\Lucene\\Index"; String dataDir = "E:\\Lucene\\Data"; Searcher searcher; public static void main(String[] args) { LuceneTester tester; try { tester = new LuceneTester(); tester.search("Mohan"); } catch (IOException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } } private void search(String searchQuery) throws IOException, ParseException { searcher = new Searcher(indexDir); long startTime = System.currentTimeMillis(); TopDocs hits = searcher.search(searchQuery); 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.println("File: "+ doc.get(LuceneConstants.FILE_PATH)); } searcher.close(); }}
数据&索引目录创建
我们使用10个名为record1.txt的文本文件来记录包含学生姓名和其他详细信息的record10.txt,并将它们放在目录E:\ Lucene \ Data中. 测试数据.应将索引目录路径创建为E:\ Lucene \ Index.在 Lucene - 索引过程章节中运行索引程序后,您可以看到在该文件夹中创建的索引文件列表.
运行程序
完成源,原始数据,数据目录,索引目录和索引的创建后,您可以继续编译和运行程序.为此,请将 LuceneTester.Java 文件选项卡保持活动状态,并使用Eclipse IDE中提供的"运行"选项或使用 Ctrl + F11 编译并运行 LuceneTesterapplication 的.如果您的应用程序成功运行,它将在Eclipse IDE的控制台中打印以下消息 :
1 documents found. Time :29 msFile: E:\Lucene\Data\record4.txt