Lucene - 通配符查询



WildcardQuery 用于使用通配符(如 '*' 代表任意字符序列,'?' 代表单个字符)搜索文档。

类声明

以下是 **org.apache.lucene.search.WildcardQuery** 类的声明:

public class WildcardQuery 
   extends MultiTermQuery 

字段

  • protected Term term

类构造函数

序号 构造函数 & 描述
1

WildcardQuery(Term term)

类方法

序号 方法 & 描述
1

boolean equals(Object obj)

2

protected FilteredTermEnum getEnum(IndexReader reader)

构建要使用的枚举,扩展模式项。

3

Term getTerm()

返回模式项。

4

int hashCode()

5

String toString(String field)

打印此查询的用户可读版本。

继承的方法

此类继承自以下类:

  • org.apache.lucene.search.MultiTermQuery
  • org.apache.lucene.search.Query
  • java.lang.Object

用法

private void searchUsingWildCardQuery(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 WildcardQuery(term); 
   //do the search 
   TopDocs hits = searcher.search(query); 
   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(); 
} 

示例应用程序

让我们创建一个测试 Lucene 应用程序来测试使用 WildcardQuery 进行搜索。

步骤 描述
1

创建一个名为 *LuceneFirstApplication* 的项目,放在 *com.tutorialspoint.lucene* 包下,如 *Lucene - 第一个应用程序* 章节所述。您也可以使用 *Lucene - 第一个应用程序* 章节中创建的项目,以便理解搜索过程。

2

创建 *LuceneConstants.java* 和 *Searcher.java*,如 *Lucene - 第一个应用程序* 章节所述。保持其余文件不变。

3

创建如下所示的 *LuceneTester.java*。

4

清理并构建应用程序,以确保业务逻辑按要求工作。

LuceneConstants.java

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

package com.tutorialspoint.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.tutorialspoint.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 TopDocs search(Query query) throws IOException, ParseException { 
      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.tutorialspoint.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.WildcardQuery; 

import org.apache.lucene.search.Query; 
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.searchUsingWildCardQuery("record1*"); 
      } catch (IOException e) { 
         e.printStackTrace(); 
      } catch (ParseException e) { 
         e.printStackTrace(); 
      } 
   } 
	
   private void searchUsingWildCardQuery(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 WildcardQuery(term); 
      //do the search 
      TopDocs hits = searcher.search(query); 
      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** 编译并运行 **LuceneTester** 应用程序。如果应用程序一切正常,这将在 Eclipse IDE 的控制台中打印以下消息:

2 documents found. Time :47ms 
File: E:\Lucene\Data\record1.txt 
File: E:\Lucene\Data\record10.txt
lucene_query_programming.htm
广告

© . All rights reserved.