Maison  >  Article  >  base de données  >  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
Mary-Kate Olsenoriginal
2024-11-05 18:26:02746parcourir

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();

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();

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!

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