C# 为什么不';Lucene删除文档?

C# 为什么不';Lucene删除文档?,c#,lucene,C#,Lucene,我正在使用Lucene.NET 2.3.1和多搜索器 出于测试目的,我正在为一个大约10000行的数据库编制索引。我有两个索引,我随机选择插入每一行的索引。这是正确的,但由于Lucene没有更新功能,我必须测试该行是否存在(我有一个Id字段),然后将其删除 我有一个列表和一个列表,每个列表都是用以下代码创建的: IndexModifier mod = new IndexModifier(path, new StandardAnalyzer(), create); m_Modifiers.Add(

我正在使用Lucene.NET 2.3.1和多搜索器

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

我有一个列表和一个列表,每个列表都是用以下代码创建的:

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);
}
Hits results=m_Searcher.Search(新术语查询(t));
对于(int i=0;i
搜索是正确的,当行存在时,我会得到结果。Subsarcher始终返回0或1,如果索引为0,SubDoc返回传递的相同ID,如果为1,则返回传递的数字减去我为数据库编制索引的次数的5000倍。似乎它没有删除任何内容

每次为数据库编制索引时,我都会优化并关闭索引,Luke说它没有待删除的内容


可能有什么问题?

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

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

其次,您不需要在该子搜索器中找到子搜索器ID和文档ID。您也可以使用顶级多读卡器。我将编写如下等价的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();
IndexReader[]readers=新的IndexReader[size];
//初始化读卡器
多读卡器多读卡器=新的多读卡器(读卡器);
IndexSearcher搜索器=新的IndexSearcher(多阅读器);
Hits results=searcher.search(新术语查询(t));
对于(int i=0;i
谢谢,最后我自己解决了。我的问题实际上是一个字段,它应该是非标记化的,并且是标记化的。如果我没记错的话,为了使用multiReader进行删除,我必须关闭修改器,因为大多数删除都是作为文档更新的一部分进行的,所以我不希望关闭它,而是直接使用修改器删除它。我是对的,还是有更好的解决方案?