Представление длинной метки времени в качестве даты в статистике эластичности c search date_histogram - PullRequest
1 голос
/ 05 марта 2020

У меня есть индекс с полем ts, представляющим эпоху мс:

"ts": {
    "type": "long"
}

Обратите внимание, что тип long, а не epoch_millis тип даты.

Я запускаю агрегация гистограммы даты в этом поле:

{
    ...
    "aggs": {
       "agg_name": {
            "date_histogram": {
                "field": "ts",
                "interval": "1d",
                "format": "yyyy-MM-dd",
                "min_doc_count": 1
            }
        }
    }
}

Попытка агрегирования для ежедневных документов. Операция работает нормально, однако вывод сегмента выглядит следующим образом:

{
    "key_as_string": "yyyy-MM-dd1577836800000",
    "key": 1577836800000,
    "doc_count": 3
}

Мой вопрос: как я могу отобразить key_as_string как нечто вроде 2020-01-01 без изменения типа поля или около того?

1 Ответ

1 голос
/ 06 марта 2020

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

. Вы можете установить формат и преобразовать длинный в мгновение эпохи и отформатировать его так, как вы хотите. Как уже упоминалось, это неэффективно, но будет работать.

{
  "aggs": {
    "dt_terms": {
      "terms": {
        "script": {
          "source": """
           DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.systemDefault());
           return df.format(Instant.ofEpochMilli(doc['ts'].value));
""",
          "lang": "painless"
        }
      }
    }
  }
}

Поскольку вы не хотите изменять тип данных исходных полей, это можно сделать еще одним способом, используя поля copy_to . В вашем отображении, если вы добавляете новое поле copy_to, как показано ниже, и используете тип данных date, вам не нужно запускать сценарий и использовать поля, в которые он скопирован, для агрегирования.

PUT /index_name/_mapping
{
  "properties": {
    "ts": {
      "type": "long",
      "copy_to": "ts_d"
    },
    "ts_d": {
      "type": "date"
    }
  }
}

Если у вас есть отображение выше Вы можете использовать reindex API для индексации с новым отображением, а затем использовать следующий запрос, который теперь будет работать с типом данных date.

GET /_search
{
  "aggs": {
       "agg_name": {
            "date_histogram": {
                "field": "ts_d",
                "interval": "1d",
                "format": "yyyy-MM-dd",
                "min_doc_count": 1
            }
        }
    }
}
...