⚠️ Эта страница автоматически переведена, и перевод может быть несовершенным.
blog-post

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

author image

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

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

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

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

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

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

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 с момента запуска:

<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 сама является виджетом Indexfox. Нажмите на поле поиска или клавиши +K на любой странице этого сайта, и вы получите те же гибридные результаты по ключевым словам и семантике, те же биграммные подсказки по мере ввода и тот же AI-сгенерированный ответ со ссылками на источники — по собственному блогу, документации и продуктовым страницам Manticore. Интеграция — это ровно тот фрагмент <script> выше, добавленный в шаблон сайта. Manticore работает под капотом Indexfox; теперь Indexfox обеспечивает поиск на собственном сайте Manticore.

Indexfox на manticoresearch.com

Главное

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

Установить Manticore Search

Установить Manticore Search