Перебудова потрібна, коли змінилася структура документа (toSearchableArray), налаштування ранжування, мовна обробка чи версія пошукового рушія. Наївний шлях - scout:flush і scout:import - залишає сайт без пошуку на весь час імпорту, а на мільйонах записів це години.
Налаштування індексу як код. Фільтровані, сортовані поля й правила ранжування описують у config/scout.php:
'meilisearch' => [
'index-settings' => [
Post::class => [
'filterableAttributes' => ['author_id', 'tags', 'published_at'],
'sortableAttributes' => ['published_at'],
'searchableAttributes' => ['title', 'body', 'tags'],
],
],
],
php artisan scout:sync-index-settings
Команду додають у деплой. Зміна налаштувань у Meilisearch запускає перебудову індексу на боці рушія - він продовжує відповідати, але на великих індексах це навантаження.
Перебудова без простою - через новий індекс:
- версія в імені індексу:
public function searchableAs(): string
{
return config('scout.prefix') . 'posts_' . config('search.posts_version');
}
- наповнити новий індекс, поки старий обслуговує пошук: окремий процес з новою версією в конфігурації виконує
scout:queue-import; - дочекатися завершення індексації на боці рушія (Meilisearch обробляє задачі асинхронно - успішний імпорт у Laravel ще не означає готовий індекс);
- перемкнути версію в конфігурації застосунку (або атомарно поміняти індекси місцями - Meilisearch має операцію swap indexes);
- досинхронізувати зміни, що відбулися під час імпорту: записи, оновлені після старту, - повторно (
Post::where('updated_at', '>=', $startedAt)->searchable()); - видалити старий індекс після перевірки.
Чому крок 5 важливий: поки йде імпорт, звичайні збереження моделей пишуть у поточний індекс (той, що повертає searchableAs). Без досинхронізації новий індекс міститиме застарілі дані для змінених за цей час записів.
Інші пастки:
scout:importу черзі не відновлює зв'язки зmakeAllSearchableUsing- денормалізовані дані зі зв'язків варто завантажувати вtoSearchableArray, усвідомлюючи N+1, або імпортувати синхронно порціями;- видалення: записи, видалені під час перебудови, можуть «воскреснути» в новому індексі, якщо їх прочитали до видалення - перевіряйте
shouldBeSearchableі результати пошуку фільтруйте по базі; - тест релевантності: набір контрольних запитів з очікуваними результатами, який порівнює старий і новий індекс перед перемиканням.
Докладніше в документації: Scout: налаштування індексів Meilisearch