【发布时间】:2017-04-11 11:01:02
【问题描述】:
在使用 elasticsearch (5.3.0) 时,我们在涉及几个嵌套聚合的查询中遇到了内存不足问题。
我们凭经验发现问题在于聚合是在完整索引上计算的,而不是考虑query 块中指定的条件。我们后来设法运行查询,将这些条件移动到一个 filter 聚合中(参见 docs),该聚合包含了我们所有的原始 aggs。
为什么有一个单独的语法呢?如果 elasticsearch 在填充存储桶时简单地考虑所有查询条件会不会更好?
如果我选择以这种方式将所有聚合查询包装在 filter 查询中,会有哪些风险和/或限制?逻辑上有区别吗?
注意:在我们的应用程序中,我们根本不关心文档评分。所有条件的唯一目的是过滤文档,而不是对它们进行排序。我们会根据文档计数或聚合指标过滤存储桶。
编辑:有些人询问了这些问题,他们在这里是为了帮助澄清情况。请注意,这个问题是一般性的,不是针对这种特殊情况的。
{
"query": {
// we did try a filtering rather than a query with the same results
"term": {
"urlpath": "some_url_path.html"
}
},
"aggs": {
"agg_1": {
"terms": {
"size": 10,
"order": {
"sessions_number": "desc"
},
"field": "urlpath"
},
"aggs": {
"sessions_number": {
"cardinality": {
"field": "session"
}
}
}
}
}
}
之后:
{
"aggs": {
"agg_0": {
"filter": {
"term": {
"urlpath": "some_url_path.html"
}
},
"aggs": {
"agg_1": {
"terms": {
"size": 10,
"order": {
"sessions_number": "desc"
},
"field": "urlpath"
},
"aggs": {
"sessions_number": {
"cardinality": {
"field": "session"
}
}
}
}
}
}
}
}
EDIT2:我尝试使用过滤器查询,正如下面@Lusid 所建议的那样,但遇到了同样的问题。
注意2:如果我们删除order 子句,我们不会遇到问题,这对于过滤器而不是查询也是如此。这对我们来说是最令人惊讶的,因为应该只有一个桶,使得任何排序变得微不足道。这就是让我相信在分桶之前没有进行过滤的原因,因此我尝试将所有内容包装在过滤聚合中。
【问题讨论】:
-
您能发布您的初始查询和修改后的查询吗?
标签: elasticsearch elasticsearch-5