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类对象封装了匹配文档集合的信息。
一个简单的检索实例即可通过这几个类(接口)来实现,当然,功能更加强大、检索更加智能的实现的检索还需要发费工夫去研究和开发的。