Maison  >  Article  >  base de données  >  Comment implémenter une recherche pertinente dans Laravel avec plusieurs mots-clés ?

Comment implémenter une recherche pertinente dans Laravel avec plusieurs mots-clés ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-08 06:43:01350parcourir

How to Implement a Relevant Search in Laravel with Multiple Keywords?

Recherche Laravel avec plusieurs mots-clés et tri par pertinence

Introduction

Cet article aborde un sujet commun défi dans le développement de Laravel : implémenter une fonction de recherche qui intègre plusieurs mots-clés dans plusieurs colonnes de base de données. Les résultats de la recherche doivent être classés en fonction de leur pertinence, en tenant compte de la présence et de l'ordre des mots-clés spécifiés.

Énoncé du problème

Un utilisateur tente d'implémenter un moteur de recherche dans Laravel où plusieurs mots-clés sont saisis dans une barre de recherche et les résultats sont affichés par ordre de pertinence. Deux colonnes spécifiques, meta_name et meta_description, doivent être interrogées. Les critères de recherche sont les suivants :

  • Les lignes contenant les trois mots-clés dans les deux colonnes doivent être classées en priorité.
  • Les lignes contenant les deux premiers mots-clés uniquement doivent être classées en deuxième position.
  • Les lignes contenant uniquement le premier mot-clé doivent être classées troisième.

Solution

Pour réaliser cet ordre, trois requêtes de base de données distinctes sont construites :

$all = DB::table('posts')
    ->where('meta_name', 'like', ... /* %word1% %word2% %word3% */)
    ->orWhere('meta_description', 'like', ... /* %word1% %word2% %word3% */);

$twoWords = DB::table('posts')
    ->where('meta_name', 'like', ... /* %word1% %word2% */)
    ->orWhere('meta_description', 'like', ... /* %word1% %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'));

Union et Commande

Enfin, les trois ensembles de résultats sont combinés en utilisant union :

$posts = $all->union($twoWords)->union($oneWord)->skip($start)->take($this->rowperpage)->get();

Ce processus garantit que les lignes correspondant aux critères spécifiés sont récupérées dans l'ordre de pertinence souhaité.

Pagination et chargement asynchrone

Pour implémenter la pagination de chargement sur défilement, une méthode de saut et de prise peut être utilisée pour ajouter de nouveaux résultats au fur et à mesure que l'utilisateur fait défiler. Lorsqu'il n'y a plus de données à afficher, un message peut être renvoyé.

Conclusion

Grâce à la solution fournie, la fonction de recherche récupérera des résultats pertinents en fonction de plusieurs mots-clés et leur ordre d'apparition dans les colonnes spécifiées. Les résultats seront affichés sous forme de chargement par défilement, offrant une expérience utilisateur transparente.

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