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

时间:2015-06-24 13:08:36

标签: performance caching solr

用例

我有可能有数百万份文件的索引。我想对这些文件的一部分(约25,000份文件)进行大约20,000次搜索。这些25'000个文档可能占用Solr中存储的大约100 MB(包括存储和索引文本字段)。

问题

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

那么在用搜索命中它们之前,有没有办法在RAM中缓存这些25'000个文件?

更新

有些事情确实有所帮助:

  • 减少返回的行数(几乎在所有情况下我都必须遍历返回的结果,并且在几乎所有情况下,不超过100个匹配结果,但我已将行设置为a非常大的值。减少行数会使性能提高2倍左右。这看起来有点直观。如果只有79个匹配并且我将返回的行数设置为100,那么它比79个匹配的情况下的表现更好并且我设置了行在第一种情况下,Solr已经返回找到的项目数并快速完成。为什么会出现性能差异?)

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

有些事情没有真正帮助:

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

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

1 个答案:

答案 0 :(得分:2)

推荐用于表现的一些事项:

  • 盒子上有足够的备用RAM,因此索引文件可以在OS缓存中
  • 尝试使用SolrConfig中的solr缓存设置
  • 提交后使用autowarming进行游戏
  • 尝试开发查询以限制结果集。大的结果集,特别是如果使用分组和分面将会破坏性能。现在200,000文档索引真的很小,所以你不应该有任何问题,但我想我在你扩展时会提到这个。

    • 尽可能尝试使用过滤查询(FQ)。它们比字段快得多:q中的val,加上它们被缓存。