Lucene 8.7.0 版本的索引文件格式
Lucene 8.7.0 版本的索引文件格式非常丰富,每种文件都有特定的作用。以下是主要的文件格式及其功能:
核心索引文件
1. 段信息文件
.si (Segment Info) - 段的元数据信息存储段的基本信息:文档数、使用的编解码器、版本等.cfs (Compound File) - 复合文件格式将多个索引文件合并成一个文件,减少文件句柄数.cfe (Compound File Entries) - 复合文件条目记录.cfs文件中各个逻辑文件的偏移量和长度
2. 字段相关文件
.fnm (Field Names) - 字段元数据存储字段名称、字段号、索引选项等信息.fdt (Field Data) - 存储字段值存储文档的原始字段内容(stored fields).fdx (Field Index) - 字段数据索引存储指向.fdt文件中文档位置的指针.fdm (Field Metadata) - 字段元数据8.6+版本新增,存储字段的额外元数据
3. 词项字典文件
.tim (Term Dictionary) - 词项字典存储所有词项的字典信息,按字典序排列.tip (Term Index) - 词项索引词项字典的索引,用于快速定位词项.tmd (Term Metadata) - 词项元数据存储词项的额外元数据信息
FST和.tip文件的关系
FST 是一种高效的数据结构,用于存储和检索有序字符串
.tip 是 Lucene 的一个索引文件,存储词项索引
.tip 文件内部使用 FST 来高效存储词项前缀到词项字典(.tim)的映射
FST 提供了空间效率(共享前缀)和查询效率(O(n)复杂度)
4. 倒排表文件
.doc (Frequencies) - 文档频率存储每个词项出现在哪些文档中及出现频率.pos (Positions) - 位置信息存储词项在文档中的位置信息.pay (Payloads) - 负载数据存储与位置相关的额外数据(如同义词权重)
5. 向量相关文件
.tvd (Term Vector Data) - 词向量数据存储词向量的实际数据.tvx (Term Vector Index) - 词向量索引指向.tvd文件中每个文档词向量的位置.tvm (Term Vector Metadata) - 词向量元数据存储词向量的元数据信息
6. 规范化因子文件
.nvd (Norms Data) - 规范化因子数据存储用于评分的规范化因子.nvm (Norms Metadata) - 规范化因子元数据存储规范化因子的元数据
7. 文档值文件
.dvd (DocValues Data) - 文档值数据存储列式存储的字段值,用于排序、聚合等.dvm (DocValues Metadata) - 文档值元数据存储文档值的元数据信息
8. 删除文档文件
.liv (Live Documents) - 活跃文档使用位图标记哪些文档被删除
9. 点数据文件
.dii (Points Index) - 点数据索引多维点数据的索引(用于数值范围查询).dim (Points Data) - 点数据存储实际的多维点数据
段管理文件
segments_N - 段文件列表提交点文件,记录索引中所有段的信息N是递增的版本号write.lock - 写锁文件防止多个进程同时写入索引
实际示例
// 查看索引目录中的文件
public void listIndexFiles() {Path indexPath = Paths.get("/path/to/index");try (DirectoryStream<Path> stream = Files.newDirectoryStream(indexPath)) {for (Path file : stream) {String fileName = file.getFileName().toString();System.out.println(fileName + " - " + getFileDescription(fileName));}}
}private String getFileDescription(String fileName) {if (fileName.endsWith(".si")) return "段信息";if (fileName.endsWith(".fnm")) return "字段名称";if (fileName.endsWith(".fdt")) return "存储字段数据";if (fileName.endsWith(".fdx")) return "存储字段索引";if (fileName.endsWith(".tim")) return "词项字典";if (fileName.endsWith(".tip")) return "词项索引";if (fileName.endsWith(".doc")) return "文档频率";if (fileName.endsWith(".pos")) return "位置信息";if (fileName.endsWith(".dvd")) return "文档值数据";if (fileName.endsWith(".liv")) return "删除标记";if (fileName.startsWith("segments_")) return "段列表";// ... 其他文件类型return "未知";
}
文件大小特点
// 不同类型文件的典型大小比例(仅供参考)
public class IndexFileSizes {// 存储字段文件 (.fdt, .fdx) - 通常较大,取决于存储内容// 词项字典文件 (.tim, .tip) - 中等大小// 倒排表文件 (.doc, .pos) - 较大,是索引的核心// 文档值文件 (.dvd, .dvm) - 取决于DocValues字段数量// 删除文件 (.liv) - 很小,只是位图public void analyzeIndexSize(Directory dir) throws IOException {for (String file : dir.listAll()) {long size = dir.fileLength(file);System.out.printf("%s: %.2f MB%n", file, size / (1024.0 * 1024.0));}}
}
优化建议
- 使用复合文件格式:减少文件数量,但可能影响性能
- 定期合并段:减少段数量,提高查询性能
- 合理配置 DocValues:根据需要启用,影响索引大小
- 监控文件增长:特别是 .fdt 和 .pos 文件
这些文件格式在 Lucene 8.7.0 中相对稳定,但具体实现细节可能会在不同版本间有所调整。