按id删除lucene文档

时间:2016-02-17 13:39:46

标签: lucene

如何从Lucene索引中删除单个文档? 没有方法deleteDocument(int docId),我找不到基于docId只选择一个文档的查询...

使用Lucene 4.10.3 感谢

2 个答案:

答案 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();
    }
  }
}