基于Heritrix+Lucene的搜索引擎构建(5)——搜索部分

Lucene提供了检索工具,在基于Lucene实现检索时,我们主要使用以下几个类(或接口):
1)IndexSearcher:是lucene中最基本的检索工具,所有的检索都会用到IndexSearcher工具;
2)Query:查询,lucene中支持模糊查询,语义查询,短语查询,组合查询等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些类。
3)QueryParser: 是一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query对象。
4)Hits:在搜索完成之后,需要把搜索结果返回并显示给用户,只有这样才算是完成搜索的目的。在lucene中,搜索的结果的集合是用Hits类的实例来表示的。
5)Analyzer:分析器,主要用于分析搜索引擎遇到的各种文本。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。

以下是实现对已经建立的索引进行检索的实例,Search.java:

 1 package GEsearcher.search;
 2 
 3 import java.io.IOException;
 4 
 5 import jeasy.analysis.MMAnalyzer;
 6 
 7 import org.apache.lucene.analysis.Analyzer;
 8 import org.apache.lucene.analysis.standard.StandardAnalyzer;
 9 import org.apache.lucene.index.Term;
10 import org.apache.lucene.queryParser.MultiFieldQueryParser;
11 import org.apache.lucene.queryParser.ParseException;
12 import org.apache.lucene.search.Hits;
13 import org.apache.lucene.search.IndexSearcher;
14 import org.apache.lucene.search.Query;
15 import org.apache.lucene.search.Sort;
16 import org.apache.lucene.search.TermQuery;
17 
18 import GEsearcher.systemconfig.Config;
19 
20 public class Search {
21 
22     private String indexpath;
23     private Hits hits;
24     private String searchkey;
25     
26     public Search(String searchkey)
27     {
28         //this.indexpath=indexpath;
29         this.searchkey=searchkey;
30         this.indexpath=new Config().getIndexpath(); //配置索引文件所在的目录
31         DoSearch();
32     }
33     
34     public void DoSearch()
35     {
36         try {
37             IndexSearcher searcher=new IndexSearcher(indexpath);  //检索工具
38             String keyVal = searchkey.toLowerCase().replaceAll("(or|and)", "")
39             .trim().replaceAll("\\s+", " AND ");
40             Analyzer analyzer =  new MMAnalyzer();  //分词分析工具
41             //*//
42             //Analyzer analyzer =  new StandardAnalyzer();
43             String[] fields = {"title","content"}; 
44             MultiFieldQueryParser mt=new MultiFieldQueryParser(fields,analyzer);                       
45             Query query =mt.parse(keyVal);    //查询
46             //*/
47             //Term t = new Term("content", keyVal);
48             //Query query = new TermQuery(t);
49             hits=searcher.search(query,Sort.RELEVANCE);//获取按照文档得分排序好命中文档
50             }
51         
52             catch (ParseException e) {
53                 // TODO Auto-generated catch block
54                 e.printStackTrace(); 
55             }
56              catch (IOException e) {
57             // TODO Auto-generated catch block
58             e.printStackTrace();
59         }
60     }
61     
62     public Hits getHits()
63     {
64         return hits;
65     }
66 }

 

 

在以上代码中,Query接口的使用的是MultiFieldQueryParser返回的MultiFieldQuery对象,也就是多字段查询实现。

而Analyzer则使用je-easyAnalyzer的MMAnalyzer类对象。

其中,代码String keyVal = searchkey.toLowerCase().replaceAll("(or|and)", "") .trim().replaceAll("\\s+", " AND ");只是简单的去除掉用户在检索界面上使用的“or、and”等逻辑连接词。

一个检索返回的结果是Hits类的对形象,Hits类对象封装了匹配文档集合的信息。

一个简单的检索实例即可通过这几个类(接口)来实现,当然,功能更加强大、检索更加智能的实现的检索还需要发费工夫去研究和开发的。

你可能感兴趣的:(Heritrix)