Solr 分面搜索性能建议

5
我们有一个拥有86315770个文档的Solr实例。它占用了4GB的内存,并且我们需要对经过分词的内容字段进行faceting操作。磁盘上的索引大小为23GB。
为什么我们要在分词后的字段上进行faceting?因为我们想查询该字段上使用最多的前n个术语。问题是这样的查询太耗时间了。是否有办法改善进行此类faceting时的时间?有什么建议吗?
提前感谢您的帮助。

你有设置 facet.limit 吗?我注意到即使有10万条以上的记录,如果没有设置 facet.limit(在您的情况下,无论 n 是多少),这种查询可能需要很长时间。 - David Faber
2个回答

2
由于Solr在内存数据结构上计算facets,因此facet计算很可能会受到CPU的限制。计算facets的代码已经高度优化(对于多值字段的UnInvertedField中的getCounts方法)。
一种想法是并行计算。也许最简单的方法是将你的集合分成几个片段,如在单台机器上使用多个Solr片段是否提高了性能?所述。
否则,如果您的术语词典足够小,并且查询可以采用有限数量的形式,您可以设置一个不同的系统,该系统将维护每个(术语、查询)对的计数矩阵。例如,如果您只允许术语查询,这意味着您应该维护每对术语的计数。请注意,这将根据术语和查询的总数需要大量的磁盘空间。如果您不要求计数精确,则最简单的方法可能是批处理计算这些计数。否则,保持计数与Solr同步可能有点棘手。

0

问题是我需要将术语计数应用于查询。使用topTerms可以实现吗? - rreyes1979
您可以将Luke请求的numTerms参数设置为任何数字,类似于我在上面评论中解释的使用facet.limit。但是,与普通的faceting不同,Luke将返回索引中术语的不同数字,因为Luke会为索引中的文档返回topTerms,这些文档已不再可搜索(即已删除但尚未合并)。 - David Faber
此外,我测试了Luke与分面的速度,结果总是需要更长时间。话虽如此,如果您使用的是Solr 3.6或4.0,则据说在这些版本中的LukeRequestHandler中已经进行了一些速度改进。 - David Faber
但是是否可以像faceting一样将topTerms应用于查询呢?我不想获取所有文档的top terms,只想获取通过查询选择的子集。顺便说一下,谢谢你的时间 :) - rreyes1979
好的,我没有理解您想要针对给定查询获取顶部术语,这不起作用。 - jpountz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接