1. 示例代码
代码语言:txt复制IndexReader reader = DirectoryReader.open(dir);
IndexSearcher searcher = new IndexSearcher(reader);
reader.close();
2. 构造IndexSearcher详细流程
代码语言:javascript复制IndexReader reader = DirectoryReader.open(dir);
该方法中创建FindSegmentsFile<DirectoryReader>对象,并且调用run方法
2.1 FindSegmentsFile.run方法流程
代码语言:javascript复制1. 第一次获取索引目录中的索引文件列表files
2. 再一次获取索引目录中的索引文件列表files2
3. 如果files和files2排序后,两者不完全相同,则从第一步重新执行,否则执行到第4步
4. 获取IndexWriter最近一次commit的gen值,如果返回的gen=-1, 说明索引目录中没有任何索引段文件,抛出异常
5. 通过上一步返回的gen值,生成最近commit生成的segments_N文件名,处理该文件,返回DirectoryReader
2.2 解析最新segments_N文件的流程
代码语言:javascript复制1. 打开segments_N文件的输入流,读取头部并且校验头部的各个字段值
2. 读取luceneVersion值,并且校验版本的兼容规则
3. 读取indexCreatedVersionMajor的值
4. 生成SegmentInfos对象,并且根据segments_N文件中读取的段的个数依次通过读取si文件生成每一个段
相关的SegmentCommitInfo
5. 读取每一个段相关的文件,生成SegmentReader对象,返回StandardDirectoryReader对象
3. 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各个字段说明
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文件