sql >> Base de Datos >  >> RDS >> Mysql

Índices multilenguaje con Laravel Scout y Algolia

Lo pensé mucho y creo que la mejor manera sería usar 1 índice por modelo y aprovechar la devolución de llamada que puede pasar a ::search()

Indización de datos

Primero necesitas usar toSearchableArray() para preparar los datos. Quitaría todos los atributos innecesarios (como las fechas) y luego anidaría el contenido en su ISO.

{
  objectID: 1,
  en: {
    title: "Title in english",
    body: "trucated body in english"
  },
  fr: {
    title: "Titre en français",
    body: "contenu tronqué en français"
  }
}

Tenga en cuenta que Algolia tiene un límite de 10 KB por registro. La mejor manera de manejar esto es truncar sus mayores atributos. No te preocupes, no afecta la relevancia . Si se pierde la segunda mitad de su artículo, normalmente todo el contenido relevante ya está en la primera mitad.

Configurar la configuración de Algolia en el panel

Luego dirígete a tu tablero y agrega fr y en a los searchableAttributes .

Buscar

Puede restringir searchableAttributes en el momento de la consulta con una devolución de llamada pasada a la búsqueda

$lang = 'en';
Model::search($query, function ($algolia, $query, $options) use ($lang) {
    $options = array_merge($options, [
        'restrictSearchableAttributes' => [$lang],
    ]);

    return $algolia->search($query, $options);
});

Creé un rasgo para lograr algo similar . Tal vez pueda hacer algo similar para tener una sintaxis fácil de usar como:

Model::searchLang($lang, $query);

Después de pensarlo mucho, realmente creo que es la forma menos complicada de usar Laravel Scout con tus limitaciones.

Por favor, hazme saber lo que piensas :)