Maison  >  Article  >  base de données  >  Comment implémenter une fonction de recherche dans Laravel qui donne la priorité à la pertinence lors d'une recherche sur plusieurs colonnes avec plusieurs mots-clés ?

Comment implémenter une fonction de recherche dans Laravel qui donne la priorité à la pertinence lors d'une recherche sur plusieurs colonnes avec plusieurs mots-clés ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-05 16:00:03987parcourir

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

Laravel : recherche à l'aide de plusieurs mots-clés dans plusieurs colonnes avec des résultats classés par pertinence

Dans Laravel, implémentation d'une fonction de recherche qui recherche des données en fonction de plusieurs mots-clés dans plusieurs colonnes peuvent être difficiles, surtout lorsque l'ordre de pertinence est impliqué. Ce guide complet aborde ce problème en détail, en fournissant une solution qui suit une approche structurée.

Structure de la base de données

La table de la base de données comporte deux colonnes : méta_name et méta_description, où les mots-clés de recherche correspondront.

Critères de recherche

Le la recherche a des critères spécifiques, priorisant les résultats en fonction de la présence de mots-clés dans les deux colonnes. Les lignes contenant les trois mots-clés ont la priorité la plus élevée, suivies par les lignes contenant uniquement les deux premiers mots-clés et enfin, les lignes contenant uniquement le premier mot-clé.

Pagination

Le les résultats de la recherche seront chargés dynamiquement à l'aide de la pagination, les nouveaux résultats étant ajoutés lorsque l'utilisateur fait défiler vers le bas de la page. page.

Code source

L'extrait de code suivant récupère les résultats de la recherche dans l'ordre souhaité :

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

Requête finale

Pour combiner les résultats, nous utilisons l'unionAll méthode :

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

Ce code récupère les résultats dans l'ordre spécifié, en donnant la priorité à la pertinence. Les méthodes skip() et take() sont utilisées pour la pagination, où $start représente le nombre de résultats déjà affichés. Enfin, la méthode get() récupère les enregistrements.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn