Lucene.net间歇性地将未出现在文件中的文件编入索引

时间:2009-11-19 11:55:39

标签: c# indexing lucene.net

我有一个问题在我的单元测试中间歇性出现,我无法理解为什么。

单元测试本身是将多个文档添加到索引,然后尝试查询索引以再次取出文档。

95%的时间它没有任何问题。然后另外5%的时间它无法从索引中检索文档。

我的单元测试代码如下:

[Test]
    public void InsertMultipleDocuments()
    {
        string indexPath = null;
        using (LuceneHelper target = GetLuceneHelper(ref indexPath))
        {
            target.InsertOrUpdate(
                    target.MakeDocument(GetDefaultSearchDocument()), 
                    target.MakeDocument(GetSecondSearchDocument()));

            var doc = target.GetDocument(_documentID.ToString()).FirstOrDefault();
            Assert.IsNotNull(doc);
            Assert.AreEqual(doc.DocumentID, _documentID.ToString());

            doc = target.GetDocument(_document2ID.ToString()).FirstOrDefault();
            Assert.IsNotNull(doc);
            Assert.AreEqual(doc.DocumentID, _document2ID.ToString());
        }

        TidyUpTempFolder(indexPath);
    }

我不会发布我的LuceneHelper的完整代码,但它的基本思想是它在引用中保存一个IndexSearcher,每次将一个项写入索引时它都会被关闭(因此它可以再次重新打开)所有最新文件)。

收集第二份文件时,实际的单元测试通常会失败。我认为这与搜索者没有关闭并看到缓存数据有关,但事实并非如此。

Lucene在向索引添加文档方面有任何延迟吗?我假设一旦将文档添加到索引中,只要您关闭任何旧的搜索索引器并打开一个新索引器,它就立即可用。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如何关闭用于更新索引的IndexWriter? close方法有一个重载,它接受一个布尔参数,指定是否要等待合并完成。默认的合并调度程序在单独的线程中运行合并,这可能会导致您的问题。

尝试这样关闭作家:

indexWriter.Close(true);

可以在Lucene.NET documentation找到更多信息。

顺便说一下,您使用的是哪个版本的Lucene.NET?