`
jimmee
  • 浏览: 538670 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

lucene索引创建的理解思路

阅读更多

虽然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到磁盘时,从缓存中生成。

 

0
0
分享到:
评论

相关推荐

    lucene in action

    - **索引与搜索**:Lucene 支持创建高度定制化的索引结构,并提供了多种搜索算法来快速检索索引中的数据。 - **分析工具**:包括分词器在内的多种分析工具可以帮助预处理文档,从而提高搜索的准确性和效率。 - **...

    lucene - 副本.zip

    《Lucene:多线程与多目录索引创建详解》 Lucene,作为一个强大的全文搜索引擎库,被广泛应用于各类信息检索系统中。在处理大量数据时,为了提高效率,我们通常会采用多线程和多目录的方式来创建索引。本文将深入...

    Lucene in Action 2nd

    在书中,他们会分享自己在开发过程中遇到的问题及其解决方案,这不仅有助于读者更好地理解 Lucene 的设计思路,也能学到一些实战技巧。 - **问题解决案例**:通过具体实例展示如何诊断和解决 Lucene 应用中出现的...

    Mdrill项目在lucene的改进上的10点心得1

    总结来说,Mdrill项目通过深入理解Lucene的内部机制,针对性地解决了在大规模数据处理中遇到的挑战,包括索引创建的HDFS适配、索引合并的效率提升以及倒排表的优化。这些改进不仅提高了Lucene在大数据环境下的性能,...

    Lucene 原理与代码分析

    Lucene是一个开源的全文检索引擎工具包,它为文本数据提供了索引和搜索功能。...一个开发人员通过学习Lucene,不仅可以获得构建全文检索系统的能力,还能够理解到许多与信息检索相关的技术细节和优化思路。

    lucene高级智能查询小案例

    首先,我们需要了解如何创建一个Lucene索引。这通常涉及对输入数据的预处理,如分词、去除停用词等,以生成适合索引的Token。在这个案例中,"UserLucene"可能是一个包含用户信息的数据文件,我们可能需要从中提取出...

    ASP.NET基于Ajax+Lucene构建搜索引擎的设计和实现(源代码+论文).rar

    代码通常包含了类定义、方法实现、数据库交互、Lucene索引操作等关键部分,是理解系统架构和工作原理的重要参考。 总结来说,这个压缩包包含了一个基于ASP.NET、Ajax和Lucene的搜索引擎的实现,提供了源代码和相关...

    ASP.NET基于Ajax+Lucene构建搜索引擎的设计和实现(源代码+论文).zip

    开发者可以通过Lucene库来实现文本分析、索引创建、查询解析和结果排序等功能。 搜索引擎的设计和实现主要包括以下几个关键步骤: 1. **数据收集**:首先,搜索引擎需要爬取或导入需要索引的数据。这可能包括网页...

    lucene in aciton (英文版)

    - **起源**: Lucene由Doug Cutting创建于1999年,最初是为了解决Java平台下缺乏开源文本搜索解决方案的问题。 - **发展**: 随着时间的发展,Lucene不断吸收社区的贡献,逐渐成为一个成熟稳定且功能强大的搜索框架...

    【计算机专业ASP.NET-毕业设计100套之】ASP.NET基于Ajax+Lucene构建搜索引擎的设计和实现(源代码+论文)

    2. **索引构建**:利用Lucene API建立索引,这包括创建索引器、添加文档到索引、优化索引等步骤。索引的性能和空间效率是优化的重点。 3. **查询处理**:设计用户友好的查询界面,使用Ajax技术实现实时查询建议和...

    lucene-jdbc:这是 Compass 项目采用旧的 JdbcDirectory 实现到 Lucene 5.x

    总之,Lucene-JDBC是一个历史性的项目,它展示了如何利用Java JDBC接口将Lucene索引与数据库结合,这对于了解搜索引擎与数据库的集成,以及学习如何扩展Lucene存储机制有着重要的参考价值。尽管当前可能有更先进的...

    lucene全文检索

    ### Lucene全文检索技术原理及实现思路 #### 一、全文检索的概念与原理 全文检索是一种基于自然语言处理的信息检索技术,它允许用户输入一段文本作为查询条件,系统能够自动地搜索出包含这些词语的文档并按相关度...

    elasticsearch设计思路

    为了更好地理解Elasticsearch的设计思路,我们首先需要掌握Lucene的基本概念。 - **Directory(目录)**:Lucene使用了一种文件系统抽象层,即Directory,用于读写“文件”。它主要用于读写不同的索引文件。 - **...

Global site tag (gtag.js) - Google Analytics