Как определить количество дней, которые человек провел в городе?

У меня есть следующее сопоставление в Elasticsearch:

PUT /traffic-data
{
    "mappings": {
      "traffic-entry": {
      "_all": {
        "enabled": false
      },
        "properties": {
          "CameraId": {
            "type":"keyword"
          },
          "VehiclePlateNumber": {
            "type":"keyword"
          },
          "DateTime": {
            "type":"date"
          }
        }
      }
    }
}

Я хочу рассчитать, сколько дней в месяце автомобиль простоял. Уникальный автомобиль идентифицируется VehiclePlateNumber. Итак, я хочу получить что-то вроде этого:

VehiclePlaneNumber   Month   StayDays
111                  1       5
222                  1       1
...

Как я могу сделать это с помощью запроса Elasticsearch?

Вот что я пробовал:

GET traffic-data/_search?
{
"size": 0, 
  "aggs":{
    "by_district":{
      "terms": {
        "field": "VehiclePlateNumber",
        "size": 100000
      },
      "aggs": {
        "by_month": {
          "terms": {
            "field": "DateTime",
            "size": 12
          }
        }
      }
    }
  }
}

person Dinosaurius    schedule 12.10.2017    source источник
comment
Пожалуйста, вставьте образец данных для 111, 222 VehiclePlaneNumber для анализа.   -  person Hatim Stovewala    schedule 12.10.2017


Ответы (1)


Вы можете выполнить агрегацию терминов по номерному знаку транспортного средства, затем подгруппу терминов по месяцам, а затем подгруппу сумм по дням.

Что-то типа:

GET traffic-data/_search
{
"size": 0, 
  "aggs":{
    "by_district":{
      "terms": {
        "field": "VehiclePlateNumber",
        "size": 100000
      },
      "aggs": {
        "by_month": {
          "terms": {
            "field": "DateTime",
            "size": 12
          },
          "aggs": {
            "days": {
              "sum": {
                "field": "days"
              }
            }
          }
        }
      }
    }
  }
}

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

Это должно сработать.

Или вы можете использовать сущностно-ориентированный дизайн и регулярно индексировать вычисляемое значение. См. https://www.elastic.co/elasticon/2015/sf/building-entity-centric-indexes

person dadoonet    schedule 12.10.2017
comment
Ну, действительно, у меня также есть поля Month и Monthday, которые извлекаются из DateTime. Не могли бы вы показать, как суммировать подсчеты по дням? - person Dinosaurius; 12.10.2017