ホームページ  >  記事  >  データベース  >  Laravelで関連性に基づいた順序で複数の列にわたって複数のキーワードを検索する方法は?

Laravelで関連性に基づいた順序で複数の列にわたって複数のキーワードを検索する方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-06 14:09:02611ブラウズ

How to Search for Multiple Keywords Across Multiple Columns with Relevance-Based Ordering in Laravel?

Laravel: 関連性ベースの順序付けによる複数の列に対する複数のキーワードの検索

Laravel で、複数の列に対して複数のキーワードを考慮する検索を実装します。関連性を維持しながら、というのは難しい場合があります。この記事では、指定された列でのキーワードの出現頻度に基づいて検索結果が並べ替えられるという問題に対処します。

シナリオ:

検索バー入力として 3 つのキーワードが必要です。検索条件は次のとおりです。

  1. 両方の列 (meta_name と meta_description) に 3 つのキーワードすべてを含む行が最初に表示されます。
  2. 最初の 2 つのキーワードのみを含む行
  3. 記載された列の最初のキーワードのみを含む行が 3 番目に表示されます。

データベース クエリ:

望ましい結果を達成するには、データベース クエリで複数の OR 条件を組み合わせ、whereNotIn 関数を利用して前の条件で既にフェッチされた行を除外する必要があります。

<code class="php">$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'));</code>

Union and Ordering:

最後に、union 関数を使用して $all、$twoWords、$oneWord の結果がマージされ、順序付けされた検索結果が取得されます。

<code class="php">$posts = $all->union($twoWords)->union($oneWord)->get(); // check this first

# or

$posts = $all->union($twoWords)->union($oneWord)->skip($start)->take($this->rowperpage)->get();</code>

このアプローチにより、検索結果が順序付けされます。指定された条件に従って、指定された列の 3 つのキーワードをすべて含む行から開始します。

以上がLaravelで関連性に基づいた順序で複数の列にわたって複数のキーワードを検索する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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