Lucene 3.0.3不会删除文件

我们使用Lucene来索引一些内部文档。 有时我们需要删除文件。 这些文件有一个唯一的id,并且由一个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,没有幸运。

通过这篇文章和这篇文章,我们认为我们正在使用它accordinlgy。

我们做错了什么? 有什么建议? 我们使用lucene 3.0.3和java 1.6.0_24。

TIA,

短发


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

这比indexwriter方法的优点是,它返回已删除的文档总数,如果没有返回0,则返回全部文档。

另请参阅如何从索引中删除文档? 和这篇文章

编辑:另外我注意到你在只读模式下打开indexreader,你可以改变listFiles()索引读取器打开 false作为第二参数,这将允许读写,也许错误的来源


IndexWriter实例化/配置期间我调用IndexWriterConfig#setMaxBufferedDeleteTerms(1),并且所有删除​​操作立即转到光盘。 也许这是不正确的设计,但解决了这里解释的问题。


    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(
链接地址: http://www.djcxy.com/p/51833.html

上一篇: Lucene 3.0.3 does not delete document

下一篇: How do I insert QTabBar in Qt Designer?