的solr / Lucene的fieldCache OutOfMemory错误动态字段排序(Solr

2019-07-03 20:47发布

我们有一个具有约250 Solr的核心TrieIntField S(声明为dynamicField )。 还有我们的Solr指数和许多文件大约14M的文档在许多这些领域的一些价值。 我们有必要进行排序在所有这些领域的250在一段时间。

我们所面临的问题是,底层的Lucene fieldCache得到非常迅速填补。 我们有一个4 GB框和索引大小为18 GB。 在40或这些动态字段的45排序后,内存消耗为90%左右,我们开始越来越内存溢出错误。

现在,我们已经运行每分钟重启动Tomcat的cron作业,如果消耗的总内存的80%以上。

从我已阅读,我的理解是限制不同价值观对排序Solr的场数将打倒fieldCache空间。 在这些可排序字段中的值可以从0到33000和相当广泛分布的任意整数。 我们必须记住几个缩放的解决方案,但什么是处理这一整个问题的最佳方式是什么?

更新:我们认为,而不是排序,如果我们提高它不会去fieldCache。 因此,而不是像发出一个查询

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

我们尝试了

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

但不幸的是也促进填充字段缓存:(

Answer 1:

我认为你有两个选择:

1)添加更多的内存。
2)强制Solr的未通过指定使用字段缓存facet.method=enum , 按照文档 。

还有一个Solr的用户邮件列表线程讨论同样的问题。

除非你的指数是巨大的,我会用选择1)走。 RAM是廉价的这些天。



Answer 2:

我们有办法通过保持一个排序字段返工架构。 动态领域,我们有像relevance_CLASSID 。 当前架构具有独特的键NODEID和多值字段CLASSID -相关度分数是这些类ID。 如果我们不是保持一个文档每CLASSID每NODEID即新的架构将有NODEID:CLASSID作为唯一键和存储在文档之间使用相同的一些冗余信息NODEID ,那么我们就可以进行排序上单场relevance ,并做CLASSID过滤查询。



文章来源: Solr/Lucene fieldCache OutOfMemory error sorting on dynamic field