Heim  >  Artikel  >  Datenbank  >  Wie implementiert man in Laravel eine nach Relevanz geordnete Suche über mehrere Spalten hinweg?

Wie implementiert man in Laravel eine nach Relevanz geordnete Suche über mehrere Spalten hinweg?

Barbara Streisand
Barbara StreisandOriginal
2024-11-05 21:55:02130Durchsuche

How to Implement a Relevance-Ordered Search Across Multiple Columns in Laravel?

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:

  1. Zeilen, die alle drei Schlüsselwörter in meta_name oder enthalten meta_description
  2. Zeilen, die nur die ersten beiden Schlüsselwörter in meta_name oder meta_description enthalten
  3. Zeilen, die nur das erste Schlüsselwort in meta_name oder meta_description enthalten

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn