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

Lucene - 搜索操作

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

搜索过程是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
l>