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 中相对稳定,但具体实现细节可能会在不同版本间有所调整。