为什么删除不会减少lucene中的索引文件大小?

时间:2014-05-10 11:22:12

标签: indexing document

    IndexWriter writer = null;
    try {
        Directory dir = FSDirectory.open(new File(path));
        Analyzer analyzer = new StandardAnalyzer(LUCENE_VERSION);
        IndexWriterConfig iwc = new IndexWriterConfig(LUCENE_VERSION, analyzer);
        iwc.setRAMBufferSizeMB(getIndexRamBufferSizeMB());
        iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);
        writer = new IndexWriter(dir, iwc);

        Term term = new Term(request.getIndexKeyName(), String.valueOf(request.getId()));
        writer.deleteDocuments(term);
        writer.deleteUnusedFiles();         
    } catch (Exception e) {
        e.printStackTrace();
    }
    finally {
        if (writer != null) {
            try {
                writer.commit();
                writer.close(true);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }
    }

我可以删除文档,但索引文件大小不会减少,尤其是_a.fdt,_a_Lucene41_0.pos。

在删除_a.fdt大小10037kb之前,删除所有文档后,大小是相同的。

请帮忙吗?

2 个答案:

答案 0 :(得分:0)

Lucene针对搜索速度进行了优化。

重新组织文件以回收由删除释放的空间需要磁盘I / O,这是一项非常昂贵的操作(与RAM和从磁盘读取文件相比)。因此,当您从索引中删除文件时,这并不能告诉Lucene执行此(昂贵的)重组。

要释放空间,您可以使用基本上释放磁盘空间的expungeDeletes(),或者optimize(),这会花费更多精力,可以提高搜索性能。

答案 1 :(得分:0)

OP写道:

  

解决!我在writer.forceMergeDeletes()之后使用writer.deleteUnusedFiles(),然后删除除segments_csegment_gen之外的所有文件。