Maison  >  Article  >  base de données  >  Comment rechercher plusieurs mots-clés sur plusieurs colonnes avec un classement basé sur la pertinence dans Laravel ?

Comment rechercher plusieurs mots-clés sur plusieurs colonnes avec un classement basé sur la pertinence dans Laravel ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-06 14:09:02610parcourir

How to Search for Multiple Keywords Across Multiple Columns with Relevance-Based Ordering in Laravel?

Laravel : recherche de plusieurs mots-clés sur plusieurs colonnes avec un classement basé sur la pertinence

Dans Laravel, implémentation d'une recherche qui prend en compte plusieurs mots-clés dans plusieurs colonnes tout en maintenant la pertinence peut être un défi. Cet article résout un tel problème, où les résultats de la recherche sont classés en fonction de la fréquence d'apparition des mots-clés dans les colonnes spécifiées.

Scénario :

La barre de recherche nécessite trois mots-clés en entrée et les critères de recherche sont :

  1. Les lignes contenant les trois mots-clés dans les deux colonnes (meta_name et meta_description) viennent en premier.
  2. Les lignes contenant uniquement les deux premiers mots-clés dans les colonnes mentionnées viennent en deuxième position.
  3. Les lignes contenant uniquement le premier mot-clé dans les colonnes mentionnées viennent en troisième.

Requête de base de données :

Pour obtenir le résultat souhaité, la requête de base de données doit combiner plusieurs conditions OU et utiliser la fonction WhereNotIn pour exclure les lignes qui ont déjà été récupérées dans les conditions précédentes.

<code class="php">$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'));</code>

Union et commande :

Enfin, les résultats $all, $twoWords et $oneWord sont fusionnés à l'aide de la fonction union pour obtenir les résultats de recherche ordonnés.

<code class="php">$posts = $all->union($twoWords)->union($oneWord)->get(); // check this first

# or

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

Cette approche garantit que les résultats de recherche sont ordonnés. selon les critères spécifiés, en commençant par les lignes contenant les trois mots-clés dans les colonnes spécifiées.

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