# Как Indexfox построил AI-виджет поиска по сайту на Manticore

Indexfox — это AI-виджет поиска, который любой сайт может подключить одним тегом <script>: автоматический обход страниц, гибридные результаты по ключевым словам и семантике, а также прямые AI-ответы со ссылками на источники. Под капотом каждый запрос обслуживает Manticore Search: полнотекстовый MATCH с английской лемматизацией, векторный KNN-поиск по HNSW с 8-битным квантованием, Reciprocal Rank Fusion для объединения двух выдач и CALL AUTOCOMPLETE для подсказок по мере ввода. В этой статье разбираем, как Indexfox построил многопользовательский AI-продукт для поиска по сайтам на базе Manticore, на какие возможности опирался и почему поисковый движок с открытым исходным кодом оказался правильной основой.

### Знакомство с Indexfox

[Indexfox](https://indexfox.ai) — это размещаемый AI-виджет поиска, который любой сайт может установить одним тегом `<script>`. Его идея формулируется просто: добавьте фрагмент кода в свой `<head>`, и за несколько минут Indexfox обойдет сайт, проиндексирует каждую страницу и покажет поисковую строку, которая отвечает на вопросы пользователей напрямую — со ссылками на источники — рядом с обычным ранжированным списком. Лендинг описывает это как «AI-поиск, который находит, отвечает и продает», а также показывает живую демоверсию на apple.com, чтобы посетители могли попробовать продукт до регистрации.

С точки зрения поисковой инженерии Indexfox интересен тем, чего его конечные пользователи *не* видят. За дружелюбным талисманом-лисом и историей про настройку за две минуты стоит гибридный поисковый стек: сопоставление по ключевым словам, векторный поиск, автодополнение и генерация ответов — и все это обслуживается одним экземпляром Manticore Search. В этой статье мы посмотрим, как Indexfox использует Manticore под капотом и почему поисковый движок с открытым исходным кодом оказался правильной основой для многопользовательского SaaS.

### Проблема поиска по сайту

На большинстве сайтов поиск до сих пор выглядит как функция, прикрученная в последний момент. Лендинг Indexfox начинает с хорошо знакомого сюжета: значительная доля пользователей уходит с сайта после одного неудачного поиска, а на сайтах с большим объемом контента или товаров такая потерянная сессия часто означает потерянную конверсию. Классические полнотекстовые движки плохо справляются с запросами, сформулированными естественным языком; чистый семантический поиск пропускает точные термины и коды товаров; запуск обоих движков рядом означает два индекса, которые нужно синхронизировать, и вдвое большую операционную поверхность.

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

### Почему Manticore Search

Indexfox выбрал Manticore Search по трем конкретным причинам.

Во-первых, Manticore — единый движок с открытым исходным кодом и полноценной поддержкой как полнотекстовых, так и KNN-векторных индексов. Не нужно поднимать второе хранилище, писать связующий код для согласованности векторного и ключевого индексов и беспокоиться о лицензировании по мере роста клиентской базы. Один и тот же SQL-подобный диалект работает с обоими подходами.

Во-вторых, Manticore делает изоляцию по арендаторам недорогой. Indexfox моделирует каждый клиентский сайт как собственный набор таблиц: одну для страниц, одну для сегментов контента и одну для предложений. Новый сайт, добавленный на платформу, на уровне хранения — это просто оператор `CREATE TABLE`; отключение клиента — `DROP TABLE`.

В-третьих, Manticore легок в эксплуатации. Бэкенд обращается к нему через HTTP/JSON API с помощью официального клиента `manticoresearch-ts`. Вставки в режиме реального времени сразу становятся доступными, движок работает на одной VM примерно так же, как Postgres, и здесь нет ни JVM, ни кластера, ни отдельной плоскости оркестрации, за которой нужно присматривать.

### Три слоя смысла

Indexfox индексирует каждый просканированный сайт в три слоистые таблицы, все с `engine='columnar'`:

- Таблица **webpage** — одна строка на URL, с заголовком, описанием, исходным HTML, языком и усредненным эмбеддингом уровня страницы.
- Таблица **segment** — одна строка на логический блок контента (заголовок и абзацы под ним). Большую часть лингвистической работы выполняют настройки Manticore для этой таблицы: `morphology='lemmatize_en'` для английского стемминга, `bigram_index='all'` для поиска по коротким фразам, `min_infix_len=2` для нахождения частичных слов и тщательно подобранный список `stopwords='en'`.
- Таблица **sentence** — одна строка на предложение; она используется и для точного семантического поиска, и как словарь для автодополнения.

В каждой таблице есть поле `float_vector`, настроенное с `knn_type='hnsw'`, `hnsw_similarity='cosine'` и `quantization='8bit'`. Размерность векторов задается динамически для каждого сайта, потому что каждый клиент может выбрать модель эмбеддингов, которая лучше подходит его контенту и бюджету: 1536-мерную `text-embedding-3-small` от OpenAI, 1024-мерную `voyage-3` от Voyage, 1024-мерную многоязычную модель Jina или локальный sentence-transformer на 384 измерения для установок с ограниченным бюджетом. Manticore хранит их все; меняется только схема.

### Как на самом деле выполняется запрос

Когда пользователь вводит текст в виджет Indexfox, бэкенд параллельно задействует три возможности Manticore.

Путь по ключевым словам выполняет `SELECT … MATCH('…')` по таблицам segment и sentence, с близостью слов и кворумом, когда токенизированный запрос становится достаточно длинным, а функция Manticore `highlight()` сразу размечает фрагменты. Векторный путь выполняет `SELECT … WHERE knn(embedding, k, (?), { oversampling=3.0, rescore=1 })` по HNSW-графу в тех же таблицах с фильтром по языку пользователя. Оба набора результатов объединяются через **Reciprocal Rank Fusion** — по стандартной формуле `1 / (60 + rank_keyword) + 1 / (60 + rank_vector)`. Документ, который высоко ранжируется в обоих путях, поднимается наверх, а сильный результат только по ключевым словам и сильный результат только по семантике получают свою долю внимания. Каждый результат помечается тем, откуда он пришел: из поиска по ключевым словам, из векторного поиска или из обоих, чтобы интерфейс мог подсказать, *почему* страница появилась в выдаче.

Для строки с подсказками по мере ввода виджет вызывает `CALL AUTOCOMPLETE` Manticore по таблице sentence с `force_bigrams=1` и `expansion_len=12`, возвращая подсказки с учетом биграмм значительно быстрее миллисекунды. AI-ответ, который виджет показывает над списком результатов, генерируется LLM, но фрагменты со ссылками на источники, которые он цитирует, — это ровно верхние результаты, возвращенные Manticore. На практике качество извлечения и есть продукт.

Клиенты ничего этого не видят. Интеграция на их стороне — тот самый фрагмент кода, который находится на лендинге Indexfox с момента запуска:

```html
<script>
(function(d, w) {
    w.IndexfoxID = 'your-website-id';
    var s = d.createElement('script');
    s.async = true;
    s.src = 'https://widget.indexfox.ai/indexfox.js';
    if (d.head) d.head.appendChild(s);
})(document, window);
</script>
```

Один тег на странице, один кластер Manticore на другой стороне.

### Manticore Search тоже использует Indexfox

Поисковая строка вверху [manticoresearch.com](https://manticoresearch.com) сама является виджетом Indexfox. Нажмите на поле поиска или клавиши <kbd>⌘</kbd>+<kbd>K</kbd> на любой странице этого сайта, и вы получите те же гибридные результаты по ключевым словам и семантике, те же биграммные подсказки по мере ввода и тот же AI-сгенерированный ответ со ссылками на источники — по собственному блогу, документации и продуктовым страницам Manticore. Интеграция — это ровно тот фрагмент `<script>` выше, добавленный в шаблон сайта. Manticore работает под капотом Indexfox; теперь Indexfox обеспечивает поиск на собственном сайте Manticore.

![Indexfox на manticoresearch.com](./how-indexfox-built-an-ai-site-search-widget-on-manticore/manticore-indexfox.png)

### Главное

Ставка Indexfox была в том, что правильный поисковый движок с открытым исходным кодом может заменить стек Postgres плюс pgvector плюс Elasticsearch одним бинарным файлом и дать небольшой команде сосредоточиться на качестве краулера, выборе эмбеддингов и генерации ответов, а не на эксплуатации инфраструктуры. Сегодня каждое нажатие клавиши в виджете Indexfox — в живой демоверсии на [indexfox.ai](https://indexfox.ai) и на каждом сайте, где он установлен, — обслуживается Manticore.
