Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Indeksy wielojęzyczne z Laravel Scout i Algolia

Dużo o tym myślałem i myślę, że najlepszym sposobem byłoby użycie 1 indeksu na model i skorzystanie z funkcji zwrotnej, którą możesz przekazać do ::search()

Indeksowanie danych

Najpierw musisz użyć toSearchableArray() do przygotowania danych. Usunąłbym wszystkie niepotrzebne atrybuty (takie jak daty), a następnie zagnieździł zawartość pod jego 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"
  }
}

Należy pamiętać, że Algolia ma limit 10 KB na rekord. Najlepszym sposobem na poradzenie sobie z tym jest skrócenie największych atrybutów. Nie martw się, nie ma to wpływu na trafność . Jeśli przegapisz drugą połowę artykułu, zwykle cała istotna treść jest już w pierwszej połowie.

Skonfiguruj konfigurację Algolii w panelu

Następnie przejdź do panelu i dodaj fr i en do searchableAttributes .

Szukaj

Możesz ograniczyć searchableAttributes w czasie zapytania z wywołaniem zwrotnym przekazanym do wyszukiwania

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

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

Stworzyłem cechę, aby osiągnąć coś podobnego . Może możesz zrobić coś podobnego, aby mieć łatwą w użyciu składnię, taką jak:

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

Po całym tym myśleniu naprawdę uważam, że jest to najmniej chwytliwy sposób wykorzystania Laravel Scout z ograniczeniami.

Daj mi znać, co myślisz :)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL LIKE z zasięgiem nie działa

  2. Uzupełnianie początku pola mysql INT zerami

  3. get_result() nie działa, nawet jeśli włączony jest mysqlnd

  4. Sumowanie zakresu dat bez zliczania nakładania się w mysql

  5. Skopiuj dane do nowej tabeli w MySQL