虽然lucene4很早就出来,但是这里仍然以lucene3.0为基础,理解lucene索引创建的思路:
1. 要记录正向信息
field的数据,fdx,fdt,依次写每个field的即可
词向量,tvx,tvd,tvf
tvf是真正存储的地方,tvx是每个文档一项,具体包含第一个field的位置,其他field只要记录与覅一个field的偏移量即可
2. 记录反向信息
字典信息,tii,tis,通过字典,能够找到frq位置和prx位置
即,term1记录有此文档的倒排链表的位置,以及位置信息的链表
frq是倒排表,首先是倒排表,之后是跳跃表(肯定先放正常的倒排表,有了确定的位置后,方便建跳跃表),一层一层的建。
prx文档类似的
3. 如果自己来实现,如何实现?
(1)针对正向的数据fdx,fdt,就是一个文档的每个field的进来的原始数据,因此,可以直接保存,因为这不需要额外的分析就可以确定,可以直接写到磁盘的,顺序的写。
文档1
文档2
文档3
...
文档n
(2)针对正向信息的tvx,tvd,tvf等,肯定需要等每个field的term分析结束才行,否则不可能得到完整的信息,具体一个词在本文档中的词频,位置信息,也需要分析完term才能确定
field-->term
term->docid,freq,position
(3)tii,tis,frq,prx的形成,只有在一批文档完成后,才能形成,因为只有知道了所有的文档后,按文档id排序,才能构建
tii,tis
frq->docId1,freq1;docId2,freq2
prox->docId1,prox1;docId2,prox2
4. lucene3.0中的实现
剔除掉接口的描述,只看具体的实现,其实很清楚:
--> code: DocFieldProcessor / DocFieldProcessorPerThread
--> code: DocInverter / DocInverterPerThread / DocInverterPerField
--> code: TermsHash / TermsHashPerThread / TermsHashPerField
--> code: FreqProxTermsWriter / FreqProxTermsWriterPerThread / FreqProxTermsWriterPerField
--> code: TermVectorsTermsWriter / TermVectorsTermsWriterPerThread / TermVectorsTermsWriterPerField
--> code: NormsWriter / NormsWriterPerThread / NormsWriterPerField
--> code: StoredFieldsWriter / StoredFieldsWriterPerThread
处理的层次的分类规则:
(1)是所有文档共享还是线程独立
(2)是正向还是反向的处理
所有文档共享:DocFieldProcessor
所有文档的共享(正向):StoredFieldsWriter
所有文档的共享(反向):DocInverter
线程的入口:DocFieldProcessorPerThread
线程的处理(正向):StoredFieldsWriterPerThread
线程的处理(反向):DocInverterPerThread
4.1 线程的处理(正向):StoredFieldsWriterPerThread
(1)DocumentsWriter有统一的内存管理
(2)每个线程写一个文档时,首先从池中获取一个内存块,写信息
(3)写文档结束后,直接将正向的fdt和fdx写到磁盘上,重用内存块
多个段之间的正向fdt和fdx是可以共享一个文件的。例如没有提交一批文档之前,如果内存满了,那么先flush,会生成tii,tis和frq,prx等。
之后后续commit了,会生成另一个段的tii,tis等,但是fdt和fdx是相同的。
4.2 线程的处理(反向):DocInverterPerThread
一个文档的反向信息要缓存的信息有哪些?
(1)term的文本
(2)term对应的docId,freq,prox信息
(3)上述信息的指针
每个field的有一个缓存的term的hash数组:此hash数组的对象,包含了指针信息:term的文本的指针;term对应的prox信息(遇见一次,记录一次)
后续的文档:当遇到同样的一个term,文本重用,同样的缓存frq,prox即可。
4.3 方向信息的生成:通过flush到磁盘时,从缓存中生成。
相关推荐
- **索引与搜索**:Lucene 支持创建高度定制化的索引结构,并提供了多种搜索算法来快速检索索引中的数据。 - **分析工具**:包括分词器在内的多种分析工具可以帮助预处理文档,从而提高搜索的准确性和效率。 - **...
《Lucene:多线程与多目录索引创建详解》 Lucene,作为一个强大的全文搜索引擎库,被广泛应用于各类信息检索系统中。在处理大量数据时,为了提高效率,我们通常会采用多线程和多目录的方式来创建索引。本文将深入...
在书中,他们会分享自己在开发过程中遇到的问题及其解决方案,这不仅有助于读者更好地理解 Lucene 的设计思路,也能学到一些实战技巧。 - **问题解决案例**:通过具体实例展示如何诊断和解决 Lucene 应用中出现的...
总结来说,Mdrill项目通过深入理解Lucene的内部机制,针对性地解决了在大规模数据处理中遇到的挑战,包括索引创建的HDFS适配、索引合并的效率提升以及倒排表的优化。这些改进不仅提高了Lucene在大数据环境下的性能,...
Lucene是一个开源的全文检索引擎工具包,它为文本数据提供了索引和搜索功能。...一个开发人员通过学习Lucene,不仅可以获得构建全文检索系统的能力,还能够理解到许多与信息检索相关的技术细节和优化思路。
首先,我们需要了解如何创建一个Lucene索引。这通常涉及对输入数据的预处理,如分词、去除停用词等,以生成适合索引的Token。在这个案例中,"UserLucene"可能是一个包含用户信息的数据文件,我们可能需要从中提取出...
代码通常包含了类定义、方法实现、数据库交互、Lucene索引操作等关键部分,是理解系统架构和工作原理的重要参考。 总结来说,这个压缩包包含了一个基于ASP.NET、Ajax和Lucene的搜索引擎的实现,提供了源代码和相关...
开发者可以通过Lucene库来实现文本分析、索引创建、查询解析和结果排序等功能。 搜索引擎的设计和实现主要包括以下几个关键步骤: 1. **数据收集**:首先,搜索引擎需要爬取或导入需要索引的数据。这可能包括网页...
- **起源**: Lucene由Doug Cutting创建于1999年,最初是为了解决Java平台下缺乏开源文本搜索解决方案的问题。 - **发展**: 随着时间的发展,Lucene不断吸收社区的贡献,逐渐成为一个成熟稳定且功能强大的搜索框架...
2. **索引构建**:利用Lucene API建立索引,这包括创建索引器、添加文档到索引、优化索引等步骤。索引的性能和空间效率是优化的重点。 3. **查询处理**:设计用户友好的查询界面,使用Ajax技术实现实时查询建议和...
总之,Lucene-JDBC是一个历史性的项目,它展示了如何利用Java JDBC接口将Lucene索引与数据库结合,这对于了解搜索引擎与数据库的集成,以及学习如何扩展Lucene存储机制有着重要的参考价值。尽管当前可能有更先进的...
### Lucene全文检索技术原理及实现思路 #### 一、全文检索的概念与原理 全文检索是一种基于自然语言处理的信息检索技术,它允许用户输入一段文本作为查询条件,系统能够自动地搜索出包含这些词语的文档并按相关度...
为了更好地理解Elasticsearch的设计思路,我们首先需要掌握Lucene的基本概念。 - **Directory(目录)**:Lucene使用了一种文件系统抽象层,即Directory,用于读写“文件”。它主要用于读写不同的索引文件。 - **...