Эластичный поиск - одна запись в час - PullRequest
0 голосов
/ 12 сентября 2018

Я хочу получать только одну запись в час в диапазоне дат.Например, если я хочу получить данные между днями (28-08-2018 - 15-09-2018), есть почти 10000 записей, но я хочу отфильтровать результат, чтобы показать только одну запись в час, поэтому яиспользуя агрегацию с date_histogram , и я вижу только одну запись в час

Запрос:

{ 
    "size" : 0,
      "query": {
        "bool": {
          "must": [
                    {
              "range": {
                "createdtime": {
                  "gte": "1535201500000",
                  "lte": "1536756706000",
                  "boost": 2.0
                }
              }
            },

            {
              "match": {
                "gen": 1
              }
            },
            {
              "match": {
                "Mid": 350404
              }
            }
          ]
        }
      },

    "aggregations" : {
        "runtime" : {
            "date_histogram" : {
                "field" : "createdtime",
                "interval" : "1H",
                "min_doc_count": 1
            },"aggs": {
                "tops": {
                  "top_hits": {
                    "size": 1
                  }
                }
            }
        }
    }      
}

Здесь проблема в том, что я хочуиспользуйте нумерацию страниц, чтобы показать эти результаты, так как я знаю, что нет никакого способа использовать размер, и на данный момент в запросе агрегации я хочу знать, есть ли другой способ получить только одну запись в час

1 Ответ

0 голосов
/ 14 сентября 2018

Если вы группируете документы по часам, то для каждого интервала вы уже знаете, сколько будет результатов.

В указанном интервале (28-08-2018 - 15-09-2018) между ними 432 часа, поэтому вы знаете, что будет 432 результата. Теперь предположим, что вы хотите показывать 8 результатов на странице, то есть будет 54 страницы, где каждая страница будет содержать результаты из 8-часового окна:

1-я страница - 28-08-2018 00: 00: 00 (1535410800000) - 28-08-2018 08: 00: 00 (1535410800000 + 8 * 3600000) поэтому ваш запрос агрегирования для первой страницы должен выглядеть следующим образом:

...
  "range": {
    "createdtime": {
      "gte": "1535410800000",
      "lt": "1535439600000",
      "boost": 2.0
    }
  }
...

2-я страница: 28-08-2018 08: 00: 00 (1535410800000 + 8 * 3600000) - 28-08-2018 16: 00: 00 (1535410800000 + 16 * 3600000)

...
  "range": {
    "createdtime": {
      "gte": "1535439600000",
      "lt": "1535468400000",
      "boost": 2.0
    }
  }
...

и т. Д., Вы просто сузите свою агрегацию на основе createtime , и это будет возвращать результаты для конкретной страницы.

...