2012-03-26 88 views
5

我们有一个包含86,315,770个文档的solr实例。它使用高达4GB的内存,我们需要它在一个称为内容的标记字段上进行刻面。磁盘上的索引大小为23GB。Solr分面搜索性能建议

为什么我们要在一个标记化的领域进行构造?因为我们想要查询该字段中最常用的术语“n”。问题是执行这样的查询花费太长时间了。有这样的方式来改善时间吗?任何建议?

在此先感谢。

+0

您是否正在设置“facet.limit”?我注意到,如果没有设置“facet.limit”(在你的情况下,不管是什么'n'可能),这样的查询可能需要很长时间,即使有100,000个以上的记录。 – 2012-03-26 15:03:10

回答

2

由于Solr计算内存中数据结构的方面,所以方面计算可能是CPU限制的。计算方面的代码已经高度优化(对于多值字段,getCounts方法在UnInvertedField中)。

一个想法是并行计算。也许最简单的方法是按照Do multiple Solr shards on a single machine improve performance?中的描述将你的集合分成几个分片。否则,如果您的词典足够小,并且查询可以采用有限数量的表单,则可以设置一个不同的系统来维护每个(术语,查询)对的计数矩阵。例如,如果您只允许使用术语查询,这意味着您应该维护每对术语的计数。请注意,这将需要大量的磁盘空间,具体取决于术语和查询的总数。如果你不需要计数准确,最简单的方法就是在批处理过程中计算这些计数。否则,它可能会(可能,但)与Solr保持同步计数有点棘手。

0

您可以使用LukeRequestHandlertopTerms功能。

+0

问题是我需要将术语计数应用于查询。 topTerms可能吗? – rreyes1979 2012-03-26 16:51:53

+0

您可以将Luke请求的numTerms参数设置为任何您想要的参数,类似于使用'facet.limit',正如我在上面的注释中所解释的那样。但是,卢克将返回不同于#的索引中的术语,因为Luke会返回索引中不再可搜索的文档(即那些已删除但尚未合并的文档)的topTerms。 – 2012-03-26 18:29:02

+0

另外,我测试了卢克的反面速度,它总是需要更长的时间。也就是说,如果你使用的是Solr 3.6或4.0,那么LukeRequestHandler在这些版本中应该有一些速度的提升。 – 2012-03-26 18:36:11