如何将Lucene的ByteBuffersDirectory写入/序列化到磁盘?

k75qkfdt  于 2022-11-07  发布在  Lucene
关注(0)|答案(2)|浏览(214)

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

rekjcdws

rekjcdws1#

您可以使用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对象中使用了这个函数。还有其他的上下文构造函数--不知道它们是做什么的。我认为它们给予你更好地控制写操作的执行。

m1m5dgzv

m1m5dgzv2#

同时,我自己摸索出了一个简单明了的方法:

@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);
                    }
                });
    }

相关问题