gpt4 book ai didi

Lucene IndexSearcher 在重建时锁定索引导致 IOException

转载 作者:行者123 更新时间:2023-12-01 03:01:01 25 4
gpt4 key购买 nike

我从阅读可用文档中了解到,应该在搜索之间共享 IndexSearcher 实例,以获得最佳性能,并且必须创建一个新实例才能加载对索引所做的任何更改。这意味着在创建指向同一目录的 IndexSearcher 实例后,索引是可写的(使用 IndexWriter)。但是,这不是我在 Lucene.Net 实现中看到的行为。我正在使用 FSDirectory。 RAMDirectory 不是一个可行的选择。 IndexSearcher 锁定索引文件之一(在我的实现中是 _1.cfs 文件),使得索引在 IndexSearcher 实例的生命周期内不可更新。

这是一种已知的行为吗?在使用重建之前创建的 IndexSearcher 实例时,我不能从头开始重建索引吗?是否只能修改索引,而不能重建它?

这是我创建 IndexSearcher 实例的方法:

// Create FSDirectory
var directory = FSDirectory.GetDirectory(storagePath, false);

// Create IndexReader
var reader = IndexReader.Open(directory);

// I get the same behaviour regardless of whether I close the directory or not.
directory.Close();

// Create IndexSearcher
var searcher = new IndexSearcher(reader);

// Closing the reader will cause "object reference not set..." when searching.
//reader.Close();

这是我创建 IndexWriter 的方法:
var directory = FSDirectory.GetDirectory(storagePath, true);
var indexWriter = new IndexWriter(directory, new StandardAnalyzer(), true);

我正在使用 Lucene.Net 2.0 版。

编辑:

升级到 Lucene.Net 2.1 (thx KenE) 并稍微修改我创建 IndexWriter 的方式解决了这个问题:
var directory = FSDirectory.GetDirectory(storagePath, false);
var indexWriter = new IndexWriter(directory, new StandardAnalyzer(), true);

最佳答案

最新版本的 Lucene.Net (2.1) 似乎支持使用 create=true 打开 IndexWriter,即使有打开的读者:

http://incubator.apache.org/lucene.net/docs/2.1/Lucene.Net.Index.IndexWriter.html

早期版本不清楚是否支持这一点。我会尝试使用 2.1。

关于Lucene IndexSearcher 在重建时锁定索引导致 IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/750656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com