最小化Lucene索引文件计数

时间:2012-02-01 12:22:38

标签: lucene lucene.net

我有一个特定的应用程序,要求组成索引的文件数尽可能少。以前当我使用Lucene.NET 2.9.2时,我能够通过使用以下内容将整个索引保存在3(或4)个文件中:

writer.SetUseCompoundFile(true);
writer.Optimize(1, true);

升级到Lucene.NET 2.9.4之后,相同的代码生成由10个文件组成的索引(fdt,fdx,fnm,frq,nrm,prx,tii,tis + segments.gen和segments_c)。我怎么能再把它拿下来呢?

原因可能是Lucene的深层次,而Lucene.NET的具体情况并不多。版本之间仍有些变化,我很想控制它。

2 个答案:

答案 0 :(得分:4)

好的,我终于找到了答案。在冗长的索引过程中检查索引目录时,我观察到CFS来来往往,但是一旦完成该过程,就没有CFS文件的迹象。我做了一些研究,给出了一些新的关键词(感谢@ jf-beaulac)和I've found this。他们说CFS的默认阈值是整个索引大小的10%。如果任何段超过该段,则无论writer.SetUseCompoundFile(true)用法如何,都不会创建CFS。

因此,在通过Lucene.NET进行一些挖掘后,我提出了以下必要步骤:

        indexWriter.SetUseCompoundFile(true);
        var mergePolicy = indexWriter.GetMergePolicy();
        var logPolicy = mergePolicy as LogMergePolicy;
        if (logPolicy != null)
        {
            logPolicy.SetNoCFSRatio(1);
        }

将“no-cfs-ratio”设置为100%会使CFS中的所有段保持最终状态,并且最终会按照我希望的方式运行。

所以,@ jf-beaulac非常感谢让我前进。我想如果添加更多文档,您的样本也会失败。不过,我认可你的帮助,所以我会接受你的回答。

答案 1 :(得分:2)

我会发布用于测试此内容的确切代码段,将其与您的代码进行比较可能会帮助您找到错误的内容。

FSDirectory dir = FSDirectory.GetDirectory("C:\\temp\\CFSTEST");
IndexWriter writer = new IndexWriter(dir, new CJKAnalyzer());
writer.SetUseCompoundFile(true);

Document document = new Document();

document.Add(new Field(
    "text",
    "プーケット",
    Field.Store.YES,
    Field.Index.ANALYZED));
writer.AddDocument(document);

document.GetField("text").SetValue("another doc");
writer.AddDocument(document);

writer.Optimize(1, true);
writer.Close();