При объединении нескольких черепков в один большой сердечник, я случайно слились два раз то же самое ядро, в результате чего в группе документов, имеющих одинаковое значение для 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();
}
}
}