Обсудить задачу

Поиск

Начните вводить запрос: ищем по статьям, кейсам и услугам.

навигация Esc закрыть

Как сделать поиск по статическому сайту без сервера

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

В проектах на Astro, Eleventy и других статических генераторах в Exceltic.dev регулярно видим один и тот же момент: сайт растёт, разделов и статей становится больше сотни, а обычной навигации по меню уже не хватает - читателю нужен поиск. Команда открывает панель хостинга и упирается в вопрос: сервера, который выполнит запрос, в архитектуре просто нет.

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

Проблема встаёт в полный рост у контентных сайтов - документации, блогов, каталогов, - где счёт статей идёт на сотни. У такого сайта нет сервера, который на лету выполнит запрос по тексту: страница отдаётся как готовый HTML-файл с хостинга или CDN. Без отдельного механизма поиск на сайте просто отсутствует, а читатель ищет нужную статью через Ctrl+F в браузере или уходит искать ответ в Google.

Статический поисковый индекс: заранее собранный файл или набор файлов с данными для поиска по сайту, который создаётся один раз при сборке и после этого отдаётся браузеру как обычный статический ресурс.

Почему у статического сайта нет “обычного” поиска

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

Статический сайт устроен иначе. Astro, Eleventy, Hugo и другие генераторы превращают контент в готовые HTML-файлы ещё на этапе сборки, а не на каждый запрос пользователя. Хостинг или CDN просто отдают эти файлы браузеру без каких-либо вычислений на своей стороне - в этом и заключается их скорость и простота.

У такого сайта нет ни базы данных, ни процесса, который мог бы выполнить SQL-запрос по тексту статей. Строка поиска, отправляющая запрос на несуществующий сервер, вернёт ошибку 404 или просто ничего не сделает.

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

Варианты решения - обзор подходов

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

  • Предварительно построенный индекс в браузере. На этапе сборки сайта генерируется поисковый индекс, который загружается в браузер и обрабатывает запросы прямо на клиенте. Пример такого инструмента - Pagefind, open-source библиотека для полнотекстового поиска по статическим сайтам без хостинга собственной инфраструктуры.
  • Сторонний поисковый сервис или API. Индекс строится и хранится не в браузере, а на серверах внешнего провайдера (например, Algolia или Meilisearch Cloud). Сайт отправляет запрос по сети и получает готовый список результатов - фактически это возврат к серверной модели, только сервер чужой.
  • Встроенный поиск CMS или платформы. Если контент хранится в headless CMS с собственным API поиска, эту функцию можно использовать напрямую, не добавляя отдельный инструмент - актуально для сайтов на архитектуре вроде Astro и Sanity, где контент и так живёт в управляемом хранилище.

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

Когда какой вариант подходит

Выбор зависит не от предпочтений разработчика, а от объёма контента и требований к качеству поиска.

  • Небольшой сайт или документация (до нескольких тысяч страниц). Предварительно построенного индекса в браузере достаточно: он не требует ни оплаты стороннего сервиса, ни отдельной инфраструктуры, а результат появляется мгновенно после ввода запроса.
  • Крупный каталог или e-commerce. Здесь клиентский поиск обычно перестаёт справляться - нужны фасетные фильтры, персонализация выдачи и аналитика по несостоявшимся запросам, которые есть у сторонних поисковых сервисов, но плохо ложатся на статический индекс.
  • Нужен fuzzy-поиск и синонимы. Базовые библиотеки для клиентского поиска умеют прощать опечатки и частичные совпадения, но продвинутая работа с синонимами, ошибками распознавания языка и весами полей обычно лучше реализована у специализированных сервисов.
  • Нужна персонализация выдачи. Показ разных результатов разным пользователям требует сервера, который знает контекст запроса - клиентский индекс такой возможности не даёт в принципе.

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

Как работает клиентский поиск на практике

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

1. Генерация индекса при сборке

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

Пример шага сборки (концептуально, псевдокод)
# сначала обычная сборка статического сайта
astro build

# затем отдельный шаг индексации по готовым HTML-файлам
npx pagefind --site dist

2. Загрузка индекса частями по мере набора запроса

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

3. Ранжирование результатов

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

4. Работа офлайн и на медленном интернете

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

