Solr / Lucene fieldCache OutOfMemory在动态字段上排序错误

时间:2012-11-15 07:40:26

标签: solr lucene out-of-memory

我们有一个Solr核心,大约有250 TrieIntField s(声明为dynamicField)。我们的Solr索引中有大约14M文档,许多文档在许多这些领域都有一些价值。我们需要在一段时间内对所有这250个字段进行排序。

我们面临的问题是潜在的lucene fieldCache很快就会被填满。我们有一个4 GB的盒子,索引大小为18 GB。对40或45个这些动态字段进行排序后,内存消耗约为90%,我们开始出现OutOfMemory错误。

目前,如果消耗的总内存超过80%,我们每分钟都会运行一个cron作业重启tomcat。

根据我的阅读,我了解限制可排序Solr字段上不同值的数量会降低fieldCache空间。这些可排序字段中的值可以是0到33000之间的任何整数,并且分布相当广泛。我们考虑了一些扩展解决方案,但处理整个问题的最佳方法是什么?

更新:我们认为不是排序,如果我们做了提升,它将不会转到fieldCache。因此,而不是发出像

这样的查询

select?q=name:alba&sort=relevance_11 desc

我们试过了

select?q={!boost relevance_11}name:alba

但不幸的是,增强也填充了字段缓存:(

2 个答案:

答案 0 :(得分:2)

我认为你有两个选择:

1)添加更多内存 2)通过指定facet.method=enumas per documentation

强制Solr不使用字段缓存

还有solr-user mailing list thread讨论了同样的问题。

除非您的索引很大,否则我会选择选项1)。 RAM现在很便宜。

答案 1 :(得分:0)

我们有办法通过保留单个排序字段来重新设​​计架构。我们拥有的动态字段就像relevance_CLASSID。当前架构具有唯一键NODEID和多值字段CLASSID - 相关性分数适用于这些类ID。如果我们为每个nodeId每个classId保留一个文档,即新模式将NODEID:CLASSID作为唯一键,并在具有相同NODEID的文档中存储一些冗余信息,那么我们可以对单个字段进行排序{{ 1}}并对CLASSID进行过滤查询。