具有嵌套聚合的Elasticsearch查询导致内存不足

Sgt*_*t B 7 elasticsearch

我安装了Elasticsearch 16GB的内存.我开始使用聚合,但在尝试发出以下查询时遇到"java.lang.OutOfMemoryError:Java堆空间"错误:

POST /test-index-syslog3/type-syslog/_search
{
    "query": {
        "query_string": {
           "default_field": "DstCountry",
           "query": "CN"
        }
    },
    "aggs": {
        "whatever": {
            "terms": {
                "field" : "SrcIP"
            },
            "aggs": {
                "destination_ip": {
                    "terms": {
                        "field" : "DstIP"
                    },
                    "aggs": {
                        "port" : {
                            "terms": {
                                "field" : "DstPort"
                            }
                        }
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

query_string本身只返回1266次点击,所以我对OOM错误感到有点困惑.

我错误地使用聚合吗?如果没有,我该怎么做才能解决这个问题?谢谢!

Ale*_*vik 8

您正在将整个SrcIP- ,DstIP- 和 - DstPort字段加载到内存中以便在它们上进行聚合.这是因为Elasticsearch将整个字段取消反转,以便能够快速查找给定其ID的字段的文档值.

如果您要在很大程度上聚合一小组数据,那么您应该考虑使用docvalues.然后,文档的值以一种方式存储,以便在给定文档ID的情况下轻松查找.它有更多的开销,但是这样你就可以把它留给操作系统的字段缓存来将相关页面放在内存中,而不必加载整个字段.