Laravel: Suche mit mehreren Schlüsselwörtern in mehreren Spalten, geordnet nach Relevanz
Problem:
Implementieren Sie eine Suche in Laravel, die Daten aus mehreren Spalten basierend auf drei Eingabeschlüsselwörtern abruft. Die Suchergebnisse sollten nach Relevanz geordnet werden, wobei Zeilen mit allen drei Schlüsselwörtern am höchsten rangieren, gefolgt von Zeilen, die nur die ersten beiden Schlüsselwörter enthalten, und schließlich Zeilen, die nur das erste Schlüsselwort enthalten.
Lösung:
Um Zeilen in der gewünschten Reihenfolge zu finden, beginnen wir mit der Abfrage nach Beiträgen, die allen drei Schlüsselwörtern in den Spalten „meta_name“ oder „meta_description“ entsprechen. Diese Abfrage geht in die Variable $all.
Als nächstes fragen wir nach Beiträgen ab, die nur mit den ersten beiden Schlüsselwörtern in denselben Spalten übereinstimmen. Diese Abfrage geht in die Variable $twoWords und wir schließen die IDs von Beiträgen aus, die bereits in $all gefunden wurden.
Schließlich fragen wir nach Beiträgen ab, die nur mit dem ersten Schlüsselwort in einer der Spalten übereinstimmen, und schließen wiederum IDs aus, die in $all gefunden wurden und $twoWords. Diese Abfrage geht in die Variable $oneWord.
Um die endgültigen geordneten Suchergebnisse zu erhalten, vereinigen wir alle drei Abfrageergebnisse ($all, $twoWords, $oneWord) und weisen sie der Variablen $posts zu.
Der Code zum Abrufen der Suchergebnisse lautet wie folgt:
$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();
Die Suchergebnisse sind nun wie folgt sortiert:
Das obige ist der detaillierte Inhalt vonWie implementiert man in Laravel eine nach Relevanz geordnete Suche über mehrere Spalten hinweg?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!