Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Índices multilíngue com Laravel Scout e Algolia


Eu pensei muito sobre isso e acho que a melhor maneira seria usar 1 índice por modelo e aproveitar o callback que você pode passar para ::search()

Indexação de dados


Primeiro você precisa usar toSearchableArray() para preparar os dados. Eu desabilitaria todos os atributos desnecessários (como datas) e aninharia o conteúdo em seu 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"
  }
}

Observe que Algolia tem um limite de 10 KB por registros. A melhor maneira de lidar com isso é truncar seus maiores atributos. Não se preocupe, isso não afeta a relevância . Se você perder a segunda metade do seu artigo, geralmente todo o conteúdo relevante já está na primeira metade.

Configure a configuração do Algolia no painel


Em seguida, vá para o seu painel e adicione fr e en para os searchableAttributes .

Pesquisar


Você pode restringir searchableAttributes no momento da consulta com um retorno de chamada passado para a pesquisa
$lang = 'en';
Model::search($query, function ($algolia, $query, $options) use ($lang) {
    $options = array_merge($options, [
        'restrictSearchableAttributes' => [$lang],
    ]);

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

Criei uma característica para conseguir algo semelhante . Talvez você possa fazer algo semelhante, para ter uma sintaxe fácil de usar como:
Model::searchLang($lang, $query);

Depois de todo o pensamento, eu realmente acho que é a maneira menos complicada de usar o Laravel Scout com suas restrições.

Por favor, deixe-me saber o que você pensa :)