Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Як перебудувати пошуковий індекс Scout без простою і змінювати налаштування індексу?

Перебудова потрібна, коли змінилася структура документа (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 запускає перебудову індексу на боці рушія - він продовжує відповідати, але на великих індексах це навантаження.

Перебудова без простою - через новий індекс:

  1. версія в імені індексу:
public function searchableAs(): string
{
    return config('scout.prefix') . 'posts_' . config('search.posts_version');
}
  1. наповнити новий індекс, поки старий обслуговує пошук: окремий процес з новою версією в конфігурації виконує scout:queue-import;
  2. дочекатися завершення індексації на боці рушія (Meilisearch обробляє задачі асинхронно - успішний імпорт у Laravel ще не означає готовий індекс);
  3. перемкнути версію в конфігурації застосунку (або атомарно поміняти індекси місцями - Meilisearch має операцію swap indexes);
  4. досинхронізувати зміни, що відбулися під час імпорту: записи, оновлені після старту, - повторно (Post::where('updated_at', '>=', $startedAt)->searchable());
  5. видалити старий індекс після перевірки.

Чому крок 5 важливий: поки йде імпорт, звичайні збереження моделей пишуть у поточний індекс (той, що повертає searchableAs). Без досинхронізації новий індекс міститиме застарілі дані для змінених за цей час записів.

Інші пастки:

  • scout:import у черзі не відновлює зв'язки з makeAllSearchableUsing - денормалізовані дані зі зв'язків варто завантажувати в toSearchableArray, усвідомлюючи N+1, або імпортувати синхронно порціями;
  • видалення: записи, видалені під час перебудови, можуть «воскреснути» в новому індексі, якщо їх прочитали до видалення - перевіряйте shouldBeSearchable і результати пошуку фільтруйте по базі;
  • тест релевантності: набір контрольних запитів з очікуваними результатами, який порівнює старий і новий індекс перед перемиканням.

Докладніше в документації: Scout: налаштування індексів Meilisearch

Схожі питання