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

Я хотел бы объединить данные по документам с разными днями, например, с 12 до 18 часов только в ЧЕТВЕРГ.

Мой запрос, включая агрегацию, выглядит следующим образом:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "locationid.raw": "HH-44-6"
            }
        },
        {
          "match": {
            "day.keyword": "THURSDAY"
            }
        },
        {
          "range": {
            "dataHour": {
              "from": "12",
              "to": "18",
              "include_lower": true,
              "include_upper": true
            }
          }
        },
        {
          "range": {
            "dataDate": {
              "gte": "2018-11-08 12:00",
              "include_lower": true
            }
          }
        }
      ]
    }
  },
  "aggs" : {
    "contacts" : {
      "date_histogram" : {
        "field" : "dataDate",
        "interval" : "hour"
      },
      "aggs": {
        "seeing_data": {
          "avg": {
            "field": "seeing"
          }
        }
      }
   }
}

Ответ большой, так как он дает агрегированные данные в интервале для каждого дня и часа между начальной датой «2018-11-08 18:00» и сейчас, а не только тремя доступными днями (потому что с 2018-11-С 08 по настоящее время - только три четверга).

Как мне добиться того, чтобы агрегировать данные только в диапазоне часов 12-18 и только в четверг, начиная с 2018-11-08 12: 00?

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Выполните эти шаги, чтобы иметь возможность агрегировать ваши данные по часам дня :

Итак, у вас есть поле даты в вашем документе.Вы не можете от этого извлечь часы.Поэтому вам нужно создать настраиваемое поле в Kibana.

  1. Перейти в раздел «Управление»
  2. Перейти к «Шаблоны индексов»
  3. Перейти к «Создать индекс»pattern "
  4. Выберите свою коллекцию
  5. Перейдите на вкладку" Поля скрипта "
  6. Нажмите" Добавить поле скрипта "

Теперь мы будемдобавьте поле hour:

  1. В поле «имя» введите «час».
  2. Установите тип на «число».
  3. И вставьтев поле «скрипт»: doc['myDateField'].date.hourOfDay, где myDateField - это поле с датой вашего документа.

Вот оно!Теперь вы можете найти новое поле в разделах «Обнаружение» или «Визуализация».New hour field

Здесь я агрегирую количество полученных данных по часам: Aggregation by hour

Найти другие типы агрегации(например, date.dayOfWeek) здесь:

https://www.elastic.co/guide/en/elasticsearch/reference/master/modules-scripting-expression.html#_date_field_api

0 голосов
/ 23 ноября 2018

Вы можете использовать фильтр сценариев

"script": {
          "script": "doc['@timestamp'].date.dayOfWeek == 2"
        }
...