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();
検索結果は次のように順序付けされます。
以上がLaravelで複数の列にわたる関連性順検索を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。