Performance 在查询文档子集时提高Solr性能

Performance 在查询文档子集时提高Solr性能,performance,caching,solr,Performance,Caching,Solr,用例 我有一个可能有数百万文档的索引。我想对这些文档的一个子集进行大约20000次搜索(大约25000个文档)。这25000个文档可能占用存储在Solr中的大约100MB(由存储索引和文本字段组成) 问题 随着索引文档数量的增加,查询的性能会大大降低。例如,运行20000次搜索,在100000个文档索引上搜索25000个文档大约需要4分钟。在20万个文档索引上运行相同的搜索大约需要20分钟 那么,在搜索之前,有没有办法将这25000个文档缓存在RAM中 更新 一些真正有帮助的事情: 减少返回行

用例

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

问题

随着索引文档数量的增加,查询的性能会大大降低。例如,运行20000次搜索,在100000个文档索引上搜索25000个文档大约需要4分钟。在20万个文档索引上运行相同的搜索大约需要20分钟

那么,在搜索之前,有没有办法将这25000个文档缓存在RAM中

更新

一些真正有帮助的事情:

  • 减少返回行计数(在几乎所有情况下,我都必须遍历返回的结果,并且在几乎所有不超过100个匹配结果的情况下,我都将行设置为一个非常大的值。减少行数可以提高大约2倍的性能。这似乎违反直觉。如果只有79个匹配,并且我将返回的行数设置为100,则性能会更好在第一种情况下,Solr已经返回find item count并快速执行。为什么会有性能差异?)

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

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

  • 拆分字段查询(我已经在任何可能的地方使用字段查询,但我正在为每个查询将它们组合在一个fq中
    fq=name:a和type:b
    。将它们拆分为
    fq=name:a&fq=type:b
    会分别缓存它们(请参阅)并且可以提高性能。但在这种情况下,这并没有产生很大的影响

  • 更改缓存设置在这种情况下,filterCache似乎最有潜力。但是,增加或更改其设置并没有带来很大的区别


性能推荐的几点:

  • 盒子上有足够的备用RAM,以便索引文件可以在操作系统缓存中
  • 尝试在SolrConfig中使用solr缓存设置
  • 在提交后使用自动预热
  • 尝试开发查询以限制结果集。较大的结果集,特别是使用分组和面处理时,会降低性能。现在200000文档索引非常小,所以您应该不会有任何问题,但我想我会在扩展时提到这一点

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

感谢您的回复,我们将尝试不同的缓存选项,如果有任何改进,请在此处留言。问题是RAM非常有限,因此如果我能以某种方式提示solr应该缓存哪些文档,那将是一件好事。当然,请先尝试使用FQ限制查询,我感觉您将获得最大的回报e、 听起来不错,如果你在查询中使用facet,你也可以玩转facet方法和facet线程。最终将Solr服务器移动到了一个更快的盒子,速度又提高了3-4倍。速度看起来不错,所以我最终接受了这个答案中的建议。