2012-02-01 86 views
0

我有一个特定的应用程序,它要求组成索引的文件数尽可能少。先前,当我用Lucene.NET 2.9.2我能够通过使用保持整个索引3(或4)文件:最小化Lucene索引文件数

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特有的。不同版本之间还有一些变化,我很乐意控制它。

+0

你的索引目录中是否有CFS文件?我刚刚测试过,复合文件似乎与2.9.4g版本一起工作正常... – 2012-02-01 13:58:52

+0

不,我不知道。我看到了一些关于这个CFS文件的网站引用,但我没有。我不知道我的版本是否太低?这是目前推荐的稳定版本。我刚刚检查过,确切的版本是2.4.9.1。 – wpfwannabe 2012-02-01 14:53:59

+0

我刚刚使用Nuget的2.9.4.1版本进行测试,它工作正常。您是否确定在调用SetUseCompoundFile(true)后调用commit()或正确关闭Writer? – 2012-02-01 15:11:52

回答

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

好的,我终于找到了答案。在漫长的索引过程中检查索引目录时,我发现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); 
     } 

设置“无CFS-率”为100%,保持内CFS与事最后都段以我想要的方式工作。

所以,@ jf-beaulac非常感谢让我去。如果你添加了更多的文档,我想你的示例也会失败。不过,我承认你的帮助,所以我会接受你的回答。

+0

哇很好的接收,这是很高兴知道! – 2012-02-01 17:48:47