Таблица лидеров Elasticsearch с рейтингом игроков - PullRequest
1 голос
/ 03 марта 2020

Я пытаюсь найти лучшее решение для реализации списка лидеров с Elasticsearch.

Я храню следующие данные в elasti c: playerId, challengeId и Score.

Теперь я хочу добавить столбец "позиция" (на основе оценки), но не могу найти, какой самый эффективный способ сделать это в elasti c.

Случай использования: когда я получаю "все игроки по challengeId", я хочу иметь поле «позиция» в ответе, значение которого основано на значении «оценка».

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

Кто-нибудь использовал что-нибудь из этого в elasti c? Могу ли я выбрать одного из них для ранжирования игроков в таблице лидеров?

Заранее спасибо.

1 Ответ

0 голосов
/ 03 марта 2020

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

Отображение индекса

{
    "mappings": {
        "properties": {
            "pid": {
                "type": "integer"
            },
            "cid" :{
                "type" : "integer"
            },
            "score" :{
                "type" : "integer"
            }
        }
    }
}

Документы образца индекса

  1. POST / _doc / 1

    {"pid": 1, "cid": 1, "score": 10}

  2. POST / _doc / 2

    {"pid": 2, "cid": 1, "score": 9}

  3. POST / _doc / 3

    {"pid": 4, "cid": 1, "score": 6}

  4. POST / _doc / 4

    {"pid": 4, "cid": 2, "score": 10}

  5. POST / _doc / 5

    {"pid": 5, "cid": 2, "score ": 8}

Пример запроса для извлечения записи на основе cid или challengeID и сортировки результатов по score из pid или playerid.

Поисковый запрос

{
    "sort": [
        {
            "score": {
                "order": "desc" --> notice `desc` order on `score` field
            }
        }
    ],
    "query": {
        "term": {
            "cid": 2
        }
    }
}

Вывод вышеуказанного поискового запроса

"hits": {
      "total": {
         "value": 2,
         "relation": "eq"
      },
      "max_score": null,
      "hits": [
         {
            "_index": "leaderboard",
            "_type": "_doc",
            "_id": "4",
            "_score": null,
            "_source": {
               "pid": 4,
               "cid": 2,
               "score": 10
            },
            "sort": [
               10
            ]
         },
         {
            "_index": "leaderboard",
            "_type": "_doc",
            "_id": "5",
            "_score": null,
            "_source": {
               "pid": 5,
               "cid": 2,
               "score": 8
            },
            "sort": [
               8
            ]
         }
      ]
   }

Обратите внимание, поисковый запрос возвратил 2 документа с cid = 2 и идентификаторы игроков отсортированы в дес c порядок их score.

...