摘要: 本系列文章将详细描述几乎最新版本的Lucene的基本原理和代码分析。其中总体架构和索引文件格式是Lucene 2.9的,索引过程分析是Lucene 3.0的。鉴于索引文件格式没有太大变化,因而原文没有更新,原理和架构的文章中引用了前辈的一些图,可能属于早期的Lucene,但不影响对原理和架构的理解。本系列文章尚在撰写之中,将会有Java CC, 分词器,QueryParser,查询语句与查询对象等章节。Lucene学习总结之七:Lucene搜索过程解析(1) http://www.cnblogs.com/forfuture1978/archive/2010/04/04/1704242.html 阅读全文
posted @ 2010-04-04 18:42 刘超觉先 阅读(7443) 评论(5) 推荐(5) 编辑
摘要: 2.4、搜索查询对象 2.4.4、收集文档结果集合及计算打分 在函数IndexSearcher.search(Weight, Filter, int) 中,有如下代码: TopScoreDocCollector collector = TopScoreDocCollector.create(nDocs, !weight.scoresDocsOutOfOrder()); search(weight, filter, collector); return collector.topDocs(); 2.4.4.1、创建结果文档收集器 TopScoreDocCollector collector... 阅读全文
posted @ 2010-04-04 18:12 刘超觉先 阅读(5365) 评论(0) 推荐(0) 编辑
摘要: 2.4、搜索查询对象 2.4.3、进行倒排表合并 在得到了Scorer对象树以及SumScorer对象树后,便是倒排表的合并以及打分计算的过程。 合并倒排表在此节中进行分析,而Scorer对象树来进行打分的计算则在下一节分析。 BooleanScorer2.score(Collector) 代码如下: public void score(Collector collector) throws IOException { collector.setScorer(this); while ((doc = countingSumScorer.nextDoc()) != NO_MORE... 阅读全文
posted @ 2010-04-04 18:05 刘超觉先 阅读(11895) 评论(1) 推荐(1) 编辑
摘要: 2.4、搜索查询对象 2.4.1.2、创建Weight对象树 BooleanQuery.createWeight(Searcher) 最终返回return new BooleanWeight(searcher),BooleanWeight构造函数的具体实现如下: public BooleanWeight(Searcher searcher) { this.similarity = getSimilarity(searcher); weights = new ArrayList<Weight>(clauses.size()); //也是一个递归的过程,沿着新的Query对象树一... 阅读全文
posted @ 2010-04-04 17:53 刘超觉先 阅读(5777) 评论(4) 推荐(0) 编辑
摘要: 2.3、QueryParser解析查询语句生成查询对象代码为:QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "contents", new StandardAnalyzer(Version.LUCENE_CURRENT)); Query query = parser.parse("+(+apple* -boy) (cat* dog) -(eat~ foods)");此过程相对复杂,涉及JavaCC,QueryParser,分词器,查询语法等,本章不会详细论述,会在后面的章节中一一 阅读全文
posted @ 2010-04-04 17:40 刘超觉先 阅读(7005) 评论(3) 推荐(1) 编辑
摘要: 二、Lucene搜索详细过程 为了解析Lucene对索引文件搜索的过程,预先写入索引了如下几个文件: file01.txt: apple apples cat dog file02.txt: apple boy cat category file03.txt: apply dog eat etc file04.txt: apply cat foods 2.1、打开IndexReader指向索引文件夹 代码为: IndexReader reader = IndexReader.open(FSDirectory.open(indexDir)); 其实是调用了DirectoryReader.open 阅读全文
posted @ 2010-04-04 17:31 刘超觉先 阅读(7788) 评论(0) 推荐(0) 编辑
摘要: 一、Lucene搜索过程总论 搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程。 其可用如下图示: 总共包括以下几个过程: IndexReader打开索引文件,读取并打开指向索引文件的流。 用户输入查询语句 将查询语句转换为查询对象Query对象树 构造Weight对象树,用于计算词的权重Term Weight,也即计算打分公式中与仅与搜索语句相关与文档无关的部分(红色部分)。 构造Scorer对象树,用于计算打分(TermScorer.score())。 在构造Scorer对象树的过程中,其叶子节点... 阅读全文
posted @ 2010-04-04 17:27 刘超觉先 阅读(8910) 评论(1) 推荐(1) 编辑