Heim  >  Artikel  >  Datenbank  >  Wie implementiert man in Laravel eine Suchfunktion, die bei der Suche über mehrere Spalten mit mehreren Schlüsselwörtern die Relevanz priorisiert?

Wie implementiert man in Laravel eine Suchfunktion, die bei der Suche über mehrere Spalten mit mehreren Schlüsselwörtern die Relevanz priorisiert?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-05 16:00:03987Durchsuche

How to implement a search function in Laravel that prioritizes relevance when searching across multiple columns with multiple keywords?

Laravel: Suche mit mehreren Schlüsselwörtern über mehrere Spalten hinweg mit nach Relevanz geordneten Ergebnissen

In Laravel wird eine Suchfunktion implementiert, die Daten basierend auf findet Mehrere Schlüsselwörter in mehreren Spalten können eine Herausforderung sein, insbesondere wenn es um die Reihenfolge der Relevanz geht. Dieser umfassende Leitfaden befasst sich ausführlich mit diesem Problem und bietet eine Lösung, die einem strukturierten Ansatz folgt.

Datenbankstruktur

Die Datenbanktabelle umfasst zwei Spalten: meta_name und meta_description, wobei Die Suchbegriffe werden abgeglichen.

Suchkriterien

Die Suche hat spezifische Kriterien und priorisiert die Ergebnisse basierend auf dem Vorhandensein von Schlüsselwörtern in beiden Spalten. Zeilen, die alle drei Schlüsselwörter enthalten, erhalten die höchste Priorität, gefolgt von Zeilen mit nur den ersten beiden Schlüsselwörtern und zuletzt Zeilen mit nur dem ersten Schlüsselwort.

Paginierung

Die Suchergebnisse werden mithilfe der Paginierung dynamisch geladen, wobei neue Ergebnisse angehängt werden, wenn der Benutzer zum Ende der Seite scrollt.

Quellcode

Der folgende Codeausschnitt wird abgerufen die Suchergebnisse in der gewünschten Reihenfolge:

<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>

Endabfrage

Um die Ergebnisse zu kombinieren, verwenden wir die UnionAll-Methode:

<code class="php">$posts = $all->unionAll($twoWords)->unionAll($oneWord)->get(); // check this first
# or
$posts = $all->unionAll($twoWords)->unionAll($oneWord)->skip($start)->take($this->rowperpage)->get();</code>

Dieser Code ruft die Ergebnisse in der angegebenen Reihenfolge ab und priorisiert dabei die Relevanz. Für die Paginierung werden die Methoden „skip()“ und „take()“ verwendet, wobei $start die Anzahl der bereits angezeigten Ergebnisse darstellt. Schließlich ruft die Methode get() die Datensätze ab.

Das obige ist der detaillierte Inhalt vonWie implementiert man in Laravel eine Suchfunktion, die bei der Suche über mehrere Spalten mit mehreren Schlüsselwörtern die Relevanz priorisiert?. 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