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

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

Barbara Streisand
Libérer: 2024-11-05 21:55:02
original
277 Les gens l'ont consulté

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

Laravel : recherche avec plusieurs mots-clés sur plusieurs colonnes, classées par pertinence

Problème :

Implémentez une recherche dans Laravel qui récupère les données de plusieurs colonnes en fonction de trois mots-clés d'entrée. Les résultats de la recherche doivent être classés par pertinence, avec des lignes contenant les trois mots-clés les mieux classés, suivies de lignes contenant uniquement les deux premiers mots-clés et enfin de lignes contenant uniquement le premier mot-clé.

Solution :

Pour trouver les lignes dans l'ordre souhaité, nous commençons par rechercher les publications correspondant aux trois mots-clés dans les colonnes meta_name ou meta_description. Cette requête va dans la variable $all.

Ensuite, nous recherchons les publications correspondant uniquement aux deux premiers mots-clés dans les mêmes colonnes. Cette requête va dans la variable $twoWords et nous excluons les identifiants des publications déjà trouvées dans $all.

Enfin, nous recherchons les publications correspondant uniquement au premier mot-clé de l'une ou l'autre colonne, en excluant encore une fois les identifiants trouvés dans $all. et $twoWords. Cette requête va dans la variable $oneWord.

Pour obtenir les résultats de recherche ordonnés finaux, nous réunissons les trois résultats de la requête ($all, $twoWords, $oneWord) et les attribuons à la variable $posts.

Le code pour récupérer les résultats de la recherche est le suivant :

$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

Les résultats de la recherche sont désormais classés comme suit :

  1. Lignes contenant les trois mots-clés dans meta_name ou meta_description
  2. Lignes contenant uniquement les deux premiers mots-clés dans meta_name ou meta_description
  3. Lignes contenant uniquement le premier mot-clé dans meta_name ou meta_description

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 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