sql >> Databasteknik >  >> RDS >> Mysql

Flerspråkiga index med Laravel Scout och Algolia

Jag tänkte mycket på det och jag tror att det bästa sättet skulle vara att använda 1 index per modell och ta del av återuppringningen du kan skicka till ::search()

Indexering av data

Först måste du använda toSearchableArray() för att förbereda uppgifterna. Jag skulle avaktivera alla onödiga attribut (som datum) och sedan kapsla innehåll under dess 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"
  }
}

Observera att Algolia har en gräns på 10 KB per post. Det bästa sättet att hantera detta är att trunkera dina största attribut. Oroa dig inte, det påverkar inte relevansen . Om du missar den andra halvan av din artikel finns vanligtvis allt relevant innehåll redan i den första häftet.

Konfigurera Algolia-konfigurationen i instrumentpanelen

Gå sedan till din instrumentpanel och lägg till fr och en till searchableAttributes .

Sök

Du kan begränsa searchableAttributes vid frågetid med en återuppringning som skickades till sökningen

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

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

Jag skapade en egenskap för att uppnå något liknande . Kanske kan du göra något liknande, för att få en lättanvänd syntax som:

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

Efter allt tänkande tycker jag verkligen att det är det minst hackiga sättet att använda Laravel Scout med dina begränsningar.

Låt mig veta vad du tycker :)




  1. Något fel med Hibernate DB-anslutningspooler c3p0

  2. Gillar du inte databasutlösare? Du vet bara inte hur man arbetar med dem!

  3. Hur kan jag sortera en kolumn "Versionsnummer" allmänt med hjälp av en SQL Server-fråga

  4. Hur FROM_UNIXTIME() fungerar i MariaDB