带有过滤器和聚合的弹性搜索查询不返回聚合

时间:2017-01-25 01:53:03

标签: node.js elasticsearch elasticsearch-2.0

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

我查看了es文档和几个涉及过滤器和聚合的堆栈溢出问题,以确保我的查询语法正确,并且在运行查询时我没有看到语法错误。我的查询在我的数据集中访问了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);
});

根据我的理解,es中的正确操作顺序为query->filter query->aggregation on filtered query。如果删除过滤器和聚合,则查询本身按预期工作。如果我删除过滤器,但保持聚合和查询它的工作原理并返回聚合。如果我删除聚合并保留过滤器,它也可以按预期工作。

似乎只是忽略了查询的整个聚合部分。有什么问题?

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

聚合适用于查询后返回的搜索结果。您可以查看post_filter可能从查询中获取结果,然后计算聚合,然后过滤

此外,每个聚合都可以有own filter

答案 2 :(得分:0)

以下是我如何在不使用过滤器聚合的情况下完成所需的工作。我将查询构建为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);
});