Lucene - 搜索操作

  • 简述

    搜索过程是Lucene提供的核心功能之一。下图说明了该过程及其使用。IndexSearcher 是搜索过程的核心组件之一。
    检索过程
    我们首先创建目录(S)包含索引,然后将它传递给IndexSearcher的这将打开目录使用的IndexReader。然后我们创建一个带有TermQuery并通过将Query传递给搜索器来使用IndexSearcher进行搜索。IndexSearcher的返回TopDocs对象包含与所述的文档ID(S)沿着搜索细节文献这是搜索操作的结果。
    现在,我们将向您展示一个逐步的方法,并使用一个基本示例帮助您理解索引过程。
  • 创建一个查询解析器

    QueryParser 类将用户输入的输入解析为 Lucene 可理解格式的查询。按照以下步骤创建一个 QueryParser -
    Step 1 − 创建 QueryParser 对象。
    Step 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 -
    Step 1 − 创建IndexSearcher 对象。
    Step 2 − 创建一个 Lucene 目录,该目录应指向要存储索引的位置。
    Step 3 − 初始化使用索引目录创建的 IndexSearcher 对象。
    
    IndexSearcher indexSearcher;
    public Searcher(String indexDirectoryPath) throws IOException {
       Directory indexDirectory = 
          FSDirectory.open(new File(indexDirectoryPath));
       indexSearcher = new IndexSearcher(indexDirectory);
    }
    
  • 进行搜索

    按照以下步骤进行搜索 -
    Step 1 − 通过QueryParser 解析搜索表达式,创建一个Query 对象。
    Step 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。
    
    public void close() throws IOException {
       indexSearcher.close();
    }
    
  • 示例应用

    让我们创建一个测试 Lucene 应用程序来测试搜索过程。
    步骤 描述
    1
    创建一个名称的项目LuceneFirstApplication一个包下com.jc2182.lucene作为解释Lucene的-第一个应用程序的章节。您也可以使用在Lucene - First Application章节中创建的项目来理解本章的搜索过程。
    2
    按照Lucene - First Application章节中的说明创建LuceneConstants.java、TextFileFilter.javaSearcher.java。保持其余文件不变。
    3
    如下所述创建LuceneTester.java
    4
    清理并构建应用程序以确保业务逻辑按照要求工作。

    LuceneConstants.java

    此类用于提供要在整个示例应用程序中使用的各种常量。
    
    package com.jc2182.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.jc2182.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.jc2182.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.jc2182.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 - Indexing Process,您可以看到在该文件夹中创建的索引文件列表。
  • 运行程序

    完成源、原始数据、数据目录、索引目录和索引的创建后,您可以继续编译和运行程序。为此,请保持LuceneTester.Java 激活文件选项卡并使用 Eclipse IDE 中提供的运行选项或使用 Ctrl + F11 编译并运行你的 LuceneTesterapplication. 如果您的应用程序成功运行,它将在 Eclipse IDE 的控制台中打印以下消息 -
    
    1 documents found. Time :29 ms
    File: E:\Lucene\Data\record4.txt