【问题标题】:Minimize Lucene index file count最小化 Lucene 索引文件数
【发布时间】:2012-02-01 12:22:37
【问题描述】:

我有一个特定的应用程序,它要求构成索引的文件数量尽可能少。以前,当我使用 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 特有的。版本之间仍有一些变化,我很想控制它。

【问题讨论】:

  • 您的索引目录中有 CFS 文件吗?我刚刚测试过,复合文件似乎可以在 2.9.4g 版本中正常工作...
  • 不,我没有。我看到了一些对此 CFS 文件的网络参考,但我没有。请问是不是我的版本太低了?这是当前推荐的稳定版本。我刚刚查了一下,确切的版本是 2.4.9.1。
  • 我刚刚使用 Nuget 的 2.9.4.1 版本进行了测试,它工作正常。您确定在调用 SetUseCompoundFile(true) 后调用 commit() 或正确关闭 Writer 吗?
  • 什么时候需要调用SetUseCompoundFile(true)?我在创建作家后调用它。然后,当我想关闭作者时,我会执行writer.Optimize(1, true),然后立即执行writer.Commit()
  • 它只需要在调用commit之前调用,我个人是在创建IndexWriter后立即设置的。请注意,它仅适用于新发出的段

标签: lucene lucene.net


【解决方案1】:

好的,我终于找到了答案。在漫长的索引过程中检查索引目录时,我观察到 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 非常感谢您让我继续前进。我想如果您添加更多文档,您的示例也会失败。不过,我承认你的帮助,所以我会接受你的回答。

【讨论】:

    【解决方案2】:

    我将发布我用来测试它的确切代码 sn-p,将其与您的代码进行比较可能会帮助您找出问题所在。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 2013-06-24
      • 2011-12-13
      • 2012-09-16
      • 1970-01-01
      相关资源
      最近更新 更多