ホームページ  >  記事  >  データベース  >  Laravelで複数の列にわたる関連性順検索を実装するにはどうすればよいですか?

Laravelで複数の列にわたる関連性順検索を実装するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-05 21:55:02130ブラウズ

How to Implement a Relevance-Ordered Search Across Multiple Columns in Laravel?

Laravel: 関連性順に複数の列に対して複数のキーワードを使用して検索

問題:

3 つの入力キーワードに基づいて複数の列からデータを取得する検索を Laravel に実装します。検索結果は関連性の順に並べられ、3 つのキーワードすべてを含む行が最も高くランク付けされ、次に最初の 2 つのキーワードのみを含む行、最後に最初のキーワードのみを含む行になります。

解決策:

希望の順序で行を見つけるには、まず、meta_name 列または meta_description 列の 3 つのキーワードすべてに一致する投稿をクエリします。このクエリは $all 変数に入力されます。

次に、同じ列内の最初の 2 つのキーワードのみに一致する投稿をクエリします。このクエリは $twoWords 変数に入力され、$all ですでに見つかった投稿の ID を除外します。

最後に、どちらかの列の最初のキーワードのみに一致する投稿をクエリします。これも $all で見つかった ID を除外します。そして$twoWords。このクエリは $oneWord 変数に入ります。

最終的な順序付けされた検索結果を取得するには、3 つのクエリ結果 ($all、$twoWords、$oneWord) をすべて結合し、それを $posts 変数に割り当てます。

検索結果を取得するコードは次のとおりです。

$word1 = 'word1';
$word2 = 'word2';
$word3 = 'word3';

$all = DB::table('posts')
    ->where('meta_name', 'like', "%{$word1}%")
    ->where('meta_name', 'like', "%{$word2}%")
    ->where('meta_name', 'like', "%{$word3}%")
    ->orWhere(function($query) use ($word1, $word2, $word3) {
        $query->where('meta_description', 'like', "%{$word1}%")
              ->where('meta_description', 'like', "%{$word2}%")
              ->where('meta_description', 'like', "%{$word3}%");
    });

$twoWords = DB::table('posts')
    ->where('meta_name', 'like', "%{$word1}%")
    ->where('meta_name', 'like', "%{$word2}%")
    ->orWhere(function($query) use ($word1, $word2) {
        $query->where('meta_description', 'like', "%{$word1}%")
              ->where('meta_description', 'like', "%{$word2}%");
    })
    ->whereNotIn('id', $all->pluck('id'));

$oneWord = DB::table('posts')
    ->where('meta_name', 'like', "%{$word1}%")
    ->orWhere('meta_description', 'like', "%{$word1}%")
    ->whereNotIn('id', $all->pluck('id'))
    ->whereNotIn('id', $twoWords->pluck('id'));

$posts = $all->union($twoWords)->union($oneWord)->get();

検索結果は次のように順序付けされます。

  1. meta_name またはmeta_description
  2. meta_name または meta_description の最初の 2 つのキーワードのみを含む行
  3. meta_name または meta_description の最初のキーワードのみを含む行

以上がLaravelで複数の列にわたる関連性順検索を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。