是否可以在单个Elasticsearch查询表达式中执行两个聚合,然后对由该聚合产生的结果集执行布尔查询?
例如,考虑以下数据集和数据转换。我要执行弹性:
1)初始数据集(Elasticsearch索引中的内容):
{ "pivot_id": "A", "version": 1, "value": "x" }
{ "pivot_id": "A", "version": 2, "value": "y" }
{ "pivot_id": "A", "version": 3, "value": "z" }
{ "pivot_id": "B", "version": 1, "value": "w" }
{ "pivot_id": "B", "version": 2, "value": "k" }
2)通过ivot_id进行汇总:
{ "pivot_id": "A", "version": 1, "value": "x" ] // bucket: A
{ "pivot_id": "A", "version": 2, "value": "y" }
{ "pivot_id": "A", "version": 3, "value": "z" }
{ "pivot_id": "B", "version": 1, "value": "w" } // bucket: B
{ "pivot_id": "B", "version": 2, "value": "k" }
3)选择每个ivot_id /存储桶的最新版本:
{ "pivot_id": "A", "version": 1, "value": "x" }
{ "pivot_id": "B", "version": 1, "value": "w" }
4)然后执行一个简单的布尔查询,进行分页并在3)中对数据集进行排序
也就是说,我如何在单个Elasticsearch查询表达式中执行上述数据转换的序列/管道1->2->3->4
?
我尝试了以下方法,但没有成功,因为执行query bool
是为了满足aggs
的原因,而不是在{{1}产生的结果集上使用}。
也就是说,弹性正在执行:trx_id_group aggs
,而不是我想要的4->1->2->3
。
是否有一种方法可以强制将布尔查询应用于聚合结果(agss-> query)而不是(query-> aggs)之上?
我正在使用Elasticsearch 6.2.4。
我失败的尝试:
1->2->3->4
对于该查询,我期望没有结果,因为文档GET /index/_search
{
"from": 0,
"size": 10,
"query": {
"bool": {
"filter": [{
"terms": {
"value.keyword": ["y", "w"]
}
}]
}
},
"aggs": {
"trx_id_group": {
"terms": {
"field": "trx_id.keyword"
},
"aggs": {
"most_recent_per_group": {
"top_hits": {
"size": 1,
"sort": [{
"version": {
"order": "desc"
}
}]
}
}
}
}
},
"sort": [{
"version": "asc"
}]
}
和A
的最新版本没有B
和y
值。但是查询正在获取事件w
和A.v2
并将其分组。
最后一个提示:在B.v1
中,以上查询为:
SQL
我尝试使用Elasticsearch的{{3}},但不幸的是,尚不支持SELECT *
FROM (SELECT a.PIVOT_ID, a.VERSION, a.VALUE
FROM ES_INDEX AS a
INNER JOIN (SELECT PIVOT_ID, MAX(VERSION) AS VERSION
FROM ES_INDEX
GROUP BY PIVOT_ID) AS b
ON a.PIVOT_ID = b.PIVOT_ID AND a.VERSION = b.VERSION) AS TRX_ID_MOST_RECENT_VERSION
WHERE // ... your custom SEARCH clauses here ...
操作的翻译。
谢谢大家! :)