Reindexer
Эту статью предлагается удалить. |
В статье есть список источников, но не хватает сносок. |
Reindexer — NoSQL in-memory база данных общего назначения с открытым кодом. Основная цель Reindexer — это обеспечивать быстрый поиск по сложным запросам.
Reindexer | |
---|---|
Тип | документоориентированная СУБД |
Написана на | C++, C, Go и Vue.js |
Состояние | Active |
Лицензия | Apache License 2.0 |
Сайт | reindexer.io |
Reindexer сочетает в себе два подхода по структуре хранения данных:
- опциональное колоночное хранение выбранных индексных полей.
- оптимизированное бинарное представление JSON с дополнением из табличной строки с индексируемыми полями;
Reindexer состоит из ядра, написанного на C++, API написанного на Go и пользовательского интерфейса, написанного на Vue.js.
История
правитьПрототип Reindexer появился в конце 2016, как альтернатива Elasticsearch для нужд платформы интерактивного телевидения Wink компании ПАО Ростелеком. К середине 2017 была выпущена первая рабочая версия Reindexer с хранилищем на основе LevelDB/RocksDB и поддержкой полнотекстового поиска. В этом же году код был опубликован на GitHub.
В 2021 году, Reindexer отдаёт более 150 млн результатов на крупнейших российских сайтах, таких как Wink, Ситилинк и ПИК
Возможности
правитьИндексы
правитьДля выполнения запросов в Reindexer есть 6 типов индексов:
- хэш-таблица, применяется для выборки по значению;
- b-tree, с возможностью выборок по условиям 'больше', 'меньше' и сортировкой по полю;
- колонка, с минимальным размером индекса в памяти, но с более медленным поиском, чем у хеш-таблицы и b-tree;
- две реализации полнотекстовых индексов: нетребовательная к памяти и на базе триграмм;
- индекс TTL, предназначенный для представления полей даты (хранящихся в виде временных меток UNIX), срок действия которых истекает через указанное количество секунд;
- геоиндекс, позволяет найти все точки на расстоянии от конкретной точки.
В Reindexer используется метод «ленивого» построения индексов при добавлении записей в таблицу. Таким образом, сначала происходит добавление записи, тогда как индексы достраиваются, только когда они требуются для выполнения запроса[1].
Дисковое хранилище
правитьReindexer — полностью in-memory база данных, что означет, что данные, должны находиться в оперативной памяти. Таким образом, основное назначение дискового хранилища — это загрузка данных на момент начала работы системы. При добавлении записей, данные пишутся на диск в фоновом режиме.
В качестве программно-аппаратной части дискового хранилища Reindexer может использовать LevelDB или RocksDB.
Полнотекстовый поиск
правитьУ Reindexer существует два собственных компонента:
- fast, на базе префиксного дерева, c поддержкой опечаток и морфологии.
- fuzzy, триграммный.
Оба компонента поддерживают поиск транслитом и поиск с неверной раскладкой клавиатуры. Ранжирование результатов поиска происходит с учетом статистических вероятностей (BM25) и точности совпадения. Reindexer позволяет настраивать формулу ранжирования, в зависимости от задачи.
Кроме того, существует возможность полнотекстового поиска по нескольким таблицам, с выдачей результатов, отсортированных по релевантности.
В Reindexer реализована «ленивая» индексация. Полнотекстовый индекс строится на первом запросе в полнотекстовом поле. Индексирование использует несколько потоков, что позволяет эффективно расходовать ресурсы современных многоядерных процессоров и получать высокую скорость процесса. На современном оборудовании скорость индексации составляет ~ 50 МБ / сек.
Join
правитьReindexer поддерживает аналог Join для NoSQL баз данных, — это функциональность, позволяющая добавить в каждый результат ответа поле, содержащее компоненты из присоединяемой таблицы. При этом, поддерживаются методы inner и left join Кроме того, есть возможность объединить несколько Join использую логические операторы.
Кэш десериализованных объектов
правитьДанные в Reindexer хранятся в области памяти под управлением C++, и при получении выборки в Go-приложении происходит десериализация результатов в Go структуру.
Object cache в Go части Reindexer решает задачу переиспользования уже десериализованных объектов, без расходования времени на повторную десериализацию.
Инструменты
правитьReindexer доступен для систем OSX, Linux и Windows.
REST API
правитьДля отображения интерактивной документации REST API, Reindexer использует Swagger
Веб-интерфейс
правитьReindexer поставляется вместе с встроенным web-интерфейсом[2], написанном на Vue.js.
В 2021, дизайн UI Reindexer получил награду Red Dot в номинации Brands & Communication Design[3].
GRPC API
правитьReindexer поддерживает GRPC API начиная с версии 3.0.
Командная строка
правитьИнструмент командной строки поддерживает следующие функции:
- Создание резервной копии всей базы данных и ее выгрузку в текстовый файл или консоль;
- Выполнение запросов к базе данных;
- Измение документов и метаданных базы данных.
Инструмент командной строки может работать в двух режимах. С сервером через сеть и напрямую с хранилищем, в так называемом без серверном режиме.
Лицензирование
правитьReindexer выходит под лицензией Apache License 2.0
Дополнительная литература
править- Поиск по сайту с Reindexer — это просто. Или как сделать «instant search» по всему Хабрахабр-у, Олег Герасимов.
- История портирования Reindexer’а — как покорить Эльбрус за 11 дней, Антон Баширов.
- Database benchmark, Gabriel Hodoroaga
- Устройство репликации в in-memory базе данных Reindexer, Олег Герасимов
- ОПЫТ ИСПОЛЬЗОВАНИЯ REINDEXER, Илья Новиков
- Reindexer - очень быстрая in-memory БД с полнотекстовым поиском, Олег Герасимов
Примечания
править- ↑ Как мы выбирали между Elastic и Tarantool, а сделали свою (самую быструю) in-memory БД. С Join и полнотекстовым поиском Архивная копия от 27 сентября 2021 на Wayback Machine, Олег Герасимов.
- ↑ Кейс: редизайн Reindexer Архивная копия от 27 сентября 2021 на Wayback Machine, Никита Денисенко.
- ↑ User Interface - Reindexer, red-dot.org