6

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

我们面临的问题是底层的 lucenefieldCache很快就会被填满。我们有一个 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

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

4

2 回答 2

2

我认为你有两个选择:

1) 增加内存。
2)强制 Solr 通过指定不使用字段缓存facet.method=enum根据文档

还有一个讨论相同问题的solr-user 邮件列表线程。

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

于 2012-11-15T16:16:46.677 回答
0

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

于 2012-11-28T05:52:58.133 回答