Получение `n` записей для каждого совпадения вasticsearch

Aditya Singh спросил: 11 марта 2019 в 07:43 в: elasticsearch

У меня есть эластичный запрос следующим образом:

GET /logs-of-year-2019.03.*/_search
{
  "sort": [
    {
       "@timestamp": "desc"
    }
  ],
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "Request.advertiserId": [1695, 1252]
          }
        }
      ],
      "filter": [
        {
          "range": {
            "@timestamp": {
              "gte": "now-5h/d",
              "lte": "now/d"
            }
          }
        }
      ]
    }
  }
}  

Этот запрос получает все документы с Request.advertiserId в виде 1695 или 1252. С фильтром для @timestamp.

В результате есть корзина hits, в которой есть результаты 10 с комбинацией нескольких результаты с 1695 и несколько с 1252. Чего я хочу добиться, так это того, что мне нужны 20 (любые указанные n) документы для каждого указанного Request.advertiserId. Другими словами, 20 documents для 1695 и 20 для 1252. Достижима ли эта вещь только одним эластичным запросом?

На данный момент я могу подумать, что нужно запускать разные запросы для каждого Request.advertiserId и указывать size=20 (это может быть переменная n). Но тогда мне придется запускать m запросы для m числа Request.advertiserId. Может ли это быть достигнуто за один запрос?

PS: GET /logs-of-year-2019.03.*/_search
В приведенной выше строке указывается, что журналы со всех дат указанного месяца необходимо сканировать. Индексы хранятся как logs-of-year-2019.03.01-05 (журналы за 5th час 1-го марта 2019 г.), logs-of-year-2019.03.01-06 (журналы за 6th час 1-го марта 2019) и тд. Журналы создаются за час в день. Можно ли оптимизировать приведенную выше строку таким образом, чтобы она проверяла индексы только в течение 5 часов после now (может включать предыдущий день, так как поиск может быть запущен в 01:00 ночью. Поэтому он должен включать 21–00 часов с предыдущего дата и от 00 до 01 часа для сегодняшней даты), а не для всего месяца?

0 ответов