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
- lucene 源代码的分析(search部分)
- lucene 源代码的分析(search部分)
- lucene源代码分析(index部分)
- lucene源代码分析(index部分)
- Lucene的特性分析 -- lucene的核心部分
- ARM linux的启动部分源代码简略分析(精)
- lucene的search分页实现
- Lucene4.10使用教程(四):lucene的Search(转)
- Lucene4源代码分析之二:Lucene简介
- Lua部分源代码分析(讨论lua的库是如何实现)
- FFmpeg的H.264解码器源代码简单分析:解析器(Parser)部分
- FFmpeg的H.264解码器源代码简单分析:熵解码(Entropy Decoding)部分
- FFmpeg的H.264解码器源代码简单分析:环路滤波(Loop Filter)部分
- FFmpeg的HEVC解码器源代码简单分析:解析器(Parser)部分
- FFmpeg的HEVC解码器源代码简单分析:CTU解码(CTU Decode)部分-PU
- FFmpeg的HEVC解码器源代码简单分析:CTU解码(CTU Decode)部分-TU
- FFmpeg的H.264解码器源代码简单分析:解析器(Parser)部分
- FFmpeg的H.264解码器源代码简单分析:解析器(Parser)部分
- MTK HISTROY 小结 2
- POJ 2135 Farm Tour(最小费用流)
- Lucene 2 教程
- 正确地对待bug的逻辑和态度
- lucene源代码分析(index部分)
- lucene 源代码的分析(search部分)
- lucene的索引文件
- 郭大侠的第一篇博文
- 我的收藏
- 单片机解密方法
- Amd+Vmware+Mac Os X10.6 虚拟机安装苹果操作系统时一些注意事项
- Your Freedom — 跨平台的代理软件
- ubuntu 下源代码编译安装
- asd sa dsa dsa