# Как Bookbot использует Manticore Search для 3.5 млн сохранённых запросов и канала с 10% выручки

Как Bookbot использует Manticore Search для поиска по 1.29 млн подержанных книг, сопоставляет новые поступления с 3.5 млн сохранённых запросов и развивает канал, на который приходится около 10% выручки.

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

[Bookbot](https://bookbot.com/), известный в Чехии как Knihobot, принимает подержанные книги, фотографирует их, каталогизирует, продаёт и отправляет новым читателям. Два экземпляра одной книги могут принадлежать к разным изданиям, отличаться ценой и состоянием. У каждого - свои фотографии. Когда один экземпляр продаётся, выдачу нужно сразу обновить, даже если другие экземпляры этой книги ещё есть в наличии.

Bookbot использует Manticore Search для поиска по этому постоянно меняющемуся ассортименту. Основной индекс книг содержит около **5.3 млн документов**, включая записи примерно о **1.29 млн физических экземпляров, которые сейчас есть в наличии**. В Manticore также хранятся около **3.5 млн сохранённых поисковых запросов** для функции [Watchdog](https://bookbot.com/watchdog) в Bookbot.

По внутренним данным Bookbot, на Watchdog приходится примерно **10% выручки**.

Сооснователь и технический директор Bookbot [David Gazdoš](https://www.linkedin.com/in/david-gazdo%C5%A1-736496235/) рассказал, как компания использует Manticore. Помимо поиска для покупателей, система помогает поддерживать актуальность выдачи, выбирать подходящий экземпляр для показа, подбирать новые поступления по сохранённым запросам читателей, искать данные в библиографической базе на 203 млн записей и решать внутренние задачи компании.

## Когда экземпляры одной книги отличаются

В обычном интернет-магазине для товара часто достаточно одной записи в базе и счётчика остатков.

У Bookbot ассортимент устроен иначе. У одной книги может быть несколько изданий, а у каждого издания - множество отдельных экземпляров. Они могут различаться ценой и состоянием. У каждого есть своя фотография, а наличие отслеживается отдельно.

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

Допустим, в выдаче показан экземпляр за €6. Его покупают, но в наличии остаётся другой экземпляр той же книги - за €9.

Книга может остаться в выдаче, но теперь нужно показать другую цену, другую фотографию и, возможно, другое издание. А если покупатель выбрал фильтр «дешевле €8», этой книги в выдаче быть уже не должно.

Здесь помогают [realtime таблицы](https://manual.manticoresearch.com/Creating_a_table/Local_tables/Real-time_table) Manticore.

MySQL остаётся основным источником бизнес-данных Bookbot. Kafka передаёт события, связанные с заказами, резервированием книг, изменениями цен, потерями и списаниями, временным снятием книг с продажи и исправлениями в каталоге. Приложение обновляет данные в Manticore: [заменяет](https://manual.manticoresearch.com/Data_creation_and_modification/Updating_documents/REPLACE), удаляет или корректирует записи по мере поступления событий.

Поиск больше не привязан к пакетной пересборке каталога: данные обновляются потоково.

> «Manticore позволяет нам обновлять поисковую выдачу по мере изменения наличия книг. Когда один экземпляр продаётся, мы можем заменить или удалить его запись без пересборки всего индекса».

Для покупателя это означает, что цена, издание, состояние, фотография и отметка о наличии в поисковой выдаче относятся к экземпляру, который действительно можно купить.

## Одна книга на странице выдачи, много экземпляров в индексе

Но поддерживать актуальность ассортимента - лишь половина задачи.

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

[Группировка](https://manual.manticoresearch.com/Searching/Grouping) в Manticore позволяет Bookbot совместить эти требования.

Сначала приложение отбирает экземпляры, которые соответствуют запросу покупателя. Затем группирует оставшиеся записи по названию книги и с помощью `WITHIN GROUP ORDER BY` выбирает экземпляр для показа в выдаче.

Здесь важен порядок действий.

Допустим, есть экземпляры одной книги от разных издательств за €6, €9 и €14. Покупателю нужна книга издательства B дешевле €10, без отметок о повреждениях. В выдачу должен попасть экземпляр, который соответствует **всем трём условиям одновременно**.

Bookbot не может взять издательство одного экземпляра, цену другого, а состояние или фотографию третьего. Получится предложение, которого на самом деле не существует.

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

> «Manticore позволяет нам учитывать характеристики каждого экземпляра и при этом показывать только один результат для каждой книги. Фильтры сначала применяются к отдельным экземплярам, поэтому в выдаче всегда оказывается экземпляр, который мы действительно можем продать».

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

Фасеты работают по тому же принципу: учитываются уникальные названия книг, а не отдельные экземпляры. Поэтому даже книга с сотнями экземпляров на складе учитывается в счётчике категории только один раз.

Для просмотра каталога, когда достаточно данных о книге в целом, Bookbot поддерживает отдельный, заранее сформированный индекс меньшего размера - примерно **3.59 млн записей о названиях книг**. Если же запрос требует учитывать данные конкретного экземпляра - например, при полнотекстовом поиске или использовании фильтров, которым должен одновременно соответствовать один и тот же экземпляр, - приложение обращается к полному индексу книг.

Так Bookbot сочетает скорость и точность: использует более быстрый индекс там, где достаточно общих данных о книге, и учитывает каждый экземпляр там, где это необходимо.

## Как сохранить спрос на книги, которых пока нет в наличии

Самый интересный сценарий использования Manticore в Bookbot начинается тогда, когда нужной книги нет в наличии.

Ассортимент подержанных книг трудно предсказать. Читатель может точно знать, какую книгу или издание хочет купить, но у Bookbot в этот момент может не быть подходящего экземпляра.

Чтобы читателю не приходилось возвращаться и повторять поиск каждые несколько дней, Bookbot предлагает настроить уведомления в Watchdog. Эта функция позволяет отслеживать книги по названию, автору, жанру, изданию, цене или сочетанию нескольких условий и получать уведомления, когда появляется подходящий экземпляр.

Поиск в этом случае работает в обратную сторону.

В обычном поиске:

**один запрос → подходящие книги**

С Watchdog:

**одна поступившая в продажу книга → подходящие сохранённые запросы**

[Percolate-таблицы](https://manual.manticoresearch.com/Creating_a_table/Local_tables/Percolate_table) в Manticore предназначены именно для такого «поиска наоборот». Вместо того чтобы хранить документы и выполнять по ним запросы, Bookbot хранит запросы и передаёт в Manticore данные о книге, чтобы найти запросы, которым она соответствует.

На момент замеров в Manticore у Bookbot хранилось около **3.5 млн правил Watchdog**.

Если после обработки события, связанного с ценой, книга становится доступна для покупки, приложение передаёт в Manticore её поисковые данные для сопоставления с сохранёнными запросами через percolate. Manticore возвращает подходящие сохранённые запросы. Затем Bookbot применяет собственную бизнес-логику: проверяет, активно ли ещё правило Watchdog, можно ли отправлять клиенту уведомления и нужно ли сообщить о книге сразу или включить её в дайджест.

Manticore находит совпадения, а Bookbot решает, как и когда сообщить о них читателю.

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

По данным Bookbot, на Watchdog приходится около **10% выручки**.

> «Manticore позволяет нам сопоставлять каждую книгу, появившуюся в продаже, примерно с 3.5 млн сохранённых запросов. Сейчас на Watchdog приходится около 10% нашей выручки, так что это не просто поисковая функция, а важный канал продаж».

Для Bookbot это прямой результат поиска в обоих направлениях: читатели ищут книги в каталоге, а для новых поступлений система находит читателей, которые их ждут.

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

## Поиск, который помогает читателям, даже если они ошибаются в запросе

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

Для исправления опечаток Bookbot использует отдельный словарь в Manticore примерно с **4.52 млн записей об изданиях**. В него входят названия, имена авторов, серии, псевдонимы, вручную собранные варианты ошибочного написания, поля на разных языках и варианты немецкой транслитерации. При этом идентификаторы вроде ISBN не используются в качестве вариантов исправления.

Словарь подсказывает подходящие издания, но не определяет, что Bookbot может продать. За проверку наличия и соответствия конкретных экземпляров фильтрам пользователя по-прежнему отвечает основной индекс ассортимента.

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

В итоге поиск лучше справляется с ошибками в запросах, а читатели по-прежнему видят только те экземпляры, которые действительно можно купить.

## Одна поисковая система на всём пути книги

Поиск на сайте и Watchdog - самые заметные для покупателей примеры использования Manticore. Но Bookbot применяет его и для других задач.

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

По текстовым данным - названиям, именам авторов и аннотациям - доступен полнотекстовый поиск. Структурированные метаданные, такие как ISBN, издательство, год публикации, язык и идентификаторы категорий, хранятся в [колоночном хранилище](https://manual.manticoresearch.com/Creating_a_table/Data_types#Row-wise-and-columnar-attribute-storages) Manticore.

Manticore используется и во внутренних системах Bookbot: для поиска по книгам, изданиям, авторам, клиентам, заказам и бухгалтерским записям. Индекс книг для внутренних задач содержит около **24.7 млн записей** (включая проданные и архивные экземпляры).

Manticore помогает и при доставке: ещё один индекс содержит данные примерно о **197000 пунктах выдачи**. Здесь текстовый поиск сочетается с фильтрацией по местоположению и сортировкой по расстоянию с помощью [геопоиска](https://manual.manticoresearch.com/Searching/Geo_search) Manticore.

Это особенно полезно для Bookbot, поскольку компания разрабатывает свои системы самостоятельно. Команда может использовать один поисковый движок для разных задач: поиска на сайте, обратного сопоставления, работы с большим массивом метаданных, внутреннего поиска и геопоиска. Для каждого сценария не нужно подбирать отдельную технологию.

Manticore помогает на всех этапах работы с книгой: определить издание, добавить книгу в поиск, выбрать экземпляр для показа в выдаче, найти читателей, которые ждут эту книгу, решить внутренние задачи и подобрать пункт выдачи после продажи.

> «Мы используем Manticore для поиска на сайте, работы Watchdog, поиска по библиографической базе на 203 млн записей, внутреннего поиска и поиска пунктов выдачи. Единая поисковая технология для всех этих задач заметно упрощает архитектуру нашей системы».

## Большие объёмы данных при компактной инфраструктуре

Bookbot использует Manticore в Kubernetes для четырёх задач: поиска для покупателей, внутреннего поиска, Watchdog и поиска по библиографическим метаданным. Для каждой задачи выделены отдельные сервера, что позволяет независимо масштабировать ресурсы под неё.

На 5 сентября 2026 года показатели рабочей системы были такими:

| Показатель | Значение |
|---|---:|
| Основной индекс книг | ~5.30 млн документов |
| Физические экземпляры в наличии | ~1.29 млн |
| Заранее сформированный индекс по названиям книг | ~3.59 млн записей |
| Сохранённые запросы Watchdog | ~3.50 млн |
| База библиографических метаданных | ~203.44 млн записей |
| Учтённые в метриках операции формирования выдачи | ~20.2 млн/день |
| Средняя частота операций в пересчёте на секунду | ~234/с |
| Время выполнения успешного запроса на выбор экземпляра | ~7.7 мс в среднем |
| Доля успешных запросов на выбор экземпляра, уложившихся в 50 мс | 98.6% |
| Средняя загрузка CPU по всем четырём задачам | ~6.6 ядра |
| Среднее потребление памяти по всем четырём задачам | ~40 GiB |

Под объёмом запросов понимаются операции Manticore в метриках - не поисковые запросы пользователей. Запрос одной страницы может вызывать несколько операций: получение результатов, выбор экземпляра и расчёт фасетных счётчиков.

Среднее время 7.7 мс относится к вызову Manticore из приложения при успешном выполнении запроса на выбор экземпляра. Это не полное время загрузки страницы и не время, необходимое для обновления данных об ассортименте во всей системе.

Во время замеров система не испытывала длительной пиковой нагрузки по CPU и памяти ни в одной из четырёх задач. Поиск для покупателей потреблял основную часть процессорных ресурсов, а поиск по библиографической базе на 203 млн записей в среднем использовал менее 0.1 ядра CPU и около 18.6 GiB памяти.

Здесь важен не отдельный результат теста производительности, а сочетание задач, которые Bookbot решает с помощью одной поисковой технологии. Это поиск по постоянно меняющемуся ассортименту интернет-магазина, сопоставление новых поступлений с миллионами сохранённых запросов, работа со справочной базой на 203 млн записей, внутренние операции и геопоиск. При этом инфраструктура остаётся относительно компактной.

## Поиск на всех этапах работы с книгой

Особенность Bookbot в том, что поиск на Manticore тесно связан с жизненным циклом каждого экземпляра книги.

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

Если нужной книги нет в наличии, читатель может сохранить запрос в Watchdog. Когда появляется подходящий экземпляр, Manticore может сопоставить книгу с миллионами сохранённых запросов и помочь Bookbot связать новое предложение с уже существующим спросом.

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

Для читателей это поиск, который показывает, что действительно можно купить, и помнит о книгах, которых они ждут.

Bookbot использует поиск на нескольких этапах работы с покупателями. А Watchdog стал каналом продаж, который, по словам компании, приносит примерно **10% её выручки**.

В этом и заключается ценность Manticore для Bookbot: не просто быстро находить текст, а объединять на одной поисковой платформе работу с постоянно меняющимся ассортиментом, фильтрацию по структурированным данным, группировку результатов, обратный поиск, поиск по большим справочным базам и геопоиск. Покупателям проще находить нужные книги, а компания получает пользу, которую можно оценить в цифрах.
