专栏首页solr lucene源码解析构造IndexSearcher源码解析
原创

构造IndexSearcher源码解析

1. 示例代码

IndexReader reader = DirectoryReader.open(dir);
IndexSearcher searcher = new IndexSearcher(reader);
reader.close();

2. 构造IndexSearcher详细流程

IndexReader reader = DirectoryReader.open(dir);

该方法中创建FindSegmentsFile<DirectoryReader>对象,并且调用run方法

2.1 FindSegmentsFile.run方法流程

1. 第一次获取索引目录中的索引文件列表files
2. 再一次获取索引目录中的索引文件列表files2
3. 如果files和files2排序后,两者不完全相同,则从第一步重新执行,否则执行到第4步
4. 获取IndexWriter最近一次commit的gen值,如果返回的gen=-1, 说明索引目录中没有任何索引段文件,抛出异常
5. 通过上一步返回的gen值,生成最近commit生成的segments_N文件名,处理该文件,返回DirectoryReader

2.2 解析最新segments_N文件的流程

1. 打开segments_N文件的输入流,读取头部并且校验头部的各个字段值
2. 读取luceneVersion值,并且校验版本的兼容规则
3. 读取indexCreatedVersionMajor的值
4. 生成SegmentInfos对象,并且根据segments_N文件中读取的段的个数依次通过读取si文件生成每一个段
   相关的SegmentCommitInfo
5. 读取每一个段相关的文件,生成SegmentReader对象,返回StandardDirectoryReader对象

3. segments_N文件格式

segments_N文件格式

字段说明:

1. luceneVersion 该值描述了当前运行的lucene的版本

2. indexCreatedVersionMajor 该字段描述的是创建该segments_N文件时的lucene的版本,在读取阶段,索引文件可能被不同的版本的lucene读取,该值用来判断兼容性

3. Version 该值描述的是SegmentInfo对象发生更改的次数

4. counter 该值用来给新的SegmentInfo对象提供名字的前缀值

5. segmentCount 该值描述了当前有效索引段的个数

6. minSegmentLuceneVersion 索引目录中的生成si文件的lucene版本各不相同,该值记录版本最小的

7. SegmentCommitInfo 总共有segmentCount个该值

8. userData 该值可以通过IndexWriter.setLiveCommitData在commit时记录用户自定义数据

SegmentCommitInfo各个字段说明

SegmentCommitInfo结构

1. segName 该字段描述的是属于同一个段的索引文件的前缀,在解析segments_N文件的过程中,通过该字段找到si文件,解析si文件可以获取一个段的完整信息

2. segmentID 该字段描述了SegmentInfo文件的唯一标识

3. codec 该字段描述了SegmentInfo文件的编码值

4. delGen 该字段描述了属于同一个segment的liv文件文件的迭代编号,它用来命名下一次的liv文件

5. delCount 该字段描述该segment删除的文档的个数

6. fieldInfosGen 该字段描述了属于同一个segment的fnm文件的迭代编号,用来命名下一次生成的fnm文件

7. dvGen 该字段描述了属于同一个segment的dvm,dvd文件的迭代编号,用来命名下一次生成的dvm、dvd文件

8. FieldInfosFiles 如果域的信息发生变化,那么会记录最新生成的fnm文件

9. dvUpdateFiles 记录发生变化的DocValues文件

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • lucene添加文档源码解析(第三篇)

    在lucene中添加文档是通过IndexWriter.addDocument方法,我们先给出添加文档的示例代码

    LuceneReader
  • solr cloud的update索引链

    solr cloud的update索引链的类是org.apache.solr.update.processor.UpdateRequestProcessorCh...

    LuceneReader
  • TimeLimitingCollector源码解析

    在solr的查询请求中添加timeAllowed参数,可以限定solr查询的请求时间,在solr内部,是通过TimeLimitingCollector类...

    LuceneReader
  • 一日一技:超级简单搭建更加稳定安全的文件分享服务器

    在公众号以前的文章里面,我们提到,如果想简单的分享一下文件,我们可以使用一行 Python 命令:

    青南
  • python教程(八)·文件操作

    由于离高考越来越近,博主打算本篇文章过后,暂停本系列教程的更新,等到高考完后再继续本系列教程,请谅解!

    用户2398817
  • Lua生成的LDoc文档注释规范

    函数参数@param 是不指明具体类型的, 若想指明的话可以用 @int, @string, @bool, @func, @tab, @thread 几个标签来...

    bering
  • 4.1.6 文件系统基础

    文件是以计算机硬盘为载体存储在计算机上的信息集合,它的形式很多样化,可以是文本文档、图片、程序等。

    week
  • 如何学python

    第十六课 基础文件操作 今天我们来说说文件操作。文件操作在程序编写里有着举足轻重的作用。文件操作,主要包含文件的输入和输出。学会了文件操作,就可以写出更符合实际...

    用户1631416
  • C# 热敏打印机 Socket 网络链接 打印 图片 (二)

    跟着阿笨一起玩NET
  • Linux命令(65)——ld命令

    ld命令是二进制工具集GNU Binutils的一员,是GNU链接器,用于将目标文件与库链接为可执行程序或库文件。

    Dabelv

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动