Elastic Search Aggregation Запрос многоуровневой оптимизации - PullRequest
0 голосов
/ 18 декабря 2018

Требуется лучший способ или оптимизированный запрос для получения статусов каждого уровня.

мы пытаемся получить данные агрегации состояния устройств IoT из огромного объема, хранящегося в ES.Данные в хранилище будут выглядеть следующим образом:

{
"deviceType":"temperature",
"deviceName":"sensor1",
"serviceName":"HomeService",
"serviceCatagory":"Home Automation",
"warning":true,
"communicationType":"http",
"createdDate":"",
"location":"",
"poc":"",
"aPoc":""
}

, и поля будут добавлены в соответствии с типом устройства.для каждого статуса документ будет вставлен в БД.

Используя эти данные, мы применяем к нему запрос агрегации, чтобы найти счетчик каждого статуса для каждого типа устройства, имени устройства или serviceName или serviceCategory или местоположения и т. д.

Пример запроса агрегации, к которому мы обращаемся к БД:

{
  "size": 0,
  "aggs": {
    "hour_value": {
      "date_histogram": {
        "field": "date",
        "interval": "hour"
      },
      "aggs": {
        "devicetype": {
          "terms": {
            "field": "deviceType",
            "size": 1000
          },
          "aggs": {
            "terms": {
              "field": "deviceName",
              "size": 1000
            },
            "aggs": {
              "terms": {
                "field": "serviceName",
                "size": 1000
              },
              "aggs": {
                "terms": {
                  "field": "serviceCatogery",
                  "size": 1000
                },
                "aggs": {
                  "terms": {
                    "field": "location",
                    "size": 1000
                  },
                  "aggs": {
                    "warning_count": {
                      "value_count": {
                        "field": "warning"
                      }
                    },
                    "trip_count": {
                      "value_count": {
                        "field": "trip"
                      }
                    },
                    "running_count": {
                      "value_count": {
                        "field": "running"
                      }
                    },
                    "stopped_count": {
                      "value_count": {
                        "field": "stopped"
                      }
                    },
                    "offline_count": {
                      "value_count": {
                        "field": "offline"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

Размер, указанный в запросе, будет еще больше в течение нескольких дней.

Но приведенный выше запросслишком много времени (почти 15 минут и некоторое время зависало), чтобы получить данные из БД.Объем, который мы собираем, составляет почти 12 ГБ в час, и мы пытаемся выполнить этот запрос каждый час.

Любая помощь с идеей или запросом будет слишком полезной.

...