如何从Lucene索引中删除单个文档? 没有方法deleteDocument(int docId),我找不到基于docId只选择一个文档的查询...
使用Lucene 4.10.3 感谢
答案 0 :(得分:3)
您将看到docId(int)永远不会出现在公共API中,因为docId可以随着每次提交而改变(并且合并...)。 所以你必须使用deleteDocuments(Term)。
在solr中你可以deleteById但在内部这与deleteDocuments(new Term("id",id))
答案 1 :(得分:0)
在将多个分片合并到一个大核心时,我意外地将两次合并到同一个核心,导致一组文档具有相同的id字段值。为解决这个问题,我使用此代码按位置ID删除文档:
public class IndexCleaner {
public static void main(String[] args) {
try (Directory dir = FSDirectory.open(new File(args[0]));
IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig(Version.LUCENE_4_10_4, null));
IndexReader reader = DirectoryReader.open(writer, false);) {
int numDocs = reader.numDocs();
Set<String> items = new HashSet<>(numDocs);
for (int i = numDocs - 1; i >= 0; i--) {
String id = reader.document(i).get("id");
if (items.contains(id)) {
writer.tryDeleteDocument(reader, i);
System.out.println("Document with id \"" + id + "\" marked for deletion");
}
else {
items.add(id);
}
}
writer.commit();
}
catch (Throwable e) {
e.printStackTrace();
}
}
}