Maison  >  Article  >  base de données  >  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
Barbara Streisandoriginal
2024-11-05 21:55:02132parcourir

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

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