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 relevant

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

Antworten auf die Frage(10)

Ihre Antwort auf die Frage