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 }
Searcher

相关文章:

  • 2022-12-23
  • 2022-03-04
  • 2022-12-23
  • 2021-09-14
  • 2022-12-23
  • 2022-12-23
  • 2022-01-02
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-12-24
  • 2021-08-14
  • 2021-10-18
  • 2021-11-21
相关资源
相似解决方案