摘要: 1、用GCC编译1.1、创建源文件(main.c) C 源文件 - main.c#include <stdio.h>#include “reciprocal.hpp”int main (int argc, char **argv){ int i; i = atoi (argv[1]); printf (“The reciprocal of %d is %g\n”, i, reciprocal (i)); return 0;}(reciprocal.cpp) C++ 源文件 - reciprocal.cpp#include <cassert>#include “recip 阅读全文
posted @ 2010-04-22 00:30 刘超觉先 阅读(1313) 评论(4) 推荐(1) 编辑
摘要: 本系列文章将详细描述几乎最新版本的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 刘超觉先 阅读(11894) 评论(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 刘超觉先 阅读(5776) 评论(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 刘超觉先 阅读(7787) 评论(0) 推荐(0) 编辑
摘要: 一、Lucene搜索过程总论 搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程。 其可用如下图示: 总共包括以下几个过程: IndexReader打开索引文件,读取并打开指向索引文件的流。 用户输入查询语句 将查询语句转换为查询对象Query对象树 构造Weight对象树,用于计算词的权重Term Weight,也即计算打分公式中与仅与搜索语句相关与文档无关的部分(红色部分)。 构造Scorer对象树,用于计算打分(TermScorer.score())。 在构造Scorer对象树的过程中,其叶子节点... 阅读全文
posted @ 2010-04-04 17:27 刘超觉先 阅读(8908) 评论(1) 推荐(1) 编辑
摘要: 一、HDFS的基本概念 1.1、数据块(block) HDFS(Hadoop Distributed File System)默认的最基本的存储单位是64M的数据块。 和普通文件系统相同的是,HDFS中的文件是被分成64M一块的数据块存储的。 不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间。 1.2、元数据节点(Namenode)和数据节点(datanode) 元数据节点用来管理文件系统的命名空间 其将所有的文件和文件夹的元数据保存在一个文件系统树中。 这些信息也会在硬盘上保存成以下文件:命名空间镜像(namespace imag... 阅读全文
posted @ 2010-03-14 02:00 刘超觉先 阅读(42504) 评论(8) 推荐(10) 编辑
摘要: 在进行Lucene的搜索过程解析之前,有必要单独的一张把Lucene score公式的推导,各部分的意义阐述一下。因为Lucene的搜索过程,很重要的一个步骤就是逐步的计算各部分的分数。 Lucene的打分公式非常复杂,如下: 在推导之前,先逐个介绍每部分的意义: t:Term,这里的Term是指包含域信息的Term,也即title:hello和content:hello是不同的Term coord(q,d):一次搜索可能包含多个搜索词,而一篇文档中也可能包含多个搜索词,此项表示,当一篇文档中包含的搜索词越多,则此文档则打分越高。 queryNorm(q):计算每个查询条目的方差和,... 阅读全文
posted @ 2010-03-07 00:18 刘超觉先 阅读(18183) 评论(10) 推荐(7) 编辑