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

时间:2014-03-07 16:46:50

标签: elasticsearch

我安装了16GB内存的Elasticsearch。我开始使用聚合,但在尝试发出以下查询时遇到“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"
                            }
                        }
                    }
                }
            }
        }
    }
}

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

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

2 个答案:

答案 0 :(得分:8)

您要将整个SrcIP - ,DstIP - 和DstPort字段加载到内存中,以便对它们进行汇总。这是因为Elasticsearch取消了整个字段的反转,以便能够快速查找给定其ID的字段的文档值。

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

答案 1 :(得分:2)

不确定当然的映射,但是查看DstCountry字段的值可以是非分析的。您可以通过聚合中的过滤器替换查询。也许这有帮助。

同时检查您在聚合中使用的字段是否为non_analyzed类型。