随笔分类 - Lucene原理与代码分析

摘要:我们来看最复杂的部分,就是Term Dictionary和Term Index文件,Term Dictionary文件的后缀名为tim,Term Index文件的后缀名是tip,格式如图所示。Term Dictionary文件首先是一个Header,接下来是PostingsHeader,这两个的格式... 阅读全文
posted @ 2014-08-29 21:14 刘超觉先 阅读(19602) 评论(2) 推荐(6) 编辑
摘要:词典的格式设计词典中所保存的信息主要是三部分:Term字符串Term的统计信息,比如文档频率(Document Frequency)倒排表的位置信息其中Term字符串如何保存是一个很大的问题,根据上一章基本原理的表述中,我们知道,写入文件的Term是按照字典顺序排好序的,那么如何将这些排好序的Ter... 阅读全文
posted @ 2014-08-28 10:23 刘超觉先 阅读(21485) 评论(5) 推荐(10) 编辑
摘要:Lucene应用开发揭秘华章培训网地址:http://www.hztraining.com/bbs/showtopic-1954.aspxChinaPub地址:http://product.china-pub.com/3502099&ref=xiliegoumai注意事项:由于本人是首次录制此类视频,不完美之处敬请谅解此系列课程主要包涵三大部分,一是搜索引擎的原理,二是lucene的深入解析及高级特性,三是实时搜索分布式搜索的框架解析及代码实现对于搜索引擎的原理部分,理论讲解比较多,有的部分内容较少,处于完整性的需要,还是作为单独的一节,可能视频时间较短,好在视频是分节销售的,本人已经 阅读全文
posted @ 2011-09-10 00:01 刘超觉先 阅读(8742) 评论(7) 推荐(3) 编辑
摘要:一、总体架构 Zoie是linkedin公司基于Lucene实现的实时搜索引擎系统,按照其官方wiki的描述为: http://snaprojects.jira.com/wiki/display/ZOIE/Overview Zoie is a realtime indexing and search system, and as such needs to have relatively close coupling between the logically distinct Indexing and Searching subsystems: as soon as a document m 阅读全文
posted @ 2010-11-29 21:19 刘超觉先 阅读(11564) 评论(10) 推荐(4) 编辑
摘要:在有关Lucene的问题(7),讨论了使用Lucene内存索引和硬盘索引构建实时索引的问题。 然而有的读者提到,如果涉及到文档的删除及更新,那么如何构建实时的索引呢?本节来讨论这个问题。 1、Lucene删除文档的几种方式 IndexReader.deleteDocument(int docID)是用 IndexReader 按文档号删除。 IndexReader.deleteDocuments(Term term)是用 IndexReader 删除包含此词(Term)的文档。 IndexWriter.deleteDocuments(Term term)是用 IndexWriter 删除包.. 阅读全文
posted @ 2010-06-27 14:17 刘超觉先 阅读(13387) 评论(7) 推荐(2) 编辑
摘要:Lucene 原理与代码分析系列文章已经基本告一段落,可能问题篇还会有新的更新。完整版pdf可由以下链接下载。Lucene 原理与代码分析完整版目录如下:目录目录第一篇:原理篇第一章:全文检索的基本原理一、总论二、索引里面究竟存些什么三、如何创建索引第一步:一些要索引的原文档(Document)。第二步:将原文档传给分次组件(Tokenizer)。第三步:将得到的词元(Token)传给语言处理组件(Linguistic Processor)。第四步:将得到的词(Term)传给索引组件(Indexer)。1.利用得到的词(Term)创建一个字典。2.对字典按字母顺序进行排序。3.合并相同的词(T 阅读全文
posted @ 2010-06-13 01:52 刘超觉先 阅读(48652) 评论(82) 推荐(72) 编辑
摘要:由于前一章所述的Lucene的事务性,使得Lucene可以增量的添加一个段,我们知道,倒排索引是有一定的格式的,而这个格式一旦写入是非常难以改变的,那么如何能够增量建索引呢?Lucene使用段这个概念解决了这个问题,对于每个已经生成的段,其倒排索引结构不会再改变,而增量添加的文档添加到新的段中,段之间在一定的时刻进行合并,从而形成新的倒排索引结构。 然而也正因为Lucene的事务性,使得Lucene的索引不够实时,如果想Lucene实时,则必须新添加的文档后IndexWriter需要commit,在搜索的时候IndexReader需要重新的打开,然而当索引在硬盘上的时候,尤其是索引非常大的时候 阅读全文
posted @ 2010-06-08 01:59 刘超觉先 阅读(11472) 评论(8) 推荐(5) 编辑
摘要:所谓事务性,本多指数据库的属性,包括ACID四个基本要素:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。 我们这里主要讨论隔离性,Lucene的IndexReader和IndexWriter具有隔离性。 当IndexReader.open打开一个索引的时候,相对于给当前索引进行了一次snapshot,此后的任何修改都不会被看到。 仅当IndexReader.open打开一个索引后,才有可能看到从上次打开后对索引的修改。 当IndexWriter没有调用Commit的时候,其修改的内容是不能够被看到的,哪怕... 阅读全文
posted @ 2010-06-07 01:39 刘超觉先 阅读(5810) 评论(0) 推荐(2) 编辑
摘要:1、抽象类Analyzer 其主要包含两个接口,用于生成TokenStream: TokenStream tokenStream(String fieldName, Reader reader); TokenStream reusableTokenStream(String fieldName, Reader reader) ; 所谓TokenStream,后面我们会讲到,是一个由分词后的Token结果组成的流,能够不断的得到下一个分成的Token。 为了提高性能,使得在同一个线程中无需再生成新的TokenStream对象,老的可以被重用,所以有reusableTokenStream一说... 阅读全文
posted @ 2010-06-06 22:14 刘超觉先 阅读(33611) 评论(0) 推荐(4) 编辑
摘要:Lucene学习总结之九:Lucene的查询对象(1)http://www.cnblogs.com/forfuture1978/archive/2010/05/19/1738803.htmlLucene学习总结之九:Lucene的查询对象(2)http://www.cnblogs.com/forfuture1978/archive/2010/05/19/1738804.htmlLucene学习总结之九:Lucene的查询对象(3)http://www.cnblogs.com/forfuture1978/archive/2010/05/19/1738805.html--------------- 阅读全文
posted @ 2010-05-19 02:35 刘超觉先 阅读(4409) 评论(1) 推荐(5) 编辑
摘要:Lucene除了支持查询语法以外,还可以自己构造查询对象进行搜索。 从上一节的Lucene的语法一章可以知道,能与查询语句对应的查询对象有:BooleanQuery,FuzzyQuery,MatchAllDocsQuery,MultiTermQuery,MultiPhraseQuery,PhraseQuery,PrefixQuery,TermRangeQuery,TermQuery,WildcardQuery。 Lucene还支持一些查询对象并没有查询语句与之对应,但是能够实现相对高级的功能,本节主要讨论这些高级的查询对象。 它们中间最主要的一些层次结构如下,我们将一一解析。 Query B. 阅读全文
posted @ 2010-05-19 02:29 刘超觉先 阅读(9091) 评论(4) 推荐(4) 编辑
摘要:5、SpanQuery 所谓SpanQuery也即在查询过程中需要考虑进Term的位置信息的查询对象。 SpanQuery中最基本的是SpanTermQuery,其只包含一个Term,与TermQuery所不同的是,其提供一个函数来得到位置信息: public Spans getSpans(final IndexReader reader) throws IOException { return new TermSpans(reader.termPositions(term), term); } Spans有以下方法: next() 得到下一篇文档号,不同的SpanQuery此方... 阅读全文
posted @ 2010-05-19 02:29 刘超觉先 阅读(2908) 评论(0) 推荐(1) 编辑
摘要:6、FilteredQuery FilteredQuery包含两个成员变量: Query query:查询对象 Filter filter:其有一个函数DocIdSet getDocIdSet(IndexReader reader) 得到一个文档号集合,结果文档必须出自此文档集合,注此处的过滤器所包含的文档号并不是要过滤掉的文档号,而是过滤后需要的文档号。 FilterQuery所得到的结果集同两者取AND查询相同,只不过打分的时候,FilterQuery只考虑query的部分,不考虑filter的部分。 Filter包含很多种如下: 6.1、TermsFilter 其包含一个成员变量... 阅读全文
posted @ 2010-05-19 02:29 刘超觉先 阅读(5787) 评论(0) 推荐(1) 编辑
摘要:为什么会产生这个异常: 使用Lucene检索过程中如果用到RangeQuery,PrefixQuery,WildcardQuery,FuzzyQuery这四种Query,可能会产生TooManyClauses异常。为什么会产生这个异常呢?举例说明: 以RangeQuery为例,如果日期范围为19990101到20091231,在索引文件中有19990102,19990103等等这些日期词组,那么RangeQuery会被扩展成“19990102 OR 19990103”,成了2个子句。可以想象,如果索引文件里面在这个时间段内的日期有很多,那么就会产生很多子句。 PrefixQuery等也是同样的 阅读全文
posted @ 2010-05-16 00:29 刘超觉先 阅读(1791) 评论(2) 推荐(1) 编辑
摘要:三、解析QueryParser.jj3.1、声明QueryParser类在QueryParser.jj文件中,PARSER_BEGIN(QueryParser)和PARSER_END(QueryParser)之间,定义了QueryParser类。其中最重要的一个函数是public Query parse(String query)函数,也即我们解析Lucene查询语法的时候调用的函数。这是一个纯Java代码定义的函数,会直接拷贝到QueryParser.java文件中。parse函数中,最重要的一行代码是调用Query res = TopLevelQuery(field),而TopLevelQ 阅读全文
posted @ 2010-05-08 00:21 刘超觉先 阅读(6908) 评论(0) 推荐(4) 编辑
摘要:一、Lucene的查询语法Lucene所支持的查询语法可见http://lucene.apache.org/java/3_0_1/queryparsersyntax.html(1) 语法关键字+ - && || ! ( ) { } [ ] ^ " ~ * ? : \如果所要查询的查询词中本身包含关键字,则需要用\进行转义(2) 查询词(Term)Lucene支持两种查询词,一种是单一查询词,如"hello",一种是词组(phrase),如"hello world"。(3) 查询域(Field)在查询语句中,可以指定从哪个域中寻找 阅读全文
posted @ 2010-05-08 00:20 刘超觉先 阅读(12638) 评论(1) 推荐(6) 编辑
摘要:信息检索这个词的含义非常广。仅从钱包中取出信用卡,然后输入信用卡号也属于信息检索的范畴。然而,从学术角度来讲,信息检索定义如下: 信息检索即从大量非结构化文档集中找到满足需要的文档的过程。 按照如上定义,信息检索曾经是仅少数人如图书管理员,律师,专业搜索者参与的活动。而今非昔比,当今成千上万的人每天都会用搜索引擎搜索网页和邮件。信息检索正迅速取代传统的数据库搜索的方式,成为信息获取的主要方式。除此之外,信息检索技术还可以解决其他有关数据和信息的问题。所谓非结构化数据,指的是没有清晰的可被计算机理解的语义结构的数据。与之相对的是结构化数据,例如传统的关系型数据库,被很多公司用来保存产品库存及员工 阅读全文
posted @ 2010-05-01 20:57 刘超觉先 阅读(3180) 评论(0) 推荐(2) 编辑
摘要:本系列文章将详细描述几乎最新版本的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 刘超觉先 阅读(6864) 评论(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 刘超觉先 阅读(4824) 评论(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 刘超觉先 阅读(9486) 评论(1) 推荐(1) 编辑