查询文档子集时提高 Solr 性能
Increase Solr performance when querying a subset of documents
用例
我有一个可能包含数百万个文档的索引。我想对这些文档的一个子集(大约 25'000 个文档)进行大约 20'0000 次搜索。这 25'000 个文档可能会占用 Solr 中存储的大约 100 MB 的空间(由存储和索引文本字段组成)。
问题
随着索引文档数量的增加,查询的性能下降很多。例如 运行 在 100'000 个文档索引上命中 25'000 个文档的 20'000 次搜索大约需要 4 分钟。 运行 在 200'000 个文档索引上进行相同的搜索大约需要 20 分钟。
那么有什么方法可以在搜索前将这 25'000 个文档缓存在 RAM 中?
更新
一些真正有用的东西:
减少返回的行数(在几乎所有情况下,我都必须遍历返回的结果,并且在几乎所有不超过 100 个匹配结果的情况下,但我将行数设置为一个非常大的值。减少行数可将性能提高 2 倍左右。这似乎违反直觉。如果只有 79 个匹配项并且我将返回的行数设置为 100,则它的性能比 where are 79 场比赛,我将行数设置为 1000。在第一种情况下,Solr 已经 returns 找到了项目数并且速度很快。为什么会有性能差异?)
减少多线程(我添加了多个线程用于查询,因为在开发箱上有更多可用资源。在资源受限的生产箱上它正在变慢事情下来了。只使用一个或两个线程使我的速度提高了大约 2 倍。)
一些没有真正帮助的事情:
拆分字段查询(我已经在任何可能的地方使用字段查询,但我将它们组合在一个 fq 中用于每个查询 fq=name:a AND type:b
。用 fq=name:a&fq=type:b
将它们分开缓存它们(参见 Apache Solr documentation)并可以提高性能。但在这种情况下并没有太大的不同。
更改缓存设置 在这种情况下,filterCache 似乎最有潜力。然而,增加它或改变它的设置并没有太大的不同。
关于性能的一些建议:
- 盒子上有足够的备用 RAM,以便索引文件可以在 OS 缓存中
- 尝试使用 SolrConfig 中的 solr 缓存设置
- 提交后尝试自动加热
尝试开发您的查询以限制结果集。大型结果集,特别是如果使用分组和分面会降低性能。现在 200,000 个文档索引确实很小,所以你应该没有任何问题,但我想我会在你扩展时提到这个。
- 尽可能使用过滤器查询 (FQ)。它们比在 q 中执行 field:val 快得多,而且它们被缓存了。
用例
我有一个可能包含数百万个文档的索引。我想对这些文档的一个子集(大约 25'000 个文档)进行大约 20'0000 次搜索。这 25'000 个文档可能会占用 Solr 中存储的大约 100 MB 的空间(由存储和索引文本字段组成)。
问题
随着索引文档数量的增加,查询的性能下降很多。例如 运行 在 100'000 个文档索引上命中 25'000 个文档的 20'000 次搜索大约需要 4 分钟。 运行 在 200'000 个文档索引上进行相同的搜索大约需要 20 分钟。
那么有什么方法可以在搜索前将这 25'000 个文档缓存在 RAM 中?
更新
一些真正有用的东西:
减少返回的行数(在几乎所有情况下,我都必须遍历返回的结果,并且在几乎所有不超过 100 个匹配结果的情况下,但我将行数设置为一个非常大的值。减少行数可将性能提高 2 倍左右。这似乎违反直觉。如果只有 79 个匹配项并且我将返回的行数设置为 100,则它的性能比 where are 79 场比赛,我将行数设置为 1000。在第一种情况下,Solr 已经 returns 找到了项目数并且速度很快。为什么会有性能差异?)
减少多线程(我添加了多个线程用于查询,因为在开发箱上有更多可用资源。在资源受限的生产箱上它正在变慢事情下来了。只使用一个或两个线程使我的速度提高了大约 2 倍。)
一些没有真正帮助的事情:
拆分字段查询(我已经在任何可能的地方使用字段查询,但我将它们组合在一个 fq 中用于每个查询
fq=name:a AND type:b
。用fq=name:a&fq=type:b
将它们分开缓存它们(参见 Apache Solr documentation)并可以提高性能。但在这种情况下并没有太大的不同。更改缓存设置 在这种情况下,filterCache 似乎最有潜力。然而,增加它或改变它的设置并没有太大的不同。
关于性能的一些建议:
- 盒子上有足够的备用 RAM,以便索引文件可以在 OS 缓存中
- 尝试使用 SolrConfig 中的 solr 缓存设置
- 提交后尝试自动加热
尝试开发您的查询以限制结果集。大型结果集,特别是如果使用分组和分面会降低性能。现在 200,000 个文档索引确实很小,所以你应该没有任何问题,但我想我会在你扩展时提到这个。
- 尽可能使用过滤器查询 (FQ)。它们比在 q 中执行 field:val 快得多,而且它们被缓存了。