ホームページ  >  記事  >  データベース  >  複数のキーワードで複数の列を検索するときに関連性を優先する検索機能をLaravelに実装するにはどうすればよいですか?

複数のキーワードで複数の列を検索するときに関連性を優先する検索機能をLaravelに実装するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-05 16:00:03987ブラウズ

How to implement a search function in Laravel that prioritizes relevance when searching across multiple columns with multiple keywords?

Laravel: 関連性順の結果で複数の列にわたる複数のキーワードを使用した検索

Laravel では、以下に基づいてデータを検索する検索関数を実装します。複数の列に複数のキーワードを含めるのは、特に関連性の順序が関係する場合に困難になる可能性があります。この包括的なガイドでは、この問題を詳細に取り上げ、構造化されたアプローチに従った解決策を提供します。

データベース構造

データベース テーブルには、meta_name と meta_description という 2 つの列が含まれます。検索キーワードが一致します。

検索基準

検索には特定の基準があり、両方の列のキーワードの存在に基づいて結果に優先順位が付けられます。 3 つのキーワードをすべて含む行が最も優先され、次に最初の 2 つのキーワードのみが含まれる行、最後に最初のキーワードのみが含まれる行になります。

ページネーション

検索結果はページネーションを使用して動的に読み込まれ、ユーザーがページの一番下までスクロールすると新しい結果が追加されます。

ソース コード

次のコード スニペットは、次のコードを取得します。検索結果を希望の順序で表示します:

<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>

最終クエリ

結果を結合するには、unionAll メソッドを使用します:

<code class="php">$posts = $all->unionAll($twoWords)->unionAll($oneWord)->get(); // check this first
# or
$posts = $all->unionAll($twoWords)->unionAll($oneWord)->skip($start)->take($this->rowperpage)->get();</code>

このコードは、関連性を優先して、指定された順序で結果を取得します。 Skip() メソッドと take() メソッドはページネーションに使用されます。$start はすでに表示されている結果の数を表します。最後に、get() メソッドはレコードを取得します。

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

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