在Lucene中拥有更多更小的记录或更少的大记录会更好吗?

时间:2012-02-23 16:49:36

标签: c# lucene lucene.net

我正在为使用Lucene.net的应用程序索引大量日志文件。现在我正在为每个条目解析我的日志文件(即一个条目可以跨越多行直到下一个日志条目)并将每个日志条目添加为Lucene中的文档。

每个文档都包含日志条目(已分析)并具有一些其他字段(仅存储),例如日志行时间,日志行号以及它来自哪种日志。我还给每个日志条目文档一个guid,将一系列日志条目映射回原始源文档,我可以按行号重新排序。

虽然我喜欢能够在索引中搜索每行条目的粒度(我可以通过关闭我已分配每个日志文件的guid重建原始文档),但我很好奇这种索引创造将是可持续的。事实上,我已经拥有了2500万个条目,代表了一年的日志。我的搜索速度仍然很快,我可以在大约一两秒内搜索这2500万条记录。

文档较少但每个文档较大是否更好?有关系吗?当我有5000万条目时,我会遇到Lucene的性能瓶颈吗? 1亿? 500万?如果我只对每个日志文件编制索引,如果我估计每个日志文件大约有1000-20000行,那么我可能会减少3个数量级的文档。

2 个答案:

答案 0 :(得分:3)

所有这些事情的建议是:表现几乎肯定不是你的主要问题。如果所需的功能最适合每行一个文档,那么就这样做。

话虽如此,Lucene的术语词典看起来像:

term1 -> doc1 doc4 doc32 ...
term2 -> doc1 doc3 doc8

因此,拥有更多文档会增加索引的大小。

在您断定这对性能有害之前,如果您将整个文件编入索引作为一个文档,请询问如何将每行返回为自己的搜索结果。您必须在搜索结果上实施一些辅助搜索,这几乎可以保证比Lucene的速度慢。所以让Lucene来处理它。

至于你关于Lucene可以扩展的程度的问题:几年前提交了一个补丁,因为Lucene使用的32位ID太小了。因此,有些索引包含超过2 ^ 32 = 42亿个文档。

答案 1 :(得分:1)

RavenDB在内部使用Lucene进行所有查询,并且性能测试表明,具有更多字段的索引比具有更少字段的索引更好。

请参阅this thread了解一些实际数字,例如:

  • 100个索引,每个属性有一个属性:00:05:08
  • 1个100个属性的索引:00:02:01

这是25,600个文档(每个文档都有100个字符串属性填充guids)。

注意这些数字适用于RavenDB,但它广泛使用Lucene,所以如果直接使用Lucene有很大的不同,我会感到惊讶