公众号:冒泡的肥皂
分享最近看Lucene学到的小技巧
文件写入操作时,如何判断写文件的边界:
- 文件大小限制:根据系统或业务需求,设定文件的最大大小。当文件接近或达到该大小时,停止写入或切换到新文件。
- 内容分隔符:通过特定的分隔符(如换行符、标签等)来标记数据的边界,确保每次写入的内容完整且不重叠。
- 时间间隔:按时间维度划分文件边界,例如每小时或每天生成一个新文件。
- 数据批次:根据写入的数据批次或记录数,设定边界条件,例如每写入1000条记录后切换文件。
- 文件系统限制:考虑文件系统对文件名长度、路径深度或单个文件大小的限制,避免超出这些限制。
Lucene采用的方法
- 内容长度+内容+校验码:来区分单个独有的内容
- 内容长度如何控制:固定长度位数;动态长度位数?lucene采用的是动态的位数
- 校验码:不知道平时用不?例如数据库中的重要数据防止篡改如何控制?(代码对重要数据字段加验签了,方法自己搞了)。
- lucene用了系统自带的一个类(Checksum)用了这么久JAVA第一次看这个类
Lucene中动态长度控制的读写
大概逻辑:
- 如果第八位作为标志位,如果是0则代表计数结束。
- 如果第八位是1的话,则向前进一个字节
- 00000000 11000000 转换为
- 00000001 01000000
//读取
public int readVInt() throws IOException {
byte b = readByte();
int i = b & 0x7F;
for (int shift = 7; (b & 0x80) != 0; shift += 7) {
b = readByte();
i |= (b & 0x7F) << shift;
}
return i;
}
//写入
public void writeVInt(int i) throws IOException {
while ((i & ~0x7F) != 0) {
writeByte((byte)((i & 0x7f) | 0x80));
i >>>= 7;
}
writeByte((byte)i);
}
Lucene中对数据校验采用的方法
- 上面说了用了系统自带的一个类(Checksum)
- 在包装了字节写入的时候实时的对数据生成校验码
public void writeByte(byte b) throws IOException {
//校验码
digest.update(b);
main.writeByte(b);
}
Lucene如何把Map数据写入文件的
- size(长度):(长度key:长度:value)
- 当然前提是数据结构自己知道了