Войти Регистрация
Data base

257. Поиск по всем личным сообщениям пользователя

Сложная

Elasticsearch · Elasticsearch 8.19

Discord ищет по сообщениям в Elasticsearch. Сообщения сервера шардируются по guild_id: все сообщения сервера лежат в одном шарде, и поиск внутри сервера читает один шард.

Нужен ещё поиск сразу по всем личным сообщениям пользователя. Если раскладывать ЛС по каналу, переписки одного человека окажутся во всех шардах. Отдельная беда — самые большие серверы: у них в одном шарде копятся миллиарды сообщений.

В работе: Проектирование индексов и маршрутизации для поиска по сообщениям мессенджера.

Как проверяем Движка Elasticsearch в браузере пока нет, поэтому здесь не запрос, а выбор решения. Выберите один вариант. После ответа — почему каждый вариант верный или нет. Ответ один на подход: после него показываем разбор.
routingшардированиелимит документов Luceneмодель индексов

Источник: Discord Engineering: как Discord индексирует триллионы сообщений, 2025. Условие пересказано своими словами.

Как разложить документы, чтобы и поиск по серверу, и поиск по всем ЛС пользователя читали один шард?

  • Сообщения серверов — в индексах с routing=guild_id; ЛС — в отдельных индексах с routing=user_id, каждое ЛС индексируется по разу на каждого участника
  • Один индекс, routing по умолчанию (по _id сообщения)
  • ЛС оставить в общем индексе с routing=channel_id, а поиск по всем ЛС делать без routing
  • Большой сервер оставить в одном шарде и просто дать ему отдельный мощный узел