Мы используем 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