Maison > base de données > tutoriel mysql > Comment implémenter une recherche par pertinence ordonnée sur plusieurs colonnes dans Laravel ?

Comment implémenter une recherche par pertinence ordonnée sur plusieurs colonnes dans Laravel ?

Mary-Kate Olsen
Libérer: 2024-11-05 18:26:02
original
831 Les gens l'ont consulté

How to Implement Ordered Relevance Search Across Multiple Columns in Laravel?

Recherche de plusieurs mots-clés sur plusieurs colonnes avec une pertinence ordonnée dans Laravel

La mise en œuvre d'une fonctionnalité de recherche impliquant plusieurs mots-clés sur plusieurs colonnes de base de données peut être difficile, en particulier lorsque les résultats doivent être classés en fonction de leur pertinence. Dans Laravel, il existe plusieurs approches pour résoudre ce problème.

Approche utilisant des requêtes de base de données

Une façon de résoudre ce problème consiste à construire plusieurs requêtes de base de données pour récupérer les résultats en fonction de critères précis. Voici une implémentation possible :

$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();
Copier après la connexion

Cette approche filtre les résultats en fonction de la présence des trois mots-clés, uniquement des deux premiers mots-clés, puis uniquement du premier mot-clé. Enfin, il combine les résultats à l'aide de l'opérateur union.

Considérations supplémentaires pour la pagination

Pour implémenter la fonctionnalité de chargement sur défilement, vous pouvez incorporer des requêtes JavaScript et AJAX. Lorsque l'utilisateur fait défiler vers le bas de la page, une requête AJAX peut être envoyée pour récupérer l'ensemble de résultats suivant. Les méthodes skip() et take() de Query Builder peuvent être utilisées pour spécifier le décalage et la limite des enregistrements à récupérer.

// Retrieve the specified number of results after the last loaded result
$start = $request->get('start');//how many results have already been shown

$records = Post::select('*')
                ->skip($start)
                ->take($this->rowperpage) // $this->rowperpage= 4 e.g.
                ->get();
Copier après la connexion

N'oubliez pas de gérer le cas où il n'y a plus de résultats disponibles à faire défiler.

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