我正在尝试从我创建的Lucene索引中删除文档。我的删除代码看起来像这样:
public void delete(String fname, String index_path)
{
try {
Analyzer analyzer = new StandardAnalyzer();
QueryParser parser = new QueryParser(LuceneConstants.FILE_NAME, analyzer);
Directory indexDirectory = FSDirectory.open(Paths.get(index_path));
IndexWriterConfig iwg = new IndexWriterConfig(analyzer);
iwg.setMaxBufferedDeleteTerms(1);
iwg.setOpenMode(IndexWriterConfig.OpenMode.APPEND);
IndexWriter writer = new IndexWriter(indexDirectory,iwg);
writer.deleteDocuments(new Term(LuceneConstants.FILE_NAME,fname));
writer.forceMergeDeletes();
writer.commit();
writer.flush();
System.out.println(writer.hasDeletions());
writer.close();
System.out.println("Deleted File :"+fname);
} catch (IOException ex) {
Logger.getLogger(IndexHandler.class.getName()).log(Level.SEVERE, null, ex);
} catch (ParseException ex) {
Logger.getLogger(IndexHandler.class.getName()).log(Level.SEVERE, null, ex);
}
}
我尝试使用和不使用forceMergeDeletes
执行上述代码,并且都将hasDeletions
显示为false。我的代码有问题吗?
我还尝试在新程序中打开IndexReader进行搜索以检查是否有任何延迟删除文件但我能够搜索已删除的文件。当我尝试使用查询删除文档时,整个索引被删除(即使在APPEND模式下),我确信索引中的每个文档的文件名都不同。我是Lucene的新手,如果有人能帮助我,那就太棒了:)。
答案 0 :(得分:1)
您应该小心使用分析的查询进行删除。请注意,deleteDocuments
会在运行查询时删除所有搜索结果,无论得分如何,而不仅仅是最佳或第一个结果。
假设您正在尝试删除路径中的文件:" /rootdirectory/testfile.txt"
分析的查询将如下所示:filename:rootdirectory filename:testfile.txt
因此,如果所有文档文件名都在" rootdirectory"中,那么是的,它们都会被删除。