КОНЬЯКОВ.ру

Разработка и поддержка веб-сайтов на 1C-Bitrix. E-commerce компетенции. Опыт с 2007 года.

Полное руководство по полнотекстовому поиску (Meilisearch) в Laravel

Полное руководство по полнотекстовому поиску в Laravel

Рассмотрим, как использовать функции поиска в Laravel. Начнем с описания преимуществ полнотекстового поиска, а затем пошагово разберем настройку в Laravel-приложении.

🔎 Зачем использовать полнотекстовый поиск?

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

🛠 Как внедрить поиск в Laravel## 1. Установка Laravel Scout

Laravel поддерживает полнотекстовый поиск «из коробки» с помощью официального пакета Laravel Scout.
Установите Scout через Composer в терминале вашего проекта:

composer require laravel/scout

После установки опубликуйте файл конфигурации config/scout.php с помощью команды Artisan:

php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"

2. Настройка драйвера Meilisearch

Meilisearch — это быстрый поисковый движок с открытым исходным кодом, написанный на Rust. Использование специализированного драйвера снимает ограничения обычных SQL-баз.
Сначала установите необходимую зависимость для интеграции Scout и Meilisearch:

composer require meilisearch/meilisearch-php http-interop/http-factory-guzzle

Затем обновите переменные окружения в вашем файле .env:

SCOUT_DRIVER=meilisearch
MEILISEARCH_HOST=http://127.0.0.1:7700
MEILISEARCH_KEY=masterKey

