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

Posted

技术标签:

【中文标题】如何将 lucene 的 ByteBuffersDirectory 写入/序列化到磁盘?【英文标题】:How to write/serialize lucene's ByteBuffersDirectory to disk? 【发布时间】:2022-01-10 05:21:39 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您可以使用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 对象一起使用。上下文还有其他构造函数-不确定它们的作用。我认为它们可以让您更好地控制写入的执行方式。

【讨论】:

我接受了你的回答,虽然是我自己想出来的,因为你在我之前回答了。【参考方案2】:

同时我自己想通了,并为它创建了一个直截了当的方法:

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

【讨论】:

以上是关于如何将 lucene 的 ByteBuffersDirectory 写入/序列化到磁盘?的主要内容,如果未能解决你的问题,请参考以下文章

Lucene建立索引库

如何将一个非常大的 lucene 结果集连接到一个真正的大型 sql 表 [10 的百万行]

Lucene NumericRangeQuery的初步理解

Lucene的使用介绍

如何使用 Solr/Lucene 搜索值列表?

lucene复杂数据类型存储