【问题标题】:Increase Solr performance when querying a subset of documents在查询文档子集时提高 Solr 性能
【发布时间】:2026-02-17 17:10:02
【问题描述】:

用例

我有一个可能包含数百万个文档的索引。我想对这些文档的一个子集(大约 25,000 个文档)进行大约 20'0000 次搜索。这 25'000 个文档可能会占用存储在 Solr 中的大约 100 MB(由存储和索引文本字段组成)。

问题

随着索引文档数量的增加,查询的性能会下降很多。例如,运行 20'000 次搜索,在 100'000 文档索引上命中 25'000 个文档,大约需要 4 分钟。在 200'000 个文档索引上运行相同的搜索大约需要 20 分钟。

那么有没有办法在搜索到它们之前将这 25,000 个文档缓存在 RAM 中?

更新

一些真正有帮助的事情:

  • 减少返回的行数(在几乎所有情况下,我都必须遍历返回的结果,并且在几乎所有不超过 100 个匹配结果的情况下,但我已将行设置为非常大的值。减少行数将性能提高了大约 2 倍。这似乎违反直觉。如果只有 79 个匹配项并且我将返回的行数设置为 100,它的性能要好于 79 个匹配项并且我设置行的情况计数到 1000。在第一种情况下,Solr 已经返回找到的项目计数并且速度很快。为什么会有性能差异?)

  • 减少多线程(我添加了多个线程用于查询,因为在开发盒上有更多可用资源。在资源受限的生产盒上,它会减慢速度。只使用一个或两个线程让我的速度提高了大约 2 倍。)

一些没有真正帮助的事情:

  • 拆分字段查询(我已经在任何可能的地方使用字段查询,但我将它们组合在一个 fq 中为每个查询 fq=name:a AND type:b。将它们拆分为 @987654323 @ 单独缓存它们(参见Apache Solr documentation)并可以提高性能。但在这种情况下并没有太大的不同。

  • 更改缓存设置在这种情况下 filterCache 似乎最有潜力。然而,增加它或改变它的设置并没有太大的不同。

【问题讨论】:

    标签: performance caching solr


    【解决方案1】:

    为提高性能而推荐的几件事:

    • 盒子上有足够的备用 RAM,以便索引文件可以在 OS 缓存中
    • 尝试在 SolrConfig 中使用 solr 缓存设置
    • 在提交后使用自动预热
    • 尝试开发您的查询以限制结果集。大型结果集,特别是如果使用分组和分面会降低性能。现在 200,000 个文档索引真的很小,所以你应该没有任何问题,但我想我会在你扩展时提到这一点。

      • 尽可能尝试使用过滤器查询 (FQ)。它们比在 q 中执行 field:val 快得多,而且它们是缓存的。

    【讨论】:

    • 感谢您的回复,如果有任何改进,将尝试不同的缓存选项并在此处留言。问题是 RAM 非常有限,所以如果我能以某种方式提示 solr 应该缓存哪些文档,那就太好了。
    • 当然,先尝试用FQ限制查询,我感觉在那里你会得到最大的收益。
    • 听起来不错,如果您在查询中使用分面,您还可以使用分面方法和分面线程。
    • 最终将 Solr 服务器移动到更快的机器上,并获得了另外 3-4 倍的速度提升。速度似乎不错,所以我终于接受了这个答案中的建议。