Reindexer — NoSQL in-memory база данных общего назначения с открытым кодом. Основная цель Reindexer — это обеспечивать быстрый поиск по сложным запросам.

Reindexer
Тип документоориентированная СУБД
Написана на C++, C, Go и Vue.js
Состояние Active
Лицензия Apache License 2.0
Сайт reindexer.io

Reindexer сочетает в себе два подхода по структуре хранения данных:

  1. опциональное колоночное хранение выбранных индексных полей.
  2. оптимизированное бинарное представление 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 существует два собственных компонента:

  1. fast, на базе префиксного дерева, c поддержкой опечаток и морфологии.
  2. fuzzy, триграммный.

Оба компонента поддерживают поиск транслитом и поиск с неверной раскладкой клавиатуры. Ранжирование результатов поиска происходит с учетом статистических вероятностей (BM25) и точности совпадения. Reindexer позволяет настраивать формулу ранжирования, в зависимости от задачи.

Кроме того, существует возможность полнотекстового поиска по нескольким таблицам, с выдачей результатов, отсортированных по релевантности.

В Reindexer реализована «ленивая» индексация. Полнотекстовый индекс строится на первом запросе в полнотекстовом поле. Индексирование использует несколько потоков, что позволяет эффективно расходовать ресурсы современных многоядерных процессоров и получать высокую скорость процесса. На современном оборудовании скорость индексации составляет ~ 50 МБ / сек.

Reindexer поддерживает аналог Join для NoSQL баз данных, — это функциональность, позволяющая добавить в каждый результат ответа поле, содержащее компоненты из присоединяемой таблицы. При этом, поддерживаются методы inner и left join Кроме того, есть возможность объединить несколько Join использую логические операторы.

Кэш десериализованных объектов

править

Данные в Reindexer хранятся в области памяти под управлением C++, и при получении выборки в Go-приложении происходит десериализация результатов в Go структуру.

Object cache в Go части Reindexer решает задачу переиспользования уже десериализованных объектов, без расходования времени на повторную десериализацию.

Инструменты

править

Reindexer доступен для систем OSX, Linux и Windows.

Для отображения интерактивной документации REST API, Reindexer использует Swagger

Веб-интерфейс

править
 
Reindexer UI

Reindexer поставляется вместе с встроенным web-интерфейсом[2], написанном на Vue.js.

В 2021, дизайн UI Reindexer получил награду Red Dot в номинации Brands & Communication Design[3].

Reindexer поддерживает GRPC API начиная с версии 3.0.

Командная строка

править

Инструмент командной строки поддерживает следующие функции:

  • Создание резервной копии всей базы данных и ее выгрузку в текстовый файл или консоль;
  • Выполнение запросов к базе данных;
  • Измение документов и метаданных базы данных.

Инструмент командной строки может работать в двух режимах. С сервером через сеть и напрямую с хранилищем, в так называемом без серверном режиме.

Лицензирование

править

Reindexer выходит под лицензией Apache License 2.0

Дополнительная литература

править

Примечания

править

Ссылки

править