Lucene .NET频率的IndexWriter提交

时间:2016-02-19 17:13:19

标签: .net lucene.net

我在Lucene .Net中使用IndexWriter编写了许多文档。由于提交文件的成本很高,我想知道在提交之前是否有最佳数量的文件要添加。显然太多了,如果发生崩溃,你可能会失去内存中的所有内容,而且经常会像每个文档添加限制吞吐量一样。

2 个答案:

答案 0 :(得分:0)

在达到非常高的数字之前,似乎没有出现性能损失。

Total time to commit [10] messages was [00:00:00.1093779]
Total time to commit [20] messages was [00:00:00.0156221]
Total time to commit [40] messages was [00:00:00]
Total time to commit [80] messages was [00:00:00.0312509]
Total time to commit [160] messages was [00:00:00.0156231]
Total time to commit [320] messages was [00:00:00.0156273]
Total time to commit [640] messages was [00:00:00.0312489]
Total time to commit [1280] messages was [00:00:00.0312509]
Total time to commit [2560] messages was [00:00:00.0500343]

答案 1 :(得分:0)

对于这个看似简单的问题,这不是一个好的答案。除了"它取决于" ...

这取决于很多事情,例如:

  • 每份文件有多大?如果它们很大(许多字段,大字段),则在发生刷新时数字将非常小
  • 用例是什么?你批量插入?如果是,那么高值"更好",更少IO =更高的吞吐量。您是否需要立即提交/持久/持久的文档。然后你应该承诺每次添加/更新。很多IO但是如果频率很低的话。然后是中间的无限光谱。

你最好设置" setRAMBufferSizeMB"而不是" setMaxBufferedDocs"。限制使用的内存量使基础架构需求更具可预测性。默认情况下,lucene按内存大小刷新(默认为16MB)。

还有另一种方法。将缓冲区大小设置为相当高的数字。但也有一个定期提交的计时器。这样可以在缓冲和您可能失去的时间之间取得平衡。更新。

是否有递增的" ID"与文档相关联?如果是这样,请确保它是一个字段。然后在启动时,您可以通过使用ID降序排序进行查询来查询最新的文档(例如"按ID desc选择前1个顺序")并从那里重新启动更新。

如果没有ID,则添加一个数字日期字段并将DateTime.UtcNow.Ticks放入其中。这将成为您的更新光标"。

要记住的另一件事是搜索延迟。摄取文档和可搜索文档之间的时间量。您可以遵循NRT模式,几乎完全是最新的。但是有成本。或者您可以确定某些延迟是可以接受的。在这种情况下,您可以更明智地决定何时刷新Reader / Searcher。

更多的概念性讨论。如果您可以提供有关各种问题和参数的更多详细信息,我可以更具体。