当索引包含数百万个文档时,在Solr中进行分面

时间:2015-08-27 12:10:49

标签: ruby-on-rails solr

我正在开发一个使用带有几百万个文档的solr索引的项目,而且我们最近遇到了内存问题。由于包含这些字段的文档数量,faceting在我们的几个字段中变得无法使用 - solr用尽了堆memroy。

除了增加记忆力,我们还有哪些选择?我们将内存增加视为临时解决方案,因为文档数量每天增加几十万个文档。

我正在考虑进入solrcloud,但我不确定这是否是正确的解决方案。

有什么建议吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

  

FacetFields:根据字段中的不同值允许构面计数。 FacetFields有two methods,其中一个在字段中与few distinct values表现良好,另一个在字段包含many distinct values时(通常是数千及以上 - 你应该测试哪种效果最好)为你)。

     

第一种方法facet.method=enum通过为字段中的每个唯一值发出FacetQuery来工作。如上所述,当字段中的不同值的数量很小时,这是一种很好的方法。它需要过多的内存,并且当不同值的数量变大时会崩溃。使用此方法时,请务必确保您的FilterCache足够大,以便为您计划面对的每个不同值包含至少一个过滤器。

     

第二种方法使用Lucene FieldCache(Solr的未来版本实际上将使用不同的非反转结构 - UnInvertedField)。对于具有较少数量的唯一值的字段,此方法实际上较慢且占用内存较多,但如果您有大量唯一值,则可以采用此方法。此方法使用FieldCache查找每个文档的给定字段的值,并且每次找到具有给定值的文档时,该值的计数都会递增。

请检查每个缓存的分配内存,以及是否可以调整FieldCache来处理这种情况。 (如您所述,type3type4包含大量文档。

以上信息的来源是Scaling Lucene and Solr。我发现了另外一篇关于solr faceting You are faceting it wrong的文章。

答案 1 :(得分:0)

在sol之前你可以想到solr multiple core。

在单个实例上,Solr有一个称为SolrCore的东西,它本质上是一个索引。如果需要多个索引,可以创建多个SolrCores。

使用SolrCloud,单个索引可以跨越多个Solr实例。

这意味着单个索引可以由不同机器上的多个SolrCore组成。

这些SolrCores构成一个集合的逻辑索引。

集合本质上是一个跨越许多SolrCore的索引,既可用于索引扩展,也可用于冗余。

如果您想将2个SolrCore Solr设置移动到SolrCloud,您将拥有2个集合,每个集合由多个单独的SolrCore组成。

SolrCloud在Solr中添加了分布式功能。 通过此启用,您可以拥有高可用,容错的Solr服务器群集。

当您需要高规模,容错,分布式索引和搜索功能时,请使用SolrCloud。

您可以在此处获取有关SolrCloud的更多信息

https://cwiki.apache.org/confluence/display/solr/SolrCloud