Ich habe einige Artikel gelesen und Probleme , konnten jedoch keine befriedigende Lösung finden. Ich möchte verwandte Datensätze aus der Datenbank auswählen, wenn ein Benutzer ein Formular ausfüllt. Auf dieselbe Weise funktioniert die Funktionalität auf dieser Site, wenn Sie eine Frage stellen.
Betrachten Sie eine Datenbanktabelle mit den folgenden drei Datensätzen in der Spalte subject
Ich starte meine Suchanfrage mit dem Wort zoek
, damit ich die relevantesten Ergebnisse aus der Datenbank nach dem Begriff zoek
abfragen kann. Ich habe die folgende Frage gestellt:
Wenn ich diese Abfrage ausführen würde, hätte ich erwartet, dass alle Datensätze angezeigt werden und (wahrscheinlich weiß ich nicht, wie die Spezifität in MySQL funktioniert) ID 3, die oben angezeigt wird (weil genaues Wort übereinstimmt).
Stattdessen waren die Ergebnisse der Abfrage nur Zeile 2
und 3
mit genau der gleichen Punktzahl (0.031008131802082062).
Was muss ich in meiner Abfrage ändern, um den passenden Datensätzen zu entsprechen? Bedenken Sie auch, dass Benutzer Schlüsselwörter oder Sätze eingeben können.
Es gibt eine Lösung für Ihren Fall:
%Vor%Erwartetes Ergebnis:
%Vor% Wie von anderen empfohlen, unterstützen die FULLTEXT
-Indizes von MySQL keine führenden Platzhalter und können daher bei der Suche nach Suffixen nicht helfen.
Allerdings könnte der neue ngram-Volltext-Parser hilfreich sein :
Der integrierte MySQL-Volltext-Parser verwendet den Leerraum zwischen Wörtern als Trennzeichen, um zu bestimmen, wo Wörter beginnen und enden. Dies ist eine Einschränkung bei der Arbeit mit ideografischen Sprachen, die keine Worttrennzeichen verwenden. Um diese Einschränkung zu umgehen, bietet MySQL einen ngram-Volltext-Parser (...).
Ein ngram ist eine zusammenhängende Folge von n Zeichen aus einer gegebenen Textfolge. Der Ngram-Parser zerlegt eine Textsequenz in eine zusammenhängende Folge von n Zeichen.
Da ich diese Funktion noch nie benutzt habe, kann ich zu diesem Thema nicht weiterhelfen. Beachten Sie jedoch:
Da ein Ngram
FULLTEXT
Index nur Ngramme enthält und keine Informationen über den Anfang von Begriffen enthält, können Platzhaltersuchen unerwartete Ergebnisse liefern.
Versuchen Sie diese Abfragen für verschiedene Ergebnisse:
Wählen Sie alle Betreffzeilen aus, die mit dem Buchstaben "z" beginnen:
SELECT ID, Subject FROM table_name
WHERE Subject LIKE 'z%';
Wählen Sie alle Betreffenden aus, die mit dem Buchstaben "z" enden:
SELECT ID, Subject FROM table_name
WHERE Subject LIKE '%z';
Wählen Sie alle Themen aus, die das Muster "zoek" enthalten:
SELECT ID, Subject FROM table_name
WHERE Subject LIKE '%zoek%';
Entschuldigung ...
Die Mitte des Wortes (doorzoekbaar) ist, nach Definition von% FULLTEXT
von MySQL, nicht etwas, das gefunden wird. FULLTEXT
hat kein Konzept von "zusammengesetzten Substantiven", also wird es nicht versuchen, das Wort auseinander zu nehmen.
Die Definition eines "Wortes" in FULLTEXT
gibt "Strich" und "Raum" die gleiche Bedeutung - nämlich eine Wortgrenze. Also, zoek de...
und zoek-...
werden gleich gewichtet.
Sieh dir Solr, Lucene und andere "Fulltext-Lösungen" von Drittanbietern an. Sie können (oder können nicht) liefern, was Sie wollen.
zoek*
und +zoek*
, wenn mit IN BOOLEAN MODE
ausgeführt, wird zoekbaar
finden.
Tags und Links mysql