2016-02-17 2 views
0

Как удалить отдельный документ из индекса Lucene? Там нет метода deleteDocument (интермедиат DocId), и я не могу найти запрос, который выбирает только один документ, основанный на DocId ...Удаление документа lucene по id

с помощью Lucene 4.10.3 Благодарности

ответ

2

Вы увидите DocId (INT) никогда в public api, потому что docId может меняться с каждой фиксацией (и слиянием ...). Итак, вы должны использовать deleteDocuments(Term).

В Solr вы можете deleteById но внутренне это то же самое, как deleteDocuments(new Term("id",id))

0

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