(Примечание: Если вы используете среду разработки Laravel Sail, хост по умолчанию будет http://meilisearch:7700 из-за особенностей работы сети Docker Bridge).
Для продакшена рекомендуется использовать управляемый сервис Meilisearch Cloud, где URL хоста можно скопировать в настройках проекта.

3. Подключение моделей Eloquent

Чтобы сделать модель доступной для поиска, добавьте в нее трейт Laravel\Scout\Searchable. Наблюдатели моделей (observers) будут автоматически синхронизировать данные с Meilisearch при любых изменениях в БД.
Пример настройки модели:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;

class Contact extends Model
{
    use Searchable;
}

Вы можете использовать метод toSearchableArray, чтобы точно указать, какие поля (включая данные из связанных таблиц) должны отправляться в индекс:

public function toSearchableArray(): array
{
    return [
        'id' => (int) $this->id,
        'name' => $this->name,
        'email' => $this->email,
        'company_name' => $this->company_name,
        // Пример добавления связи:
        'organization' => $this->organization ? [
            'id' => $this->organization->id,
            'name' => $this->organization->name,
        ] : null,
    ];
}

4. Настройка фильтрации и сортировки

Чтобы использовать продвинутые фильтры и сортировку в Meilisearch, укажите нужные атрибуты в конфигурационном файле config/scout.php в блоке настроек индексов:

'meilisearch' => [
    'host' => env('MEILISEARCH_HOST', 'http://localhost:7700'),
    'key' => env('MEILISEARCH_KEY'),
    'index_settings' => [
        App\Models\Contact::class => [
            'filterableAttributes' => ['organization_id'],
            'sortableAttributes' => ['name', 'company_name'],
        ],
    ],
],

Чтобы применить эти настройки и отправить их в Meilisearch, выполните Artisan-команду:

php artisan scout:sync-index-settings

💡 Пример реализации

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

  • Мульти-поиск (одновременный поиск по разным индексам).
  • Мультиарендность (Multi-tenancy / изоляция данных пользователей).
  • Различные сценарии фильтрации и сортировки результатов.

Код проекта доступен в репозитории на GitHub: meilisearch/saas-demo.

🗒 Часто задаваемые вопросы (FAQ)

  • Что такое Laravel Scout?
    Это официальный пакет Laravel для интеграции полнотекстового поиска в модели Eloquent. Он автоматически обновляет поисковые индексы при изменении записей в базе данных.
  • Почему стоит выбрать Meilisearch в качестве драйвера для Scout?
    Стандартный драйвер базы данных имеет ограничения (отсутствие релевантности, не учитывает опечатки). Meilisearch «из коробки» предоставляет высокую скорость, исправление опечаток, поиск по префиксам и синонимам.
  • Как применить новые параметры фильтрации или сортировки?
    Сначала пропишите их в массиве конкретной модели в файле config/scout.php, после чего выполните команду php artisan scout:sync-index-settings для отправки конфигурации в поисковой движок.

IP lookup — KONYAKOV.ru

Написал сервис определения своего адреса IP Lookup, и api определения информации по ip адресу.

Фулстек — это не «знать всё». Это видеть картину целиком

Фулстек не сделал меня ни лучшим фронтендером, ни лучшим бэкендером в комнате. Он дал кое-что ценнее: способность видеть, где на самом деле находится проблема.

Половина багов, которые перекидывают между «фронтом» и «бэком», существует именно потому, что никто не смотрит на систему целиком. Инженеры, способные проследить запрос от клика по кнопке до строки в базе — и обратно — это те, кто разблокирует всех остальных.

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

Эти навыки не автоматизируются. Они только дорожают.

伤离别 by 魏新雨

今夜的天空升起一轮明月 (Jīnyè de tiānkōng shēng qǐ yī lún míngyuè) — Цзинье дэ тянькун шэн ци и лунь минъюэ
岸上红烛照亮孤单随风摇曳 (Ànshàng hóng zhú zhào liàng gūdān suí fēng yáoyè) — Аньшан хун чжу чжао лян гудань суй фэн яое
月光下相偎相依飞的蝴蝶 (Yuèguāng xià xiāngwēixiāngyī fēi de húdié) — Юэгуан ся сянвэйсяни фэй дэ худе
手中的情花绣了一整夜 (Shǒuzhōng de qíng huā xiùle yī zhěng yè) — Шоучжун дэ цин хуа сюлэ и чжэн е

我们的爱情就像书中情节 (Wǒmen de àiqíng jiù xiàng shūzhōng qíngjié) — Vomэнь дэ айцин цзю сян шучжун цинцзе
从一开始爱到最后情缘幻灭 (Cóng yī kāishǐ ài dào zuìhòu qíngyuán huànmiè) — Цун и кайши ай дао цзуйхоу цинъюань хуаньме
谁眼泪逆流成河不肯安歇 (Shéi yǎnlèi nìliú chéng hé bù kěn ānxiē) — Шэй яньлэй нилю чэн хэ бу кэнь аньсе
窗外的北风呼啸凌冽 (Chuāngwài de běifēng hūxiào língliè) — Чуанвай дэ бэйфэн хусяо линле

用一生痴情换 (Yòng yīshēng chīqíng huàn) — Юн ишэн чицин хуань
一幕悲剧伤离别 (Yīmù bēijù shāng líbié) — Иму бэйцзю шан либе
我执子之手竟无语凝噎 (Wǒ zhí zǐ zhī shǒu jìng wúyǔ níngyē) — Во чжи цзы чжи шоу цзин вуюй нине
你转身走的背影如此的坚决 (Nǐ zhuǎnshēn zǒu de bèiyǐng rúcǐ de jiānjué) — Ни чжуаньшэн цзоу дэ бэйин жуцы дэ цзяньцзюэ
谁风中悲歌唱一整夜 (Shéi fēng zhōng bēigē chàng yī zhěng yè) — Шэй фэн чжун бэйгэ чан и чжэн е

用一生痴情换 (Yòng yīshēng chīqíng huàn) — Юн ишэн чицин хуань
一幕悲剧伤离别 (Yīmù bēijù shāng líbié) — Иму бэйцзю шан либе
你不曾看见我泪水涟涟 (Nǐ bùcéng kànjiàn wǒ lèishuǐ liánlián) — Ни буцэн каньцзянь во лэйшуй ляньлянь
你离开以后天空飘起了大雪 (Nǐ líkāi yǐhòu tiānkōng piāoqǐle dàxuě) — Ни ликай иху тянькун пяоцилэ дасюэ
我等你年年花开花谢 (Wǒ děng nǐ niánnián huā kāi huā xiè) — Во дэн ни няньнянь хуа кай хуа се

我们的爱情就像书中情节 (Wǒmen de àiqíng jiù xiàng shūzhōng qíngjié) — Вомэнь дэ айцин цзю сян шучжун цинцзе
从一开始爱到最后情缘幻灭 (Cóng yī kāishǐ ài dào zuìhòu qíngyuán huànmiè) — Цун и кайши ай дао цзуйхоу цинъюань хуаньме
谁眼泪逆流成河不肯安歇 (Shéi yǎnlèi nìliú chéng hé bù kěn ānxiē) — Шэй яньлэй нилю чэн хэ бу кэнь аньсе
窗外的北风呼啸凌冽 (Chuāngwài de běifēng hūxiào língliè) — Чуанвай дэ бэйфэн хусяо линле

用一生痴情换 (Yòng yīshēng chīqíng huàn) — Юн ишэн чицин хуань
一幕悲剧伤离别 (Yīmù bēijù shāng líbié) — Иму бэйцзю шан либе
我执子之手竟无语凝噎 (Wǒ zhí zǐ zhī shǒu jìng wúyǔ níngyē) — Во чжи цзы чжи шоу цзин вуюй нине
你转身走的背影如此的坚决 (Nǐ zhuǎnshēn zǒu de bèiyǐng rúcǐ de jiānjué) — Ни чжуаньшэн цзоу дэ бэйин жуцы дэ цзяньцзюэ
谁风中悲歌唱一整夜 (Shéi fēng zhōng bēigē chàng yī zhěng yè) — Шэй фэн чжун бэйгэ чан и чжэн е

用一生痴情换 (Yòng yīshēng chīqíng huàn) — Юн ишэн чицин хуань
一幕悲剧伤离别 (Yīmù bēijù shāng líbié) — Иму бэйцзю шан либе
你不曾看见我泪水涟涟 (Nǐ bùcéng kànjiàn wǒ lèishuǐ liánlián) — Ни буцэн каньцзянь во лэйшуй ляньлянь
你离开以后天空飘起了大雪 (Nǐ líkāi yǐhòu tiānkōng piāoqǐle dàxuě) — Ни ликай иху тянькун пяоцилэ дасюэ
我等你年年花开花谢 (Wǒ děng nǐ niánnián huā kāi huā xiè) — Во дэн ни няньнянь хуа кай huа се

用一生痴情换 (Yòng yīshēng chīqíng huàn) — Юн ишэн чицин хуань
一幕悲剧伤离别 (Yīmù bēijù shāng líbié) — Иму бэйцзю шан либе
你不曾看见我泪水涟涟 (Nǐ bùcéng kànjiàn wǒ lèishuǐ liánlián) — Ни буцэн каньцзянь во лэйшуй ляньлянь
你离开以后天空飘起了大雪 (Nǐ líkāi yǐhòu tiānkōng piāoqǐle dàxuě) — Ни ликай иху тянькун пяоцилэ дасюэ
我等你年年花开花谢 (Wǒ děng nǐ niánnián huā kāi huā xiè) — Во дэн ни няньнянь хуа кай хуа се
我等你年年花开花谢 (Wǒ děng nǐ niánnián huā kāi huā xiè) — Во дэн ни няньнянь хуа кай хуа се

Написал JS/HTML песочницу (playground) микроаналог CodePen

Дело было вечером, делать было нечего.

Для экспериментов с кодом, иногда не хватает аналога Codepen, но без использования сторонних сервисов.

Задача поставлена, и реализована.

Собран онлайн-редактор JS/HTML в стиле Tryit Editor. Разделённая область редактора и превью, консоль с переключателем, полем ввода и выводом console.log, ну и конечно-же кнопка «Запустить», запускающая код.

Параллельно проведён аудит безопасности кода и применены исправленичя. Реализовано: изолированный sandbox-iframe без доступа к родительской странице, консоль через postMessage вместо eval в родителе, CSP, предупреждение с крестиком и запоминанием закрытия на сутки.

С учётом безопасности, редактор размещён на отдельном (изолированном на уровне хостинга) поддомене playground.konyakov.ru.

Общий вид редактора

Вид редактора с открытой консолью и набранным кодом с намеренно-допущенной js ошибкой. При запуске в консоль выводится текст js-ошибки

Если исправить ошибку и снова запустить код, он выполнится и вывете в консоль результат

Страница 1 из 91

© 2007–2026, konyakov.ru