lucene 源代码的分析(search部分)

来源:互联网 发布:追魂call软件 编辑:程序博客网 时间:2024/05/24 06:52

lucene的源代码中各种调用关系不是非常明显,往往你中有我,我中有你,这种写程序的方法对于初次接触的源码的人多少有些困惑,但是从整个程序的结构上来讲,这样的工具包使用起来会更加方便一些,封装的层次性较好,扩展性高。这种抽象的思想很值的研究。

      下面是笔者对lucene中search的主体部分(org.apache.lucene.seach)进行的分析。常见的search的用法是这样的  

       IndexReader reader = IndexReader.open(index);

       Searcher searcher=new IndexSearcher(reader);

       Query query=...................;//use two methods to construct a query

       Hits hits=searcher.search(query);

      ................//       ouput  the search results in Hits

     这段普通的查找程序里面各种类之间的协作关系是怎样的,通过对代码的分析不难得到下面的UML图

  

 

       Searcher类继承Searchable接口,Searcher类提供了一些便利的方法以供用户调用,如search(Query query),search(Query query,Filter filter)等,这些方法内部实际将真正的查找委托给Hits类,search方法返回一个Hits对象,这里就存在调用Hits的构造方法,Hits提供了两个构造方法Hits(Searcher s, Query q, Filter f), Hits(Searcher s, Query q, Filter f, Sort o),分别提供了Filter和Sort,对结果进行处理。

      然而Hits的查询功能又是委托给了Searcher类,通过调用Searcher的抽象方法

             void  search(Weight weight, Filter filter, HitCollector results),

            TopDocs search(Weight weight, Filter filter, int n) ,

             TopFieldDocs search(Weight weight, Filter filter, int n, Sort sort)

完成,可以说Hits只是一个中间工具,本质的查询还是在Searcher类中,然而Hits提供了一些缓冲,提供了对文档相似度得分的规范化。Hits中的对查询的调用完全是面向接口的编程,这样可以保证将来扩展的需要。

     所有Searcher的子类如IndexSearcher必须将Searcher类的抽象方法实现。IndexSearcher中进行查找的核心方法是search(Weight weight, Filter filter, final HitCollector results),该方法会将结果保存到HitCollector中,具体的实现是声明一个新的HitCollector对象,提供抽象函数collect的实现,该collect的主要功能是调用results中的collect方法(该方法应该能够收集查询结果)。然后调用Scorer类的score()方法,提供的参数为刚才新创建的HitCollector类的对象,由于score方法的是实现是调用参数的collect方法,那么该步调用之后,results中保存的便是查找到的结果。

     其中值得注意的是,所有实质的查找都包括一个Weight类作为参数,该Weight类主要和Query类相关,一般通过Query.weight(Searcher)来获得一个Weight对象,Weight提供方法返回一个Scorer,由此可见Weight类主要是记录输入的查询的权重,并提供针对该查询的Scorer(对结果的打分)。

     以上只是进行查找的类之间的大概关系,对于IndexSearcher来讲,Index的信息的获取还是通过IndexReader来完成,由于整个工具包之间进行了很好的类的划分,这种调用关系是模糊的,但是类的功能和大小粒度是合适。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/smartGay/archive/2007/08/20/1751496.aspx

原创粉丝点击