Ich kann die Volltextsuche nicht so ausführen, wie ich es möchte, und ich verstehe die Unterschiede in den Ergebnislisten nicht.
Beispielanweisungen:
SELECT `meldungstext`
FROM `artikel`
WHERE `meldungstext` LIKE '%punkt%'
gibt 92 Zeilen zurück. Ich erhalte Zeilen, die Übereinstimmungen haben, wie zum Beispiel "Ereignisse", "Zwei-Punkte-Vorsprung" und "Treffpunkt" in der Spalte meldungstext.
Ich habe einen Volltextindex für die Spalte "meldungstext" gesetzt und Folgendes versucht:
SELECT `meldungstext`
FROM `artikel`
WHERE MATCH (`meldungstext`)
AGAINST ('*punkt*')
Dies gibt nur 8 Zeilen zurück. Ich erhalte nur Zeilen, die mit "Punkt" selbst übereinstimmen, oder Wörter, die meiner Meinung nach als "Punkt" wie in "i-Punkt" verwendet werden.
Ich habe dann den Booleschen Modus ausprobiert:
SELECT `meldungstext`
FROM `artikel`
WHERE MATCH (`meldungstext`)
AGAINST ('*punkt*' IN BOOLEAN MODE)
gibt 44 Zeilen zurück. Ich erhalte Zeilen mit "Zwei-Punkte-Vorsprung" oder "Treffpunkt" in der Spalte meldungstext, aber nicht solche mit "bestimmten".
Warum passiert das und wie kann ich eine "voll funktionsfähige" Volltextsuche festlegen, um zu verhindern, dass LIKE '%%' in der where-Klausel verwendet wird?
quelle
Antworten:
Ich habe die drei Zeichenfolgen in Ihrer Frage genommen und sie einer Tabelle hinzugefügt, plus drei weitere Zeichenfolgen mit
pankt
anstelle vonpunkt
.Folgendes wurde mit MySQL 5.5.12 für Windows ausgeführt
Ich habe diese Abfragen mit drei verschiedenen Ansätzen für die Tabelle ausgeführt
MATCH ... AGAINST
LOCATE
wie in der LOCATE- FunktionLIKE
Bitte beachten Sie die Unterschiede
Alle PunktMatch-Werte sollten 3 1 und 3 0 sein.
Jetzt schau mir zu, wie ich sie wie gewohnt abfrage
OK mit MATCH .. GEGEN mit Punkt funktioniert nicht. Was ist mit pankt ???
Lassen Sie uns meine große
GROUP BY
Abfrage gegen pankt ausführenDies ist auch falsch, weil ich 3 0er und 3 1er für PanktMatch sehen sollte.
Ich habe etwas anderes versucht
Ich habe pankt ein Pluszeichen hinzugefügt und unterschiedliche Ergebnisse erzielt. Welche 2 und nicht 3 ???
Beachten Sie gemäß der MySQL-Dokumentation , was darin über das Platzhalterzeichen steht:
Auf dieser Grundlage gilt das Platzhalterzeichen für die Rückseite von Token und nicht für die Vorderseite. Vor diesem Hintergrund muss die Ausgabe korrekt sein, da 2 der 3 Punkt-Start-Token vorhanden sind. Gleiche Geschichte mit pankt. Dies erklärt zumindest, warum 2 von 3 und warum weniger Zeilen.
quelle
COUNT(IF(MATCH
Abfrage "Pankten" zurückgegeben hat .COUNT(…)
in den Spalten PunktMatch und PanktMatch?COUNT(IF(MATCH (
Meldungstext) AGAINST ('*pankt*' IN BOOLEAN MODE),1,0))
wird immer zur Folge1
, weil es das Zählen ist1
oder0
das Ergebnis aus derIF(…)
.