我正在使用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说它没有待删除。
可能是什么问题?
答案 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();