MySQL-Volltextsuche: Relevanz und Spaltenpriorisierung optimieren
Bei der Durchführung von Volltextsuchen über mehrere Tabellenspalten hinweg ist es oft wünschenswert, die Reihenfolge zu bestimmen Ergebnisse nach Relevanz. Die Funktion MATCH() AGAINST() von MySQL bietet eine effiziente Möglichkeit, dies zu erreichen.
Es gibt jedoch Situationen, in denen es entscheidend ist, die Relevanz innerhalb bestimmter Spalten zu priorisieren. Angenommen, wir haben eine Tabelle mit Seiten mit Kopf- und Körperspalten, in der wir den in der Kopfspalte gefundenen Übereinstimmungen eine höhere Priorität einräumen möchten.
Lösung: Einbeziehung der spaltenspezifischen Relevanz
Um dieser Anforderung gerecht zu werden, können wir eine zusätzliche MATCH()-Klausel nutzen, um die Relevanz separat für die Kopfspalte zu berechnen. Indem wir dies mit der Gesamtrelevanz kombinieren, können wir Ergebnisse priorisieren, die sowohl den Gesamtsuchkriterien als auch der angegebenen Spalte entsprechen.
SELECT pages.*, MATCH(head, body) AGAINST('some words') AS relevance, MATCH(head) AGAINST('some words') AS head_relevance FROM pages WHERE MATCH(head, body) AGAINST('some words') ORDER BY head_relevance DESC, relevance DESC
In dieser Abfrage berechnen wir sowohl die Gesamtrelevanz (Relevanz) als auch die Kopfspalte. spezifische Relevanz (head_relevance). Indem wir die Ergebnisse zuerst nach Head_Relevance in absteigender Reihenfolge (DESC) und dann nach Relevanz, ebenfalls in absteigender Reihenfolge, ordnen, priorisieren wir effektiv Übereinstimmungen, die in der Head-Spalte gefunden werden.
Bonus: Zählen des Vorkommens von Suchbegriffen
Während der obige Ansatz die Spaltenpriorisierung verbessert, liefert er keine Zählung der Vorkommen von Suchbegriffen innerhalb der angegebenen Spalten. Um dies zu erreichen, können wir die Funktionen FULLTEXT() und LENGTH() verwenden:
... SELECT pages.*, MATCH(head, body) AGAINST('some words') AS relevance, MATCH(head) AGAINST('some words') AS head_relevance, LENGTH(head) - LENGTH(REPLACE(head, 'some words', '')) AS head_count, LENGTH(body) - LENGTH(REPLACE(body, 'some words', '')) AS body_count FROM pages ...
Dies erweitert die vorherige Abfrage, um die Anzahl der Vorkommen von Suchbegriffen sowohl im Kopf (head_count) als auch im Körper (body_count) zu berechnen. Spalten.
Zusätzliche Optionen: Postgres und Gewichtung
Wenn für Ihr Projekt geeignet, Postgres bietet erweiterte Funktionen, die eine genauere Kontrolle über das Relevanzranking ermöglichen. Seine Suchfunktionen unterstützen die Gewichtung bestimmter Begriffe oder Operatoren und ermöglichen so eine bessere Anpassung der Suchergebnisse.
Das obige ist der detaillierte Inhalt vonWie kann ich die Relevanz in der MySQL-Volltextsuche über mehrere Spalten hinweg priorisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!