Запрос результатов агрегации - PullRequest
0 голосов
/ 28 июня 2018

Есть ли способ в одном выражении запроса 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 операций пока не поддерживается.

Спасибо всем! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...