Maison > Article > base de données > Comment rechercher plusieurs mots-clés sur plusieurs colonnes avec un classement basé sur la pertinence dans 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 :
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!