一尘不染

重要条款导致CircuitBreakingException

elasticsearch

我有一个中型的Elasticsearch索引(1.46T或〜1e8文档)。它在4台服务器上运行,每台服务器在弹性和OS(用于缓存)之间平均分配64GB
Ram。

我想尝试新的“重要条款”聚合,因此我触发了以下查询…

{
  "query": {
    "ids": {
      "type": "document",
      "values": [
        "xCN4T1ABZRSj6lsB3p2IMTffv9-4ztzn1R11P_NwTTc"
      ]
    }
  },
  "aggregations": {
    "Keywords": {
      "significant_terms": {
        "field": "Body"
      }
    }
  },
  "size": 0
}

哪个应将指定的文档的主体与索引的其余部分进行比较,并找到对文档有意义的,索引中不常见的术语。

不幸的是,这总是导致

ElasticsearchException
[org.elasticsearch.common.breaker.CircuitBreakingException:数据太大,数据将超过[25741911654]个字节的限制];

嵌套:UncheckedExecutionException
[org.elasticsearch.common.breaker.CircuitBreakingException:数据太大,数据将大于[25741911654]个字节的限制];

嵌套:CircuitBreakingException [数据太大,数据将大于[25741911654]字节的限制];

一两分钟后,似乎暗示我没有足够的内存。

有问题的弹性服务器实际上是VM,因此我关闭了其他VM,并为每个弹性实例分配了96GB,为每个OS分配了96GB。

发生相同的问题(数字不同,花费的时间更长)。我没有可用的可用内存超过192GB的硬件,因此不能再提高了。

汇总不适合用于整个索引吗?我在查询格式方面犯了错误吗?


阅读 615

收藏
2020-06-22

共1个答案

一尘不染

关于这种聚合的文档上有一个警告,内容涉及超大索引[1]的自由文本字段上的RAM使用。在大索引上,它对于词汇量较小的低基数字段(例如,标签)有效,但许多自由文本术语和许多文档的组合却很浪费内存。您可以查看在为Field
字段加载FieldData缓存[2]时指定一个过滤器,以修整低频项的长尾(例如doc频率<2),这将减少RAM开销。

在分析仅匹配的顶级文档样本中的重要术语之前,我使用了该算法的变体,并且此方法所需的RAM更少,因为仅从磁盘读取了前N个文档并标记了令牌(使用TermVectors或Analyzer)。但是,目前,Elasticsearch中的实现依赖于FieldData缓存并查找所有匹配文档的术语。

还有一件事-
当您说要“比较指定文档的正文”时,请注意,通常的操作方式是将一组文档与背景进行比较,而不仅仅是一个。所有分析均基于文档频率计数,因此,对于仅包含一个文档的样本集,所有术语的前景频率均为1,这意味着您缺乏加强任何分析的证据。

2020-06-22