Как получить документы в Elasticsearch на основе выходных значений агрегации? - PullRequest
1 голос
/ 17 мая 2019

Я хотел бы использовать агрегированные выходные данные в качестве входных данных для фильтрации документов в одном запросе.

Например, я хотел бы получить торговые документы за последние 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 в одном запросе / запросе?

1 Ответ

0 голосов
/ 24 мая 2019

По словам Марка Уолкома, члена команды Elastic:

Ты не можешь сейчас извинить! ? Вам нужно будет запустить agg, чтобы получить среднее значение, а затем выполнить отдельный запрос, чтобы получить документы, соответствующие значениям.

https://discuss.elastic.co/t/how-to-get-documents-in-elasticsearch-based-on-aggregation-output-values/182109/2

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