百度空间 | 百度首页 
 
查看文章
 
lucene的各种搜索方式
2009-10-21 11:34
1.几个基础类简要介绍
.Query:表示一次查询
.Hits:表示一次查询的结果
.Filter:表示对索引中文档集合的过滤器,它使检索在某一个文档集合的子集中进行
.Sort:对索引的结果进行排序的工具
.HitCollector:对检索结果进行选择的一个工具,并将选择后的结果保存在其中
.Weight:就是"权重",表示一次查询时,索引中的某个文档的重要性

2.IndexSearcher类search方法可以分为三组
第一组:
public final Hits search(Query query)
public Hits search(Query query, Filter filter)
public Hits search(Query query, Sort sort)
返回值为一个Hits型的对象,它们通过一个Query对象,在索引中检索相关的文档,并返回检索
的结果

第二组:
public TopFieldDocs search(Query query, Filter filter, int n,Sort sort)
public TopDocs search(Weight weight, Filter filter, final int nDocs)
public TopFieldDocs search(Weight weight, Filter filter, final int nDocs,Sort sort)
public TopDocs search(Query query, Filter filter, int n)
返回的是TopDocs类型和TopFieldDocs(是TopDocs的一个子类)类型,它们表示索引中得分较高的文
档集合,该组方法中都带有一个int型的参数,它表示取出置于TopDocs集合中的文档的数量

第三组:
public void search(Query query, HitCollector results)
public void search(Query query, Filter filter, HitCollector results)
public void search(Weight weight, Filter filter,final HitCollector results)
返回值为空,但是并不是说它们不具备返回值的功能,这一组方法的参数中,都有一个HitCollector
类型的参数,该参数表示由这一组方法检索而返回的结果,将被保存在这个HitCollector对象中 

3.Hits内部缓存
Hits的缓存是一个Vector类型的对象,默认存放200个文档数量,如果当前链表的文档数量大于规定
的数量,则从中删除最后一个也就是不常使用的一个,如果缓存中没有或者是缓存不慎丢失,则从
searcher中重新取回Document

4.Query搜索相关
Query类是个抽象类
它有如下几种子类
TermQuery:词条搜索,它是lucene内最为简单也是最为原子的一种搜索方式。通过对某个固定词条的
指定,它实现了检索索引中存在的该词条的所有文档
BooleanQuery:布尔型查询就是一个由多个子句和子句(默认的最大子句数为1024,如果超过了这个数量,
会抛出TooManyClauses异常,用户可以通过BooleanQuery.setMaxClauseCount(int MaxClauseCount)
去更改其最大的子句数量)间的布尔逻辑所组成的查询,各种子句间都是如"与","或"这样的布尔
逻辑。布尔逻辑由三种情况去任意组合,它们分别是BooleanClause.Qccur.MUST
BooleanClause.Qccur.MUST_NOT  BooleanClause.Qccur.SHOULD
RangeQuery:提供对一定范围内的文档进行查找的途径,这种范围可以是时间、日期、数字大小等。  
PrifixQuery:根据前缀进行查找
PhraseQuery:短语搜索,对一个或多个关键字进行搜索。PhraseQuery.setSlop(int i)可以设定关键字
中允许插入无关的字的个数
MultiPhraseQuery:可以对多个短语同时进行搜索,指定前缀或后缀,或者同时指定前缀和后缀的搜索。
FuzzyQuery:模糊搜索,可以帮助用户进行单字的模糊查找,这里有个相似度的概念,它决定模糊匹配
时的严格程度。默认的相似度是0.5,当这个值越小时,通过模糊查找出的文档的匹配程度就越低
文档的数量也就越多,反之亦然。
WildcardQuery:通配符搜索,"*"表示0到多个字符,"?"表示一个单一的字符
SpanQuery:跨度搜索,这里的跨度是指一种数据源中每个词条的位置所构成的一个跨度

5.多域搜索(MultiFieldQueryParser)和多索引搜索(MultiSearcher)
每次构造一个IndexSearcher的实例时,只能打开一个索引就行搜索。如果此时系统的环境使用了多索
引目录的结构,即用户希望检索到的数据,可能被存放于多个索引目录随机的一个中,这样就无法进行检索
了,这时就必须借助于多域搜索MultiFieldQueryParser和多索引搜索MultiSearcher
注意:MultiSearcher是利用一个for循环将所有的IndexSearcher对象取出,然后顺序循环搜索并得出
结果,最后将结果合并返回给用户,在这个过程中,始终只有一个索引被搜索,其它索引目录处于等待状态
多线程搜索(ParalellMultiSearcher)可以很好的解决这个问题,一旦一个搜索的请求发出,所有索引可以
在同一时刻被检索,也就是被多个线程检索。这样,可以省去排队等待的时间,提高检索效率。但是实际情
况并非如此,结测试单核CPU和双核CPU环境中,ParalellMultiSearcher比MultiSearcher的检索效率要低
问题的根源可能是Lucene没有为ParalellMultiSearcher开设一个专门的线程池。这样每次都需要实例化新
线程,导致了性能的降低。

6.跨虚拟机器的搜索
java中的RMI提供了调用远程虚拟机中的对象方法的能力。可以通过RMI,获取远程虚拟机中的对象存根Stub
然后调用它的方法,并在远程虚拟机内执行,最后将结果返回本机进行处理。

类别:搜索引擎 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu