一步一步学lucene——(第四步:搜索篇)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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}