私はそれについてよく考えました。モデルごとに1つのインデックスを使用し、::search()
に渡すことができるコールバックを利用するのが最善の方法だと思います。
インデックスデータ
まず、toSearchableArray()
を使用する必要があります データを準備します。不要な属性(日付など)をすべて設定解除してから、コンテンツを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"
}
}
アルゴリアでは、レコードごとに10KBの制限があることに注意してください。これを処理する最良の方法は、最大の属性を切り捨てることです。心配しないでください。関連性には影響しません 。記事の後半を見逃した場合、通常、関連するすべてのコンテンツはすでに最初の部分にあります。
ダッシュボードでAlgolia構成を設定
次に、ダッシュボードに移動して、fr
を追加します およびen
searchableAttributes
に 。
検索
searchableAttributes
を制限できます 検索に渡されたコールバックを使用したクエリ時
$lang = 'en';
Model::search($query, function ($algolia, $query, $options) use ($lang) {
$options = array_merge($options, [
'restrictSearchableAttributes' => [$lang],
]);
return $algolia->search($query, $options);
});
同様のことを達成するための特性 を作成しました 。次のような使いやすい構文を使用するために、同様のことを実行できるかもしれません。
Model::searchLang($lang, $query);
結局のところ、制約でLaravelScoutを使用するのは最もハッキーな方法ではないと思います。
ご意見をお聞かせください:)