2011-04-01 55 views
7

我们使用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,

鲍勃

回答

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(
3

我建议,使用的IndexReader DeleteDocumets,它返回删除的文件的数量。这将有助于缩小删除是否发生在第一计数上。

的这种过度的方法的IndexWriter的优点在于,它返回删除的文件总数,如果没有如果将返回0

另见How do I delete documents from the index?this

编辑:此外,我注意到你以只读模式打开的IndexReader,你可以改变listFiles()指数读者open假作为第二PARAM,这将允许读写,也许是错误的根源