Lucene 3.0.3 не удаляет документ - PullRequest
7 голосов
/ 01 апреля 2011

Мы используем Lucene для индексирования некоторых внутренних документов.Иногда нам нужно удалить документы.Эти документы имеют уникальный идентификатор и представлены классом DocItem следующим образом (ВСЕ КОДЫ - ПРОСТОТА ВЕРСИИ С ТОЛЬКО ЗНАЧИМЫМИ (надеюсь) ЧАСТЯМИ):

public final class DocItem {

  public static final String fID = "id";
  public static final String fTITLE = "title";

  private Document doc = new Document();
  private Field id = new Field(fID, "", Field.Store.YES, Field.Index.ANALYZED);
  private Field title = new Field(fTITLE, "", Field.Store.YES, Field.Index.ANALYZED);

  public DocItem() {
    doc.add(id);
    doc.add(title);
  }

  ... getters & setters

  public getDoc() {
    return doc;
  }
}

Итак, для индексации документа,Новый DocItem создается и передается в класс индексатора следующим образом:

public static void index(DocItem docitem) {
  File file = new File("indexdir");
  Directory dir= new SimpleFSDirectory(file);
  IndexWriter idxWriter = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), IndexWriter.MaxFieldLength.UNLIMITED);
  idxWriter.addDocument(docitem.getDoc());
  idxWriter.close();
}

Мы создали вспомогательный метод для итерации по каталогу индекса:

public static void listAll() {
  File file = new File("indexdir");
  Directory dir = new SimpleFSDirectory(file);
  IndexReader reader = IndexReader.open(dir);

  for (int i = 0; i < reader.maxDoc(); i++) {
    Document doc = reader.document(i);
    System.out.println(doc.get(DocItem.fID));
  }
}

Запустив listAll, мы можем видетьчто наши документы индексируются должным образом.По крайней мере, мы можем видеть id и другие атрибуты.

Мы извлекаем документ, используя IndexSearcher, следующим образом:

public static DocItem search(String id) {
  File file = new File("indexdir");
  Directory dir = new SimpleFSDirectory(file);
  IndexSearcher searcher = new IndexSearcher(index, true);
  Query q = new QueryParser(Version.LUCENE_30, DocItem.fID, new StandardAnalyzer(Version.LUCENE_30)).parse(id);
  TopDocs td = searcher.search(q, 1);
  ScoreDoc[] hits = td.scoreDocs;
  searcher.close();
  return hits[0];
}

Итак, получив его, мы пытаемся удалить его с помощью:

public static void Delete(DocItem docitem) {
  File file = new File("indexdir");
  Directory dir= new SimpleFSDirectory(file);
  IndexWriter idxWriter = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), IndexWriter.MaxFieldLength.UNLIMITED);
  idxWriter.deleteDocuments(new Term(DocItem.fID, docitem.getId()));
  idxWriter.commit();
  idxWriter.close();
}

Проблема в том, что это не работает.Документ никогда не удаляется.Если я выполню listAll () после удаления, документ все еще там.Мы попытались использовать IndexReader, но не повезло.

К этому сообщению и к этому сообщению , мы думаем, что мы используем его согласно.

Что мы делаем не так?Любой совет?Мы используем Lucene 3.0.3 и Java 1.6.0_24.

TIA,

Bob

Ответы [ 3 ]

3 голосов
/ 01 апреля 2011

Я бы предложил использовать IndexReader DeleteDocumets , он возвращает количество удаленных документов. это поможет вам определить, происходит ли удаление при первом подсчете.

преимущество этого метода по сравнению с методом indexwriter состоит в том, что он возвращает весь удаленный документ, если его нет, если возвращает 0.

Также см. Как удалить документы из индекса? и это сообщение

Редактировать: Также я заметил, что вы открываете читатель индекса в режиме только для чтения, можете ли вы изменить читатель индекса listFiles () открыть со значением false в качестве второго параметра, это позволит читать записи возможно источник ошибки

1 голос
/ 22 апреля 2012

Я вызываю IndexWriterConfig # setMaxBufferedDeleteTerms (1) во время IndexWriter создания / конфигурации, и все операции удаления немедленно отправляются на диск.Возможно, это неверно с точки зрения дизайна, но решает проблему, описанную здесь.

0 голосов
/ 01 апреля 2011
    public static void Delete(DocItem docitem) {
  File file = new File("indexdir");
  Directory dir= new SimpleFSDirectory(file);
  IndexWriter idxWriter = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), IndexWriter.MaxFieldLength.UNLIMITED);
  idxWriter.deleteDocuments(new Term(DocItem.fID, docitem.getId()));
  idxWriter.commit();
  idxWriter.close(
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...