我们使用Lucene来索引一些内部文档。有时我们需要删除文件。这些文件有一个唯一的ID,并通过如下一类DocItem代表(所有的代码是唯一显着(我希望)零件的简化版本):Lucene 3.0.3不会删除文档
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,没有幸运。
通过这个post和这个post,我们认为我们正在使用它accordinlgy。
我们在做什么错了?有什么建议?我们使用lucene 3.0.3和java 1.6.0_24。
TIA,
鲍勃