Открыть сервис

RediSearch

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

История

Разработка RediSearch была начата компанией Redis Labs (ныне Redis Ltd.) в 2016 году. Первоначально модуль создавался как проприетарное решение, но вскоре был опубликован под лицензией AGPL v3. В 2017 году RediSearch стал частью стека Redis Stack, который объединяет Redis с несколькими модулями для обработки данных различных типов (поиск, графы, временные ряды, JSON).

В 2021 году компания Redis Ltd. изменила лицензию на Redis с BSD на двойную лицензию (RSALv2 и SSPLv1), что затронуло и RediSearch. Это привело к появлению форков, таких как Redict и Valkey, которые стремятся сохранить полностью открытую модель. Несмотря на это, RediSearch остаётся одним из наиболее популярных модулей Redis, используемым в промышленной эксплуатации.

Ключевые возможности

Полнотекстовый поиск

RediSearch поддерживает индексацию текстовых полей и выполнение запросов с использованием:

  • Стемминга (морфологического поиска по корню слова) для нескольких языков, включая русский, английский, немецкий, французский и другие.
  • Поиска по фразам и точным совпадениям.
  • Поиска с учётом опечаток (fuzzy matching) на основе расстояния Левенштейна.
  • Префиксного и суффиксного поиска.
  • Булевых операторов (AND, OR, NOT).
  • Взвешивания полей — возможность задавать приоритет одних полей над другими при ранжировании результатов.

Поиск по полям (атрибутам)

Модуль позволяет индексировать не только текст, но и числовые, геопространственные, теговые и векторные данные. Запросы могут комбинировать условия по разным полям, например: «найти товары со словом "ноутбук" в названии, ценой от 50000 до 100000 рублей и рейтингом выше 4».

Агрегация данных

RediSearch включает мощный конвейер агрегации (FT.AGGREGATE), который позволяет выполнять группировку, сортировку, фильтрацию, вычисление статистических показателей (сумма, среднее, минимум, максимум) и создание срезов данных без необходимости выгружать все результаты в клиентское приложение.

Векторный поиск

Начиная с версии 2.4 (2022 год), RediSearch поддерживает поиск по векторным представлениям (embeddings). Это позволяет использовать модуль для задач семантического поиска, рекомендательных систем и поиска изображений по сходству. Поддерживаются алгоритмы FLAT и HNSW (Hierarchical Navigable Small World).

Архитектура и принципы работы

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

Индексация

При создании индекса (команда FT.CREATE) пользователь определяет схему: какие поля документа индексировать, их тип (TEXT, NUMERIC, TAG, GEO, VECTOR) и параметры (например, вес для текстовых полей). Данные могут храниться как в Redis Hash (ключ-значение), так и в формате Redis JSON (модуль RedisJSON). RediSearch автоматически синхронизируется с изменениями в этих структурах данных.

Запросы

Поисковые запросы выполняются с помощью команды FT.SEARCH. Результаты возвращаются в виде отсортированного списка документов с оценкой релевантности (score). Для агрегации используется команда FT.AGGREGATE, которая возвращает обработанные данные в формате массива.

Производительность

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

Применение

RediSearch используется в различных областях, где требуется быстрый поиск и фильтрация данных в реальном времени:

  • Электронная коммерция: поиск товаров по каталогу с фильтрацией по цене, категории, бренду, рейтингу.
  • Логи и мониторинг: поиск по логам и метрикам с возможностью агрегации (например, подсчёт количества ошибок по типу за последний час).
  • Социальные сети и мессенджеры: полнотекстовый поиск по сообщениям, пользователям, группам.
  • Геоинформационные системы: поиск объектов в заданном радиусе или прямоугольнике (например, «найти ближайшие кафе»).
  • Системы рекомендаций: комбинация полнотекстового и векторного поиска для нахождения похожих товаров или контента.

Сравнение с аналогами

ХарактеристикаRediSearchElasticsearchSolr
Тип храненияОперативная память (in-memory)Диск (с кэшированием в памяти)Диск (с кэшированием в памяти)
Задержка запроса1-10 мс10-100 мс10-100 мс
МасштабированиеВертикальное (один узел) или кластер RedisГоризонтальное (кластер из многих узлов)Горизонтальное (кластер)
Сложность настройкиНизкая (минимальная конфигурация)Высокая (требуется настройка шардинга, репликации, схемы)Средняя
Язык запросовСпециализированный синтаксис RedisQuery DSL на основе JSONСинтаксис на основе Lucene
Поддержка векторного поискаДа (с версии 2.4)Да (с плагином)Да (с плагином)

Ограничения

  • Объём данных: Поскольку индекс хранится в оперативной памяти, стоимость хранения больших объёмов данных (сотни гигабайт и более) может быть высокой по сравнению с дисковыми решениями.
  • Сложные запросы: RediSearch не поддерживает некоторые продвинутые функции поисковых систем, такие как вложенные документы, сложные пайплайны агрегации или полноценный язык запросов с поддержкой подзапросов.
  • Кластеризация: В кластерной конфигурации Redis (Redis Cluster) индексы RediSearch шардируются по ключам, что может приводить к неоптимальному распределению нагрузки при неравномерном распределении данных.

Интересные факты

  • RediSearch является одним из самых популярных модулей Redis: по данным опросов Redis Ltd., его используют более 30% пользователей Redis Enterprise.
  • Модуль поддерживает токенизацию и стемминг для более чем 15 языков, включая русский, китайский, арабский и хинди.
  • В тестах производительности, проведённых Redis Ltd., RediSearch показал скорость индексации до 1 миллиона документов в секунду на одном узле с 64 ГБ оперативной памяти.

Источники

  • Официальная документация Redis (redis.io/docs/latest/develop/interact/search-and-query/)
  • Исходный код RediSearch на GitHub (github.com/RediSearch/RediSearch)
  • Redis Stack: модульное расширение Redis (redis.io/docs/latest/develop/get-started/redis-stack/)
  • Сравнительный анализ производительности поисковых систем (статья на DZone, 2023)
  • Обзор векторного поиска в RediSearch (блог Redis Ltd., 2022)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →