我正在开发一个使用带有几百万个文档的solr索引的项目,而且我们最近遇到了内存问题。由于包含这些字段的文档数量,faceting在我们的几个字段中变得无法使用 - solr用尽了堆memroy。
除了增加记忆力,我们还有哪些选择?我们将内存增加视为临时解决方案,因为文档数量每天增加几十万个文档。
我正在考虑进入solrcloud,但我不确定这是否是正确的解决方案。
有什么建议吗?
谢谢!
答案 0 :(得分:2)
FacetFields:根据字段中的不同值允许构面计数。 FacetFields有
two methods
,其中一个在字段中与few distinct values
表现良好,另一个在字段包含many distinct values
时(通常是数千及以上 - 你应该测试哪种效果最好)为你)。第一种方法
facet.method=enum
通过为字段中的每个唯一值发出FacetQuery来工作。如上所述,当字段中的不同值的数量很小时,这是一种很好的方法。它需要过多的内存,并且当不同值的数量变大时会崩溃。使用此方法时,请务必确保您的FilterCache
足够大,以便为您计划面对的每个不同值包含至少一个过滤器。第二种方法使用Lucene
FieldCache
(Solr的未来版本实际上将使用不同的非反转结构 - UnInvertedField)。对于具有较少数量的唯一值的字段,此方法实际上较慢且占用内存较多,但如果您有大量唯一值,则可以采用此方法。此方法使用FieldCache
查找每个文档的给定字段的值,并且每次找到具有给定值的文档时,该值的计数都会递增。
请检查每个缓存的分配内存,以及是否可以调整FieldCache
来处理这种情况。 (如您所述,type3
和type4
包含大量文档。
以上信息的来源是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的更多信息