Lucene 第一个应用

  • 第一个应用

    在本章中,我们将学习Lucene Framework的实际编程。在开始使用Lucene框架编写第一个示例之前,必须确保已按照Lucene-环境设置 教程中的说明正确设置了Lucene环境。建议您具有Eclipse IDE的工作知识。
    现在,让我们编写一个简单的“搜索应用程序”,它将打印找到的搜索结果数量。我们还将看到在此过程中创建的索引列表。
  • 第1步-创建Java项目

    第一步是使用Eclipse IDE创建一个简单的Java项目。遵循选项File> New-> Project,最后从向导列表中选择Java Project向导。现在,使用向导窗口将您的项目命名为LuceneFirstApplication,如下所示:
    lucene
    成功创建项目后,您的项目资源管理器中将具有以下内容-
    lucene
  • 第2步-添加所需的库

    现在让我们在项目中添加Lucene核心Framework库。为此,请右键单击您的项目名称LuceneFirstApplication,然后按照上下文菜单中可用的以下选项进行操作:构建路径->配置构建路径以显示Java构建路径窗口,如下所示-
    lucene
    现在使用“库”选项卡下的“添加外部JAR”按钮从Lucene安装目录添加以下核心JAR-lucene-core-8.7.0
  • 第3步-创建源文件

    现在让我们在LuceneFirstApplication项目下创建实际的源文件。首先,我们需要创建一个名为com.jc2182.lucene的包。为此,请在“包资源管理器”部分中的src上单击鼠标右键,然后选择:New-> Package。
    接下来,我们将在com.jc2182.lucene包下创建LuceneTester.java和其他Java类。
    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");
       }
    }
    
    Indexer.java - 此类用于对原始数据建立索引,以便我们可以使用Lucene库对其进行搜索。
    
    package com.jc2182.lucene;
    
    import java.io.File;
    import java.io.FileFilter;
    import java.io.FileReader;
    import java.io.IOException;
    
    import org.apache.lucene.analysis.standard.StandardAnalyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    import org.apache.lucene.index.CorruptIndexException;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    import org.apache.lucene.util.Version;
    
    public class Indexer {
    
       private IndexWriter writer;
    
       public Indexer(String indexDirectoryPath) throws IOException {
          //this directory will contain the indexes
          Directory indexDirectory = 
             FSDirectory.open(new File(indexDirectoryPath));
    
          //create the indexer
          writer = new IndexWriter(indexDirectory, 
             new StandardAnalyzer(Version.LUCENE_36),true, 
             IndexWriter.MaxFieldLength.UNLIMITED);
       }
    
       public void close() throws CorruptIndexException, IOException {
          writer.close();
       }
    
       private Document getDocument(File file) throws IOException {
          Document document = new Document();
    
          //index file contents
          Field contentField = new Field(LuceneConstants.CONTENTS, new FileReader(file));
          //index file name
          Field fileNameField = new Field(LuceneConstants.FILE_NAME,
             file.getName(),Field.Store.YES,Field.Index.NOT_ANALYZED);
          //index file path
          Field filePathField = new Field(LuceneConstants.FILE_PATH,
             file.getCanonicalPath(),Field.Store.YES,Field.Index.NOT_ANALYZED);
    
          document.add(contentField);
          document.add(fileNameField);
          document.add(filePathField);
    
          return document;
       }   
    
       private void indexFile(File file) throws IOException {
          System.out.println("Indexing "+file.getCanonicalPath());
          Document document = getDocument(file);
          writer.addDocument(document);
       }
    
       public int createIndex(String dataDirPath, FileFilter filter) 
          throws IOException {
          //get all files in the data directory
          File[] files = new File(dataDirPath).listFiles();
    
          for (File file : files) {
             if(!file.isDirectory()
                && !file.isHidden()
                && file.exists()
                && file.canRead()
                && filter.accept(file)
             ){
                indexFile(file);
             }
          }
          return writer.numDocs();
       }
    }
    
    Searcher.java - 此类用于搜索由索引器创建的索引以搜索请求的内容。
    
    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";
       Indexer indexer;
       Searcher searcher;
    
       public static void main(String[] args) {
          LuceneTester tester;
          try {
             tester = new LuceneTester();
             tester.createIndex();
             tester.search("Mohan");
          } catch (IOException e) {
             e.printStackTrace();
          } catch (ParseException e) {
             e.printStackTrace();
          }
       }
    
       private void createIndex() throws IOException {
          indexer = new Indexer(indexDir);
          int numIndexed;
          long startTime = System.currentTimeMillis(); 
          numIndexed = indexer.createIndex(dataDir, new TextFileFilter());
          long endTime = System.currentTimeMillis();
          indexer.close();
          System.out.println(numIndexed+" File indexed, time taken: "
             +(endTime-startTime)+" ms");     
       }
    
       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));
          for(ScoreDoc scoreDoc : hits.scoreDocs) {
             Document doc = searcher.getDocument(scoreDoc);
                System.out.println("File: "
                + doc.get(LuceneConstants.FILE_PATH));
          }
          searcher.close();
       }
    }
    
  • 第4步-创建数据和索引目录

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