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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

下面说的主要是lucene如何进行搜索,相比于建索引,搜索可能更能提起大家的兴趣。lucene的主要搜索的API

下面通过表格来看一下lucene用到的主要的搜索API

类目的

IndexSeacher搜索操作的入口,所有搜索操作都是通过IndexSeacher实例使用一个重载的search方法来实现

Query(及其子类)具体的Query子类为每一种特定类型的查询进行逻辑上的封装。Query实例被传递到IndexSearcher的search方法中

QueryParser将用户输入的(并且可读的)查询表达式处理为一个具体的Query对象

TopDocs保持由IndexSearcher.search()方法返回的具有较高评分的顶部文档

ScoreDoc提供对TopDocs中每条搜索结果的访问接口

对特定项进行搜索

其中IndexSearcher是对索引中文档进行搜索的核心类,我们下面的例子中就会对subject域进行索引,使用的是Query的子类TermQuery。

测试程序如下:

1p u b l i c v o i d t e s t T e r m()t h r o w s E x c e p t i o n{

2D i r e c t o r y d i r=T e s t U t i l.g e t B o o k I n d e x D i r e c t o r y();//A

3I n d e x S e a r c h e r s e a r c h e r=n e w I n d e x S e a r c h e r(d i r);//B

4

5T e r m t=n e w T e r m("s u b j e c t","a n t");

6Q u e r y q u e r y=n e w T e r m Q u e r y(t);

7T o p D o c s d o c s=s e a r c h e r.s e a r c h(q u e r y,10);

8a s s e r t E q u a l s("A n t i n A c t i o n",//C

91,d o c s.t o t a l H i t s);//C

10

11t=n e w T e r m("s u b j e c t","j u n i t");

12d o c s=s e a r c h e r.s e a r c h(n e w T e r m Q u e r y(t),10);

13a s s e r t E q u a l s("A n t i n A c t i o n,"+//D

14"J U n i t i n A c t i o n,S e c o n d E d i t i o n",//D

152,d o c s.t o t a l H i t s);//D

16

17s e a r c h e r.c l o s e();

18d i r.c l o s e();

19}

当然在不同的情况下你可以改变其中的代码来搜索你想要的东西。

解析用户查询

lucene中解析用户的查询需要一个Query对象作为参数。那么也就是将Expression组合成Query的过程,这里边有一个对象叫QueryParser,它将前面传过来的规则的解析成对象然后进行查询。下面我们看下流程是如何处理的:

图:QueryParser对象处理复杂的表达式的过程

下面看一个程序示例,这个是基于lucene 3.0的,在后面的版本中会有所变化。

程序结构如下:

1p u b l i c v o i d t e s t Q u e r y P a r s e r()t h r o w s E x c e p t i o n{

2D i r e c t o r y d i r=T e s t U t i l.g e t B o o k I n d e x D i r e c t o r y();

3I n d e x S e a r c h e r s e a r c h e r=n e w I n d e x S e a r c h e r(d i r);

4

5Q u e r y P a r s e r p a r s e r=n e w Q u e r y P a r s e r(V e r s i o n.L U C E N E_30,//A

6"c o n t e n t s",//A

7n e w S i m p l e A n a l y z e r());//A

8

9Q u e r y q u e r y=p a r s e r.p a r s e("+J U N I T+A N T-M O C K");//B

10T o p D o c s d o c s=s e a r c h e r.s e a r c h(q u e r y,10);

11a s s e r t E q u a l s(1,d o c s.t o t a l H i t s);

12D o c u m e n t d=s e a r c h e r.d o c(d o c s.s c o r e D o c s[0].d o c);

13a s s e r t E q u a l s("A n t i n A c t i o n",d.g e t("t i t l e"));

14

15q u e r y=p a r s e r.p a r s e("m o c k O R j u n i t");//B

16d o c s=s e a r c h e r.s e a r c h(q u e r y,10);

17a s s e r t E q u a l s("A n t i n A c t i o n,"+

18"J U n i t i n A c t i o n,S e c o n d E d i t i o n",

192,d o c s.t o t a l H i t s);

20

21s e a r c h e r.c l o s e();

22d i r.c l o s e();

23}

相关文档
最新文档