3.2节我们已经运行了一个Lucene实现检索的小程序,这一节我们将以这个小程序为例,讲一下Lucene检索的基本步骤,同时介绍关键词高亮显示和分页返回结果这两个有用的技巧。
一、Lucene检索的基本步骤
1 import java.nio.file.Paths; 2 import java.io.*; 3 4 import org.apache.lucene.analysis.standard.StandardAnalyzer; 5 import org.apache.lucene.document.Document; 6 import org.apache.lucene.index.DirectoryReader; 7 import org.apache.lucene.queryparser.classic.QueryParser; 8 import org.apache.lucene.search.IndexSearcher; 9 import org.apache.lucene.search.Query; 10 import org.apache.lucene.search.ScoreDoc; 11 import org.apache.lucene.search.TopDocs; 12 import org.apache.lucene.store.Directory; 13 import org.apache.lucene.store.FSDirectory; 14 import org.apache.lucene.util.Version; 15 16 /** 17 * @author csl 18 * @description: 19 * 依赖jar:Lucene-core,lucene-analyzers-common,lucene-queryparser 20 * 作用:使用索引搜索文件 21 */ 22 public class Searcher { 23 public static Version luceneVersion = Version.LATEST; 24 /** 25 * 查询内容 26 */ 27 public static String indexSearch(String keywords){ 28 String res = ""; 29 DirectoryReader reader = null; 30 try{ 31 // 1、创建Directory 32 Directory directory = FSDirectory.open(Paths.get("index"));//在硬盘上生成Directory 33 // 2、创建IndexReader 34 reader = DirectoryReader.open(directory); 35 // 3、根据IndexReader创建IndexSearcher 36 IndexSearcher searcher = new IndexSearcher(reader); 37 // 4、创建搜索的query 38 // 创建parse用来确定搜索的内容,第二个参数表示搜索的域 39 QueryParser parser = new QueryParser("content",new StandardAnalyzer());//content表示搜索的域或者说字段 40 Query query = parser.parse(keywords);//被搜索的内容 41 // 5、根据Searcher返回TopDocs 42 TopDocs tds = searcher.search(query, 20);//查询20条记录 43 // 6、根据TopDocs获取ScoreDoc 44 ScoreDoc[] sds = tds.scoreDocs; 45 // 7、根据Searcher和ScoreDoc获取搜索到的document对象 46 int cou=0; 47 for(ScoreDoc sd:sds){ 48 cou++; 49 Document d = searcher.doc(sd.doc); 50 // 8、根据document对象获取查询的字段值 51 /** 查询结果中content为空,是因为索引中没有存储content的内容,需要根据索引path和name从原文件中获取content**/ 52 res+=cou+". "+d.get("path")+" "+d.get("name")+" "+d.get("content")+"\n"; 53 } 54 55 56 }catch(Exception e){ 57 e.printStackTrace(); 58 }finally{ 59 //9、关闭reader 60 try { 61 reader.close(); 62 } catch (IOException e) { 63 e.printStackTrace(); 64 } 65 } 66 return res; 67 } 68 public static void main(String[] args) throws IOException 69 { 70 System.out.println(indexSearch("你好")); //搜索的内容可以修改 71 } 72 }