如何将write/serializelucene的ByteBuffersDirectory写入磁盘?

How to write/serialize lucene's ByteBuffersDirectory to disk?

如何将 Lucene 8.11 ByteBuffersDirectory 写入磁盘?
类似于 Lucene 2.9.4 Directory.copy(directory, FSDirectory.open(indexPath), true)

您可以使用 copyFrom 方法来完成此操作。

例如:

您正在使用 ByteBuffersDirectory:

final Directory dir = new ByteBuffersDirectory();

假设您没有同时向 dir 写入任何新数据,您可以声明要写入数据的目标 - 例如,FSDirectory(文件系统目录) :

Directory to = FSDirectory.open(Paths.get(OUT_DIR_PATH));

OUT_DIR_PATH 位置使用您想要的任何字符串。

然后您可以遍历原始 dir 对象中的所有文件,将它们写入这个新的 to 位置:

IOContext ctx = new IOContext();
for (String file : dir.listAll()) {
    System.out.println(file); // just for testing
    to.copyFrom(dir, file, file, ctx);
}

这将创建新的 OUT_DIR_PATH 目录并在其中填充文件,例如:

_0.cfe
_0.cfs
_0.si
segments_1

...或您 dir.

中碰巧拥有的任何文件

警告:

我只将它与默认的 IOContext 对象一起使用。上下文还有其他构造函数 - 不确定它们的作用。我假设它们可以让您更好地控制写入的执行方式。

与此同时,我自己想出了一个简单的方法:

    @SneakyThrows
    public static void copyIndex(ByteBuffersDirectory ramDirectory, Path destination) {
        FSDirectory fsDirectory = FSDirectory.open(destination);
        Arrays.stream(ramDirectory.listAll())
                .forEach(fileName -> {
                    try {
                        // IOContext is null because in fact is not used (at least for the moment)
                        fsDirectory.copyFrom(ramDirectory, fileName, fileName, null);
                    } catch (IOException e) {
                        log.error(e.getMessage(), e);
                    }
                });
    }