现在的位置: 首页 > 综合 > 正文

一步一步学lucene——(第四步:搜索篇)

2012年01月22日 ⁄ 综合 ⁄ 共 1262字 ⁄ 字号 评论关闭

下面说的主要是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

抱歉!评论已关闭.