我正在使用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
。如果删除过滤器和聚合,则查询本身按预期工作。如果我删除过滤器,但保持聚合和查询它的工作原理并返回聚合。如果我删除聚合并保留过滤器,它也可以按预期工作。
似乎只是忽略了查询的整个聚合部分。有什么问题?
答案 0 :(得分:1)
答案 1 :(得分:0)
聚合适用于查询后返回的搜索结果。您可以查看post_filter可能从查询中获取结果,然后计算聚合,然后过滤
此外,每个聚合都可以有own filter
答案 2 :(得分:0)
以下是我如何在不使用过滤器聚合的情况下完成所需的工作。我将查询构建为bool
查询,并添加单独的must
和filter
子句:
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);
});