一、目录介绍
第一篇 原理篇 9
第一章 全文检索的基本原理 10
一、总论 10
二、索引里面究竟存些什么 13
三、如何创建索引 14
第一步:一些要索引的原文档(Document) 14
第二步:将原文档传给分次组件(Tokenizer) 14
第三步:将得到的词元(Token)传给语言处理组件(Linguistic Processor) 15
第四步:将得到的词(Term)传给索引组件(Indexer) 16
1. 利用得到的词(Term)创建一个字典 16
2. 对字典按字母顺序进行排序 17
3. 合并相同的词(Term)成为文档倒排(Posting List)链表 18
四、如何对索引进行搜索 20
第一步:用户输入查询语句 21
第二步:对查询语句进行词法分析,语法分析,及语言处理 21
1.词法分析主要用来识别单词和关键字 21
2.语法分析主要是根据查询语句的语法规则来形成一棵语法树 21
3.语言处理同索引过程中的语言处理几乎相同 22
第三步:搜索索引,得到符合语法树的文档 22
第四步:根据得到的文档和查询语句的相关性,对结果进行排序 23
1.计算权重(Term weight)的过程 24
2.判断 Term 之间的关系从而得到文档相关性的过程,也即向量空间模型的算法(VSM) 25
第二章:Lucene 的总体架构 29
第二篇:代码分析篇 34
第三章:Lucene 的索引文件格式 35
一、基本概念 35
二、基本类型 38
三、基本规则 39
1. 前缀后缀规则(Prefix+Suffix) 39
2. 差值规则(Delta) 40
3. 或然跟随规则(A, B?) 41
4. 跳跃表规则(Skip list) 42
四、具体格式 44
4.1. 正向信息 44
4.1.1. 段的元数据信息(segments_N) 44
4.1.2. 域(Field)的元数据信息(.fnm) 60
4.1.3. 域(Field)的数据信息(.fdt,.fdx) 66
4.1.3. 词向量(Term Vector)的数据信息(.tvx,.tvd,.tvf) 69
4.2. 反向信息 72
4.2.1. 词典(tis)及词典索引(tii)信息 72
4.2.2. 文档号及词频(frq)信息 74
4.2.3. 词位置(prx)信息 78
4.3. 其他信息 79
4.3.1. 标准化因子文件(nrm) 79
4.3.2. 删除文档文件(del) 81
五、总体结构 82
第四章:Lucene 索引过程分析 84
一、索引过程体系结构 84
二、详细索引过程 86
1、创建 IndexWriter 对象 86
2、创建文档 Document 对象,并加入域(Field) 100
3、将文档加入 IndexWriter 103
4、将文档加入 DocumentsWriter 103
4.1、得到当前线程对应的文档集处理对象(DocumentsWriterThreadState) 111
4.2、用得到的文档集处理对象(DocumentsWriterThreadState)处理文档 113
4.3、用 DocumentsWriter.finishDocument 结束本次文档添加 132
5、DocumentsWriter 对CharBlockPool,ByteBlockPool,IntBlockPool 的缓存管理 132
6、关闭 IndexWriter 对象 146
6.1、得到要写入的段名 147
6.2、将缓存的内容写入段 148
6.3、生成新的段信息对象 169
6.4、准备删除文档 169
6.5、生成 cfs 段 169
6.6、删除文档 170
第五章:Lucene 段合并(merge)过程分析 174
一、段合并过程总论 174
1.1、合并策略对段的选择 175
1.2、反向信息的合并 182
二、段合并的详细过程 191
2.1、将缓存写入新的段 191
2.2、选择合并段,生成合并任务 192
2.2.1、用合并策略选择合并段 192
2.2.2、注册段合并任务 198
2.3、段合并器进行段合并 199
2.3.1、合并存储域 201
2.3.2、合并标准化因子 206
2.3.3、合并词向量 207
2.3.4、合并词典和倒排表 210
第六章:Lucene 打分公式的数学推导 216
第七章:Lucene 搜索过程解析 222
一、Lucene 搜索过程总论 222
二、Lucene 搜索详细过程 223
2.1、打开 IndexReader 指向索引文件夹 223
2.1.1、找到最新的 segment_N 文件 223
2.1.2、通过 segment_N 文件中保存的各个段的信息打开各个段 225
2.1.3、得到的 IndexReader 对象如下 228
2.2、打开 IndexSearcher 236
2.3、QueryParser 解析查询语句生成查询对象 237
2.4、搜索查询对象 242
2.4.1、创建Weight 对象树,计算 Term Weight 243
2.4.2、创建 Scorer 及 SumScorer 对象树 268
2.4.3、进行倒排表合并 288
2.4.4、收集文档结果集合及计算打分 318
2.4.5、Lucene 如何在搜索阶段读取索引信息 324
第八章:Lucene 的查询语法,JavaCC 及 QueryParser 330
一、Lucene 的查询语法 330
二、JavaCC 介绍 332
2.1、第一个实例——正整数相加 334
2.2、扩展语法分析器 339
2.3、第二个实例:计算器 344
三、解析 QueryParser.jj 357
3.1、声明 QueryParser 类 357
3.2、声明词法分析器 357
3.3、声明语法分析器 360
第九章:Lucene 的查询对象 376
1、BoostingQuery 376
2、CustomScoreQuery 381
3、MoreLikeThisQuery 385
4、MultiTermQuery 394
4.1、TermRangeQuery 394
4.2、NumericRangeQuery 397
5、SpanQuery 399
5.1、SpanFirstQuery 400
5.2、SpanNearQuery 401
5.3、SpanNotQuery 408
5.4、SpanOrQuery 411
5.5、FieldMaskingSpanQuery 411
5.6、PayloadTermQuery 及PayloadNearQuery 414
6、FilteredQuery 416
6.1、TermsFilter 416
6.2、BooleanFilter 417
6.3、DuplicateFilter 419
6.4、FieldCacheRangeFilter<T>及 FieldCacheTermsFilter 425
6.5、MultiTermQueryWrapperFilter<Q> 432
6.6、QueryWrapperFilter 433
6.7、SpanFilter 434
6.7.1、SpanQueryFilter 434
6.7.2、CachingSpanFilter 435
第十章:Lucene 的分词器Analyzer 437
1、抽象类 Analyzer 437
2、TokenStream 抽象类 438
3、几个具体的 TokenStream 439
3.1、NumericTokenStream 439
3.2、SingleTokenTokenStream 441
4、Tokenizer 也是一种 TokenStream 442
4.1、CharTokenizer 442
4.2、ChineseTokenizer 445
4.3、KeywordTokenizer 446
4.4、CJKTokenizer 447
4.5、SentenceTokenizer 451
5、TokenFilter 也是一种TokenStream 454
5.1、ChineseFilter 454
5.2、LengthFilter 456
5.3、LowerCaseFilter 457
5.4、NumericPayloadTokenFilter 458
5.5、PorterStemFilter 458
5.6、ReverseStringFilter 460
5.7、SnowballFilter 462
5.8、TeeSinkTokenFilter 464
6、不同的 Analyzer 就是组合不同的 Tokenizer 和 TokenFilter 得到最后的 TokenStream 469
6.1、ChineseAnalyzer 469
6.2、CJKAnalyzer 469
6.3、PorterStemAnalyzer 470
6.4、SmartChineseAnalyzer 470
6.5、SnowballAnalyzer 470
7、Lucene 的标准分词器 471
7.1、StandardTokenizerImpl.jflex 471
7.2、StandardTokenizer 475
7.3、StandardFilter 476
7.4、StandardAnalyzer 477
8、不同的域使用不同的分词器 479
8.1、PerFieldAnalyzerWrapper 479
第三篇:问题篇 482
问题一:为什么能搜的到“中华 AND 共和国”却搜不到“中华共和国”? 483
问题二:stemming 和 lemmatization 的关系 487
问题三:影响 Lucene 对文档打分的四种方式 493
在索引阶段设置 Document Boost 和 Field Boost,存储在(.nrm)文件中 493
在搜索语句中,设置 Query Boost 499
继承并实现自己的 Similarity 501
继承并实现自己的 collector 514
问题四:Lucene 中的TooManyClause 异常 517
问题五:Lucene 的事务性 519
问题六:用 Lucene 构建实时的索引 521
1、初始化阶段 521
2、合并索引阶段 522
3、重新打开硬盘索引的 IndexReader 523
4、替代 IndexReader 524
5、多个索引 525