← На главную

Новый движок php-fts для поиска в PHP

06.05.2026 20:28 · hackernews

Полноценный движок полнотекстового поиска на чистом PHP. Никаких расширений, внешних сервисов или зависимостей — только файлы. Проект php-fts создан для ситуаций, где нельзя запускать отдельный поисковый сервис: общий хостинг, маленькие VPS или просто желание сохранить стек минимальным и портативным. Если у вас есть доступ к Elasticsearch, Meilisearch или Typesense и инфраструктура для их работы, используйте их — они мощнее и заточены под огромные нагрузки. Но если вы не можете или не хотите их развертывать, php-fts предлагает надёжный поиск с ранжированием, фильтрами и толерантным совпадением без установки дополнительных компонентов.

Решение подходит, если вы находитесь на общем хостинге, хотите избежать нагрузки на инфраструктуру, работаете с сотнями или десятками тысяч документов, индексируете данные офлайн или по расписанию и обслуживаете запросы во время работы. Если же нужны реалтайм-индексы под высокой нагрузкой писем, база в миллионы записей или геопоиск с изоляцией мульти-тенантов — это инструмент не для вас. Движок использует индексирование на основе триграмм, устойчивое к опечаткам и частичным совпадениям. Для оценки релевантности применяется BM25 + IDF, отраслевой стандарт, как в Lucene и Elasticsearch. В результатах возвращается отдельный балл для каждого документа, что позволяет строить фасетные подсчёты или сортировку. Поддерживается boosting полей, например, чтобы заголовок валился весче описания.

Фильтры включают точное совпадение, сравнения, диапазоны, операторы in и not in, поиск внутри массивов и логика AND/OR. Вставка пакетами работает в два с лишним раза быстрее одиночных запросов благодаря единой блокировке на всю партию. Мягкое удаление через «могилы» упрощает очистку при компрессии. Ядро использует бинарное хранилище, портативное между серверами, и обеспечивает O(1) доступ к триграммам без обхода дерева. Всё работает на любом стандартном PHP 8.1+, без библиотек, только путём копирования директории src в проект.

Бенчмарки на Windows 11 и Linux показывают разницу в скорости вставки: пакетная вставка на Linux работает быстро, а одиночная вставка на общих тарифах может занимать минуты для десятков тысяч документов. Всегда используйте insertBulk() в продакшене — он блокирует один раз на всю партию и быстрее в два раза. Размер индекса растёт линейно: от 2.8 МБ на тысяче записей до 106 МБ на полтинке. Поиск на линуксовом общем хостинге с 10 тысячами документов отвечает за 3.2 мс в медиане, максимум около 37 мс. Фильтры, веса и итоговый счётчик рассчитываются прямо движком. Это не интерфейс, а просто мощный мотор, который можно встроить в любой проект от каталога товаров до админки.

Читать оригинал →