На сайте документации из 300-500 страниц собранный поисковый индекс обычно занимает от одного до нескольких мегабайт суммарно, но благодаря разбивке на части браузер при первом запросе подгружает лишь десятки-сотни килобайт - основная масса файла остаётся невостребованной, пока запрос не станет достаточно специфичным. По данным документации Pagefind, библиотека способна индексировать сайты из 10 000 страниц с суммарной сетевой нагрузкой на поисковый интерфейс в пределах нескольких сотен килобайт - точные цифры зависят от объёма текста на странице и настроек индексации. По состоянию на середину 2026 года Pagefind остаётся одним из наиболее используемых инструментов такого рода в экосистеме статических генераторов.

Что теряется по сравнению с серверным поиском

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

Персонализация выдачи. Индекс собирается заранее и одинаков для всех посетителей - показать разным пользователям разные результаты по их истории или роли невозможно без сервера.

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

Рост индекса вместе с объёмом контента. Чем больше страниц и текста на сайте, тем тяжелее становится индекс. Для сайта с десятками тысяч статей объём данных, которые нужно поддерживать актуальными при каждой сборке, становится заметной статьёй расходов по времени сборки.

Типичные ошибки

Большинство проблем с клиентским поиском всплывают не при внедрении, а через несколько месяцев эксплуатации сайта.

  • Индекс собирается не на финальных файлах сборки. Если шаг индексации запускается раньше, чем готов итоговый HTML, в индекс попадает неполный или устаревший контент.
  • Забытая пересборка индекса при автопубликации. Если контент обновляется отдельным процессом (например, через CMS-вебхук), а шаг индексации не встроен в этот же пайплайн, поиск начинает выдавать устаревшие результаты.
  • Поиск не протестирован на медленном соединении. Индекс, который отлично работает на офисном Wi-Fi, может ощутимо тормозить на мобильном интернете - это стоит проверять отдельно.
  • Ожидание фасетных фильтров и персонализации от базового решения. Клиентский индекс не заменяет полноценный поисковый сервис для каталога с десятками атрибутов фильтрации.
  • Отсутствие резервного сценария при недоступности JavaScript. Поиск полностью зависит от выполнения скрипта в браузере - без запасного варианта (например, обычной навигации) пользователь с отключённым JS останется без поиска вовсе.

Для кого актуально

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

Часто задаваемые вопросы

Работает ли клиентский поиск на сайте с десятками тысяч страниц?

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

Нужен ли для клиентского поиска отдельный сервер или хостинг индекса?

Нет, в этом и состоит основное преимущество подхода. Индекс - это набор статических файлов, которые деплоятся вместе с остальным сайтом на тот же хостинг или CDN, без отдельной инфраструктуры и без ежемесячной оплаты стороннего сервиса. Индекс генерируется тем же процессом сборки, что и остальной сайт, поэтому отдельный сервис для его хранения заводить не нужно - он просто становится частью обычного деплоя вместе с HTML-файлами и остальными статическими ресурсами.

Умеет ли клиентский поиск прощать опечатки и искать по частичным совпадениям?

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

Как обновляется индекс, если контент на сайте меняется?

Индекс пересобирается при каждом деплое сайта вместе с остальной сборкой. Если контент публикуется автоматически (например, через вебхук из headless CMS), важно убедиться, что шаг индексации встроен в тот же пайплайн деплоя - иначе поиск будет отставать от реального содержимого сайта. На практике это одна дополнительная команда в скрипте сборки сразу после генерации HTML-файлов - без неё новые статьи просто не попадут в поисковую выдачу, хотя сама страница уже опубликована.

Сколько времени занимает добавление поиска на уже готовый сайт?

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

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

Если у вас статический сайт растёт контентом, а поиска по нему всё ещё нет - опишите задачу команде Exceltic.dev. Разберём объём контента и предложим архитектуру поиска под ваш сайт.

Ещё статьи

Все
Связаться удобным способом
WhatsApp Telegram

Прежде чем уйти: оценка задачи бесплатно

Опишите задачу в двух словах, и мы предложим решение, стек и смету со сроками.

Три направления одной командой: разработка программ, веб-разработка и внедрение CRM. Больше 100 проектов, проект ведёт напрямую инженер, на русском и английском.