Maison > base de données > tutoriel mysql > le corps du texte

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
Libérer: 2024-11-05 16:00:03
original
985 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!