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 используется в различных областях, где требуется быстрый поиск и фильтрация данных в реальном времени:
- Электронная коммерция: поиск товаров по каталогу с фильтрацией по цене, категории, бренду, рейтингу.
- Логи и мониторинг: поиск по логам и метрикам с возможностью агрегации (например, подсчёт количества ошибок по типу за последний час).
- Социальные сети и мессенджеры: полнотекстовый поиск по сообщениям, пользователям, группам.
- Геоинформационные системы: поиск объектов в заданном радиусе или прямоугольнике (например, «найти ближайшие кафе»).
- Системы рекомендаций: комбинация полнотекстового и векторного поиска для нахождения похожих товаров или контента.
Сравнение с аналогами
| Характеристика | RediSearch | Elasticsearch | Solr |
|---|---|---|---|
| Тип хранения | Оперативная память (in-memory) | Диск (с кэшированием в памяти) | Диск (с кэшированием в памяти) |
| Задержка запроса | 1-10 мс | 10-100 мс | 10-100 мс |
| Масштабирование | Вертикальное (один узел) или кластер Redis | Горизонтальное (кластер из многих узлов) | Горизонтальное (кластер) |
| Сложность настройки | Низкая (минимальная конфигурация) | Высокая (требуется настройка шардинга, репликации, схемы) | Средняя |
| Язык запросов | Специализированный синтаксис Redis | Query 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 →