Некорректное отображение данных в kibana

Есть массив, каждый элемент которого выглядит следующим образом:

  •  t    _id  	                  htqe7m0BSOdvtuXlL_IK
    
  •   t   _index	              currency_data
    
  •   #   _score	                - 
    
  •   t   _type	                   data
    
  •   #   player_id	                457
    
  •   #   soft_currency_amount	    95,792
    
  •   soft_currency_last_update 	Oct 21, 2019 @ 16:57:01.000
    

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

{
  "aggs": {
    "4": {
      "terms": {
        "field": "player_id",
        "order": {
          "_key": "asc"
        },
        "size": 400
      },
      "aggs": {
        "2": {
          "terms": {
            "field": "soft_currency_amount",
            "order": {
              "2-orderAgg": "desc"
            },
            "size": 1
          },
          "aggs": {
            "3": {
              "terms": {
                "field": "soft_currency_last_update",
                "order": {
                  "1": "desc"
                },
                "size": 1
              },
              "aggs": {
                "1": {
                  "cardinality": {
                    "field": "player_id"
                  }
                }
              }
            },
            "2-orderAgg": {
              "max": {
                "field": "soft_currency_last_update"
              }
            }
          }
        }
      }
    }
  },
  "size": 0,
  "_source": {
    "excludes": []
  },
  "stored_fields": [
    "*"
  ],
  "script_fields": {},
  "docvalue_fields": [
    {
      "field": "soft_currency_last_update",
      "format": "date_time"
    }
  ],
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "soft_currency_last_update": {
              "format": "strict_date_optional_time",
              "gte": "2019-10-11T21:00:00.000Z",
              "lte": "2019-10-12T20:30:00.000Z"
            }
          }
        }
      ],
      "filter": [
        {
          "match_all": {}
        }
      ],
      "should": [],
      "must_not": []
    }
  }

В результате получается таблица со следующими колонками: player_id, soft_currency_amount, soft_currency_last_update и Unique count of player_id. Последняя метрика по сути бесполезна, используется для того, чтобы посчитать "хоть что-нибудь" для отображения остальных данных.
Информация в итоговой таблице получается верной за одним исключением: колонка "soft_currency_last_update" показывает не фактическую дату последнего обновления, а дату, когда появился соответствующий баланс.
Например, у игрока было 1200 монет на момент времени 21 октября в 13:00. Затем, в 17:00 баланс изменился, насчитывая 1300 монет. Следующее (и последнее) обновление баланса произошло на другой день, 22 октября в 8:00. На этот момент баланс остался неизменным, 1300 монет.
В данной ситуации строка таблицы будет содержать корректный id игрока, последнее значение его баланса (1300 монет), но графа даты будет указывать на 21 октября 17:00, а не на 22 октября 8:00.

Что не так?

И можно ли это всё визуализировать не в виде таблицы, а с виде столбчатой диаграммы (по y - баланс игрока, по x - id игрока)

То есть каждый элемент массива - это запись? Если да - то вам под агрегаций по игрокам, надо выбрать поля из последней записи. Это делается с помощью агрегации top_hits отсортированной по @timestamp с размером в 1. То есть дата последнего обновления будет выглядеть как-то так:

В кибане можно добавить несколько таких агрегаций по всем интересующим вас полям. Если вы работаете на прямую с elasticsearch, то все top_hits агрегации можно объединить в одну.

Сработало, спасибо!

Не очень понятно.

Ещё вопрос тогда: если с Top Hits для табличного вида всё понятно, то как эти же данные можно визуализировать в виде столбчатой диаграммы? По Y - значения баланса, по X - id игроков. Выбираются данные лишь на момент последнего обновления

UPD. Вопрос решён, через те же Top Hits. Ещё раз спасибо.

UPD-2. В массиве есть пара игроков с балансом, превосходящим в сотни раз балансы других игроков. За счёт этого неудобно визуализировать данные в виде диаграммы. Можно ли как-то исключить этих игроков из учёта?

Для этого нужен bucket_selector, но кибаной эта агрегация пока не поддерживается.

... или в Metric&Axes можно выбрать масштабирование Y-оси в логарифмическом виде, это нормализует представление выборки

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.