Maison > base de données > tutoriel mysql > 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
Libérer: 2024-11-06 14:09:02
original
711 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
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