使用筛选器和聚合的弹性search查询不返回聚合

我正在使用node.js sdk来运行一个elasticsearch查询,该查询会search所有字段的一些文本,然后将结果过滤到一个子集,然后根据自定义索引进行聚合。

我查看了es文档以及涉及filter和聚合的几个堆栈溢出问题,以确保我的查询语法正确,并且在查询运行时没有看到语法错误。 我的查询在我的数据集中击中了2000多个文档,但响应对象不包含聚合。

var search_text = "Chase Bank"; var doctype_selections = ["mortgage"]; es.search({ index: index_list, type: 'page', body: { query: { filtered: { query: { match: { _all: { "query": search_text, "operator": "and" } }, filter: { terms: { document_type: doctype_selections } } } } }, aggs: { "top_tag_hits":{ terms: { field: "agg_index", size: agg_size }, aggs: { "hits":{ top_hits: { size: agg_size } } } } }, }, explain: true, size: result_size, }).then(function (resp) { var hits = resp.hits.hits; var aggs = resp.aggregations; console.log(resp); response.send(aggs); }, function (err) { console.trace(err.message); response.send(err.message); }); 

从我所了解的正确的操作顺序是在query->filter query->aggregation on filtered query 。 如果删除filter和聚合,查询本身按预期工作。 如果我删除filter,但保持聚合和查询它的工作,并返回聚合。 如果我删除聚合并保留filter,它也按预期工作。

似乎整个查询的聚合部分被忽略。 什么问题?

查询后返回的search结果上的聚合工作。 你可以看看post_filter它可能从查询中得到结果,然后计算聚合,然后过滤

另外每个聚合都可以有自己的filter

以下是我如何在不使用filter聚合的情况下完成我所需的工作。 我将查询结构作为一个bool查询,并添加单独的mustfilter子句:

 es.search({ index: index_list, type: 'page', body: { query: { bool: { must: [ {match: { _all: { "query": search_text, "operator": "and" }}}, ], filter: [ {terms: {document_type: doctype_selections}} ] } }, aggs: { "top_tag_hits":{ terms: { field: "agg_index", size: agg_size }, aggs: { "hits":{ top_hits: { size: agg_size } } } } }, }, explain: true, size: result_size, }).then(function (resp) { var hits = resp.hits.hits; var aggs = resp.aggregations; console.log(resp); console.log(aggs); response.send(aggs); }, function (err) { console.trace(err.message); response.send(err.message); });