【问题标题】:Solr faceted search performance recommendationsSolr 多面搜索性能建议
【发布时间】:2012-03-26 14:55:48
【问题描述】:

我们有一个包含 86,315,770 个文档的 solr 实例。它使用多达 4GB 的内存,我们需要它来对称为内容的标记化字段进行分面。磁盘上的索引大小为 23GB。

为什么我们要在标记化字段上进行分面?因为我们要查询该字段中最常用的前“n”个术语。问题是执行此类查询花费的时间太长。像这样进行刻面时,有什么方法可以改善时间吗?有什么建议吗?

提前致谢。

【问题讨论】:

  • 你在设置facet.limit吗?我注意到,如果未设置 facet.limit(在您的情况下,无论 n 可能是什么),即使有 100,000 多条记录,此类查询也可能需要很长时间。

标签: solr faceted-search


【解决方案1】:

由于 Solr 在内存数据结构上计算构面,因此构面计算很可能受 CPU 限制。计算分面的代码已经高度优化(UnInvertedField 中的getCounts 方法用于多值字段)。

一个想法是并行计算。也许最简单的方法是按照Do multiple Solr shards on a single machine improve performance? 中的描述将您的集合拆分为多个分片。

否则,如果您的术语字典足够小并且查询可以采用有限数量的形式,您可以设置一个不同的系统来维护每个(术语,查询)对的计数矩阵。例如,如果您只允许术语查询,这意味着您应该维护每对术语的计数。请注意,这将需要大量磁盘空间,具体取决于术语和查询的总数。如果您不需要精确计数,也许最简单的方法是在批处理过程中计算这些计数。否则,保持计数与 Solr 同步可能(可能,但)有点棘手。

【讨论】:

    【解决方案2】:

    您可以使用LukeRequestHandlertopTerms 功能。

    【讨论】:

    • 问题是我需要将术语计数应用于查询。 topTerms 有可能吗?
    • 您可以将 Luke 请求的 numTerms 参数设置为您想要的任何 #,类似于我在上面的评论中解释的使用 facet.limit。但是,Luke 将为索引中的术语返回不同的#s,而不是普通的 faceting,因为 Luke 为索引中不再可搜索的文档(即那些已删除但尚未合并的文档)返回 topTerms。
    • 另外,我测试了 Luke 对 faceting 的速度,它总是需要更长的时间。也就是说,如果您使用的是 Solr 3.6 或 4.0,则应该在这些版本中的 LukeRequestHandler 中进行了一些速度改进。
    • 但是是否可以在分面允许的情况下将 topTerms 应用于查询?我不想获得所有文档的最重要的术语,只是一个将通过查询选择的子集。谢谢你的时间,顺便说一句:)
    • 好的,我不知道您想要给定查询的热门词,这不起作用。
    猜你喜欢
    • 2019-05-13
    • 2012-08-26
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    相关资源
    最近更新 更多