Есть ли способ в одном выражении запроса Elasticsearch выполнить агрегацию и затем выполнить запрос bool для набора результатов, созданного этой агрегацией?
Например, рассмотрим следующий набор данных и преобразования данных. Хочу упругую выполнить:
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) Агрегировать по pivot_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) Выберите самую последнюю версию каждого pivot_id / bucket:
{ "pivot_id": "A", "version": 1, "value": "x" }
{ "pivot_id": "B", "version": 1, "value": "w" }
4) И затем выполнить простой запрос bool с разбиением на страницы и сортировкой по набору данных в 3)
То есть, как я могу в одном выражении запроса Elasticsearch выполнить вышеуказанную последовательность / конвейер преобразований данных 1->2->3->4
?
Я попробовал описанный ниже подход, но у меня ничего не вышло, потому что query bool
выполняется для подачи в aggs
caluse, а не для использования над набором результатов, созданным trx_id_group aggs
.
То есть, эластик выполняется: 4->1->2->3
, а не 1->2->3->4
, как я хочу.
Есть ли способ принудительно применить запросы bool поверх агрегированных результатов (aggs-> query), а не (query-> aggs)?
Я использую Elasticsearch 6.2.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
вышеупомянутый запрос будет:
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 ...
Я пытался использовать Elasticsearch SQL Translate API , но, к сожалению, перевод INNER JOIN
операций пока не поддерживается.
Спасибо всем! :)