Удаление документа Lucene внутри цикла TopDocs.scoreDocs без использования уникального идентификатора - PullRequest
0 голосов
/ 17 ноября 2011

Чтобы удалить документ в Lucene, есть функция indexWriter.deleteDocuments (...) с Query и / или Terms. Это отлично работает.

Однако мне нужно будет просмотреть коллекцию документов и удалить некоторые из них в зависимости от условия. Я мог бы добавить поле уникального идентификатора в документе и вызвать indexWriter.deleteDocuments (...) на основе этого уникального идентификатора. Однако я бы хотел избежать этой опции и вместо этого сделать что-то подобное:

TopDocs hits = indexSearcher.search(...);
for (ScoreDoc scoreDoc : hits.scoreDocs) {
   Document doc = indexSearcher.doc(scoreDoc.doc);
   if (...) {
      indexWriter.delete(doc);   // or similar
   }
}

Возможно ли это сделать?

ps. Опять же, я знаю, что могу добавить поле уникального идентификатора в документ, и удалите документ внутри цикла, вызвав indexWriter.deleteDocuments (...) на основе этого уникального идентификатора. Это будет работать нормально. Однако я спрашиваю, возможно ли это сделать без этой опции. Пожалуйста, не отвечайте о том, является ли это правильным подходом. Это интересная дискуссия, но она не является целью этого поста. Пожалуйста, отвечайте только о том, возможно ли (и как), или нет, без добавления уникального идентификатора.

pss: Я знаю, что повторяюсь, но я скажу это снова, потому что боюсь, что получу ответы, не связанные с целью этого поста. на самом деле, пожалуйста, сосредоточьтесь только на том, возможно ли это (и как) или нет без добавления уникального идентификатора.

1 Ответ

1 голос
/ 17 ноября 2011

Вместо этого вы можете использовать IndexReader.

TopDocs hits = indexSearcher.search(...);
for (ScoreDoc scoreDoc : hits.scoreDocs) {
   Document doc = indexSearcher.doc(scoreDoc.doc);
   if (...) {
      indexSearcher.getIndexReader().deleteDocument(doc);
   }
}

Это не сработает, если у вас IndexWriter уже открыто на Directory, поэтому, возможно, это не такприменимо к вашему делу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...