我有一个特定的应用程序,要求组成索引的文件数尽可能少。以前当我使用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的具体情况并不多。版本之间仍有些变化,我很想控制它。
答案 0 :(得分:4)
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();