`
吴英贵
  • 浏览: 7431 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

一步一步跟我学习lucene(5)---lucene的索引构建原理

 
阅读更多

lucene创建索引的原理

IndexWriter的addDocument方法详解

今天看了IndexWriter类的addDocument方法,IndexWriter对此方法的说明如下:

Adds a document to this index. 

Note that if an Exception is hit (for example disk full) then the index will be consistent, but this document may not have been added. Furthermore, it's possible the index will have one segment in non-compound format even when using compound files (when a merge has partially succeeded).

This method periodically flushes pending documents to the Directory (see above), and also periodically triggers segment merges in the index according to the MergePolicy in use.

Merges temporarily consume space in the directory. The amount of space required is up to 1X the size of all segments being merged, when no readers/searchers are open against the index, and up to 2X the size of all segments being merged when readers/searchers are open against the index (see forceMerge(int) for details). The sequence of primitive merge operations performed is governed by the merge policy. 

Note that each term in the document can be no longer than MAX_TERM_LENGTH in bytes, otherwise an IllegalArgumentException will be thrown.

大意如下:

此方法向索引中添加一个document;

需要注意的是如果执行过程中发生异常(比如磁盘空间不足)的时候索引会保持一致性,但是这个document也许并没有被添加,此外,即使使用符合文件也有可能索引包含一个非复合格式的segment当合并索引有部分成功的时候)

此方法会定期的flush索引文件目录,并且会根据合并策略定期去触发索引文件中segment的合并操作;

刚方法会对合并临时的索引空间,当没有reader或者searcher读取或写入索引文件的时候所需要占用的磁盘空间至少要超过需要合并的segments文件的一倍,反之将会占用两倍以上的空间;序列的合并操作的优化取决于合并策略‘

要确保document中的每一个term占用的字节长度都不能超过MAX_TERM_LENGTH,否则会抛出IllegalArgumentException异常;

其实际的执行方法为:

继续跟进updateDocument方法,其实现如下

可以看见updateDocument是先从索引中删除包含相同term的document然后重新添加document到索引中;

此操作需要确保IndexWriter没有被关闭,其实现是先有DocumentsWriter类的updateDocument方法判断,这里先判断将根据term找到对应的document,并先放到待删除的document队列中,然后从队列中读取document,再将要flush的documents写入磁盘,同时更新flush队列中的索引状态;

相关源码如下


在此期间有一个ThreadState类型的读写锁,lucene判断ThreadState的状态,如果此锁被激活,从内存中获取document并更新到索引文件且重置内存中索引的数量和状态,最后释放相关的资源。

此即为IndexWriter的索引构建过程,看代码晕头转向的,以后为大家带来一点干货,明天带来lucene索引优化之多线程创建索引。

联系我

一步一步跟我学习lucene是对近期做lucene索引的总结,大家有问题的话联系本人的Q-Q: 891922381,同时本人新建Q-Q群:106570134(lucene,solr,netty,hadoop),如蒙加入,不胜感激,大家共同探讨,本人争取每日一博,希望大家持续关注,会带给大家惊喜的




分享到:
评论

相关推荐

    lucene 7索引查看工具 -luke-7.2.0-luke-release.zip

    Luke是一个方便的索引查看和诊断工具,可以访问Lucene构建的索引文件,显示和修改某些索引内容。luke 7.2.0 支持最新的 lucene7 索引查看 github地址:https://github.com/DmitryKey/luke/releases

    lucene 对 xml建立索引

    lucene 对 xml建立索引 建立索引就是怎么简单 呵呵

    面试指南-Lucene-ES篇-课件

    - #### FST原理(FST的构建过程以及FST在Lucene中的应用原理) - #### 索引文件的内部结构(.tip和.tim文件内部数据结构) - #### FST在Lucene的读写过程(Lucene源码实现) ....................

    lucene-query-string-builder:使用基本功能构建复杂的Lucene查询字符串

    想象一下,有一个利用Lucene在(索引的)数据库上执行查询的API。 在这种情况下,您可能希望在客户端/前端上生成lucene查询字符串。 用法部分显示了如何利用此库实现您的目的。 设置 npm install lucene-query-...

    lucene 索引小示例

    NULL 博文链接:https://blaiu.iteye.com/blog/588054

    Lucene检索文本,建立索引

    用Lucene检索文本,建立索引,用struts构建web程序框架

    基于lucene的Swing全文索引构建于查询工具及源程序

    基于lucene的Swing全文索引构建于查询工具及源程序,有源程序以及做好的工具,非常适合初学者学习学习lucene

    论文研究-基于XML和Lucene构建黄页搜索引擎 .pdf

    基于XML和Lucene构建黄页搜索引擎,姜伟,宋茂强,随着用户对搜索引擎要求的不断提高,垂直搜索引擎应运而生,成为搜索引擎新的发展趋势。论文基于开源全文索引引擎工具包Lucene,采

    有关Lucene的问题(8):用Lucene构建实时索引的文档更新问题[整理].pdf

    有关Lucene的问题(8):用Lucene构建实时索引的文档更新问题[整理].pdf

    lucene索引

    基于数据库的lucene3。索引构建类代码

    lucene:lucene构建索引,从HelloWorld到项目具体使用

    lucene构建索引,从HelloWorld到项目具体使用 ====================项目一:=================================== qianjun.lucene.first ====================项目二:=================================== qianjun....

    论文研究-并行密文倒排索引研究.pdf

    实验结果表明,Crypt-Lucene与SSE-1相比,索引构建时间减少了约为60%,同时具有较好的空间性能,对于大文档集合,利用MapReduce在4结点构成的Hadoop集群上并行构建8个Crypt-Lucene索引能减少83.4%的时间。

    Lucene中的FST算法描述

    描述了Lucene中如何使用FST算法构建term的内存索引,使用了很多图,直观的展现了FST图的构建流程,能够对想了解lucene内部实现机制原理的同学有帮助。

    使用lucene构建一个简单的搜索引擎

    全文检索首先将要查询的目标文档中的词提取出来,组成索引,通过查询索引达到搜索目标文档的目的。这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。这是一个使用lucene开源框架编写的一个...

    Lucene IndexApplication:使用lucene索引文本文档-开源

    自动和安排 Lucene 搜索索引的构建。 用于记录系统消息的通用日志框架。 您可以为严重和非严重错误和消息配置设置。 排名搜索——最好的结果首先返回许多强大的查询类型:短语查询、通配符查询、邻近查询、范围查询...

    Lucene示例 BM25相似度计算

    用lucene 4.7.1做的一个Lucene构建索引、进行查询,对比默认的相似度计算与BM25相似度计算输出结果的示例。内容不多,供新手参考

    全文检索 lucene

    作为一个开放源代码项目,Lucene从问世之后,引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种系统软件中去,以及构建Web应用,甚至某些商业软件也采用了Lucene作为...

    Lucene文件检索实战项目

    Lucene从问世之后,引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种系统软件中去,以及构建Web应用,甚至某些商业软件也采用了Lucene作为其内部全文检索子系统的...

    Lucene建立索引及查询包含“java”关键字 示例代码

    根据博客调试的程序,比较简单,英文分词和检索,希望对大家学习有帮助。

    lucene例子

    Lucene 强大的 API 主要关注文本索引和搜索。它可以用于为各种应用程序构建搜索功能,比如电子邮件客户端、邮件列表、Web 搜索、数据库搜索等等。Wikipedia、TheServerSide、jGuru 和 LinkedIn 等网站都使用了 ...

Global site tag (gtag.js) - Google Analytics