Maison > Article > base de données > Comment implémenter une recherche par pertinence ordonnée sur plusieurs colonnes dans 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!