下面说的主要是lucene如何进行搜索,相比于建索引,搜索可能更能提起大家的兴趣。
lucene的主要搜索的API
下面通过表格来看一下lucene用到的主要的搜索API
类 | 目的 |
IndexSeacher | 搜索操作的入口,所有搜索操作都是通过IndexSeacher实例使用一个重载的search方法来实现 |
Query(及其子类) | 具体的Query子类为每一种特定类型的查询进行逻辑上的封装。Query实例被传递到IndexSearcher的search方法中 |
QueryParser | 将用户输入的(并且可读的)查询表达式处理为一个具体的Query对象 |
TopDocs | 保持由IndexSearcher.search()方法返回的具有较高评分的顶部文档 |
ScoreDoc | 提供对TopDocs中每条搜索结果的访问接口 |
对特定项进行搜索
其中IndexSearcher是对索引中文档进行搜索的核心类,我们下面的例子中就会对subject域进行索引,使用的是Query的子类TermQuery。
测试程序如下:
View Code
1 public void testTerm() throws Exception { 2 Directory dir = TestUtil.getBookIndexDirectory(); //A 3 IndexSearcher searcher = new IndexSearcher(dir); //B 4 5 Term t = new Term("subject", "ant"); 6 Query query = new TermQuery(t); 7 TopDocs docs = searcher.search(query, 10); 8 assertEquals("Ant in Action", //C 9 1, docs.totalHits); //C 10 11 t = new Term("subject", "junit"); 12 docs = searcher.search(new TermQuery(t), 10); 13 assertEquals("Ant in Action, " + //D 14 "JUnit in Action, Second Edition", //D 15 2, docs.totalHits); //D 16 17 searcher.close(); 18 dir.close(); 19 }
当然在不同的情况下你可以改变其中的代码来搜索你想要的东西。
解析用户查询
lucene中解析用户的查询需要一个Query对象作为参数。那么也就是将Expression组合成Query的过程,这里边有一个对象叫QueryParser,它将前面传过来的规则的解析成对象然后进行查询。下面我们看下流程是如何处理的:
图:QueryParser对象处理复杂的表达式的过程
下面看一个程序示例,这个是基于lucene 3.0的,在后面的版本中会有所变化。
程序结构如下:
View Code
1 public void testQueryParser() throws Exception {
2 Directory dir = TestUtil.getBookInd