sql >> データベース >  >> RDS >> Mysql

LaravelScoutとAlgoliaを使用した多言語インデックス

    私はそれについてよく考えました。モデルごとに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を使用するのは最もハッキーな方法ではないと思います。

    ご意見をお聞かせください:)




    1. スペースと特殊文字を含むURLのベストプラクティス

    2. mySQLクエリ:UNIONで挿入​​する方法は?

    3. SQL計算でのエイリアスの使用

    4. LIKEを使用したMYSQLクエリで機能しない2つの単語と空白