Я хотел бы использовать агрегированные выходные данные в качестве входных данных для фильтрации документов в одном запросе.
Например, я хотел бы получить торговые документы за последние 24 часа, когда сумма продажи превышает среднюю сумму продаж за последние 3 месяца до текущего месяца (например, февраль-апрель, если мы находимся в мае ). Средняя сумма продаж будет агрегацией.
Пробовал использовать поля скрипта, потому что он фильтрует документы, но не уверен, как получить доступ к результатам агрегации из скрипта. https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-script-fields.html
Еще одна мысль - использовать 3-месячный диапазон дат запроса вверху, а затем создать 24-часовую гистограмму даты с агрегацией самых популярных совпадений, вложенной внизу. Тем не менее, мне понадобится какой-то скрипт-фильтр для фильтрации документов на основе агрегации продаж в среднем.
Образцы торговых документов, которые вы можете импортировать через POST с содержанием ниже, в Bulk API :
{"index":{}}
{"id": 1, "date": "2019-02-01", "amount": 1000}
{"index":{}}
{"id": 2, "date": "2019-03-01", "amount": 2000}
{"index":{}}
{"id": 3, "date": "2019-04-01", "amount": 3000}
{"index":{}}
{"id": 4, "date": "2019-05-17", "amount": 1500}
{"index":{}}
{"id": 5, "date": "2019-05-17", "amount": 4000}
{"index":{}}
{"id": 6, "date": "2019-05-17", "amount": 8000}
Исходя из вышеуказанных документов, среднее значение за последние 3 месяца до этого месяца (мая) составляет (1000 + 2000 + 3000) / 3 = 2000. Документы за последние 24 часа, которые имеют суммы> 2000, это всего лишь идентификатор 5, идентификатор 6.
В SQL запрос будет выглядеть как
SELECT *
FROM sales
WHERE `date` >= '2019-05-17'
AND amount > (SELECT AVG(amount)
FROM sales
WHERE `date` BETWEEN '2019-02-01' AND '2019-04-30');
и возврат
id date amount
5 2019-05-17 4000
6 2019-05-17 8000
Как мне добиться того же с Elasticsearch в одном запросе / запросе?