MySQL - So erhalten Sie Suchergebnisse mit genauer Relevanz
Ich habe dieses Problem viele Male wiederholt, und ich habe nie wirklich eine richtige Antwort gefunden.
Ist es möglich, eine MySQL-Suche durchzuführen, die IST-genau sortierte Ergebnisse nach Relevanz liefert?
Ich versuche, ein Ajax-Suchformular zu erstellen, das Vorschläge macht, während der Benutzer diese in ein Eingabefeld eingibt, und habe keine angemessene Lösung dafür gefunden, wenn ich nur reine MySQL-Abfragen verwende. Ich weiß, dass Suchserver wie ElasticSearch verfügbar sind. Ich möchte wissen, wie dies nur mit einer unformatierten MySQL-Abfrage möglich ist.
Ich habe eine Tabelle mit Schulfächern. Es gibt weniger als 1200 Zeilen und dies wird sich nie ändern. Lassen Sie uns eine einfache Volltextsuche durchführen, bei der der Benutzer "Bio" eingibt.
Query ("Bio ...") - FULLTEXT BOOLEAN MODE
SELECT name, MATCH(name) AGAINST('bio*' IN BOOLEAN MODE) AS relevance
FROM subjects
WHERE MATCH(name) AGAINST('bio*' IN BOOLEAN MODE)
ORDER BY relevance DESC
LIMIT 10
Ergebniss
name | relevance
--------------------------------------------------------
Biomechanics, Biomaterials and Prosthetics | 1
Applied Biology | 1
Behavioural Biology | 1
Cell Biology | 1
Applied Cell Biology | 1
Developmental/Reproductive Biology | 1
Developmental Biology | 1
Reproductive Biology | 1
Environmental Biology | 1
Marine/Freshwater Biology | 1
Um zu zeigen, wie schlecht diese Ergebnisse sind, hier ein Vergleich mit einem einfachenLIKE
Abfrage, die alle relevanteren Ergebnisse anzeigt, die nicht angezeigt wurden:
Query ("Bio ...") - LIKE
SELECT id, name
WHERE name LIKE 'bio%'
ORDER BY name
Ergebniss
name | relevance
--------------------------------------------------------
Bio-organic Chemistry | 1
Biochemical Engineering | 1
Biodiversity | 1
Bioengineering | 1
Biogeography | 1
Biological Chemistry | 1
Biological Sciences | 1
Biology | 1
Biomechanics, Biomaterials and Prosthetics | 1
Biometry | 1
Und schon sehen Sie, wie viele Themen nicht vorgeschlagen werden, obwohl dies eher das ist, wonach der Benutzer suchen wird.
Das Problem mit der Verwendung vonLIKE
ist jedoch, wie man über mehrere Wörter und in der Mitte von Wörtern wie @ sucFULLTEXT
does.
Die grundlegende Reihenfolge, die ich implementieren möchte, ist etwa wie folgt:
Erste Wörter beginnend mit dem SuchbegriffZweites Wort beginnend mit dem SuchbegriffWörter, bei denen der Begriff nicht am Anfang der Wörter stehtAlles allgemein alphabetisch, wenn nicht weiter relevantSo ist meine Frage, wie man eine vernünftig sortierte Liste von Vorschlägen für den Benutzer mit einer MySQL-Suche über mehrere Wörter hinweg erhält?