为什么'Lucene不删除文档?

时间:2009-07-02 11:03:14

标签: c# lucene

我正在使用Lucene.NET 2.3.1和MultiSearcher。

出于测试目的,我正在使用大约10000行索引数据库。我有两个索引,我随机选择插入每行。这是正常的,但由于Lucene没有更新功能,我必须测试行是否存在(我有一个Id字段),然后删除它。

我有一个List和一个List,每个都是用这段代码创建的:

IndexModifier mod = new IndexModifier(path, new StandardAnalyzer(), create);
m_Modifiers.Add(mod);
m_Readers.Add(IndexReader.Open(path));
m_Searchers.Add(new IndexSearcher(path));

现在删除代码:

Hits results = m_Searcher.Search(new TermQuery(t));

for (int i = 0; i < results.Length(); i++)
{
    DocId = results .Id(i);
    Index = m_Searcher.SubSearcher(DocId);
    DocId = m_Searcher.SubDoc(DocId);

    m_Modifiers[Index].DeleteDocument(DocId);
}

搜索是正确的,当行存在时我得到结果。 SubSearcher总是返回0或1,如果Index为0,则SubDoc返回相同的ID,如果它为1,则返回传递的数字减去我索引数据库的次数的5000倍。好像它没有删除任何东西。

每次我索引数据库时,我都会优化并关闭索引,Luke说它没有待删除。

可能是什么问题?

1 个答案:

答案 0 :(得分:0)

我不确定此活动的最终目标是什么,请原谅以下解决方案是否符合您的要求。

首先,如果要删除文档,可以使用已创建的IndexReader。 IndexModifier不是必需的。

其次,您无需在该子搜索器中找到子搜索者ID和文档ID。您也可以使用顶级MultiReader。我会写如下等效的java代码。

IndexReader[] readers = new IndexReader[size];
// Initialize readers
MultiReader multiReader = new MultiReader(readers);

IndexSearcher searcher = new IndexSearcher(multiReader);
Hits results = searcher.search(new TermQuery(t));
for (int i = 0; i < results.length(); i++) {
    int docID = results.id(i);
    multiReader.deleteDocument(docID);
}
multiReader.commit(); // Check if this throws an exception.
multiReader.close();
searcher.close();