SUCHWORT_anderesWort mit match() im mySQL suchen
Andreas-Lindig
- datenbank
Hallo Forum,
Ich bin gerade dabei meine eigene Forums-Suche weitgehend Sonderzeichenresistent zu machen und jetzt dies: nimm an, Du suchst das Wort SUCHWORT. In einem Posting kommt es so vor: SUCHWORT_andereswort. Wenn ich das nun in mySQL so suche
select * from tabelle
where match(suchspalte) against ('SUCHWORT')
dann wird es nicht gefunden, weil _ und ' von match() auch als zulässige Zeichen in einem Wort betrachtet werden. SUCHWORT wird also als Teil eines Wortes nicht erkannt. Ebenso passiert es z.B. mit Onkel Tom's Hütte, wobei Tom mein SUCHWORT sein soll.
URGHHHMPF!
Nun könnte ich natürlich mit RLIKE suchen und das funktioniert auch, nur: Ich kann meinem PHP-Script nicht mitteilen, wann es denn mit RLIKE und wann mit match() suchen soll. Ich will natürlich sooft wie möglich mit match() suchen, um Resourcen zu sparen, aber ob mein SUCHWORT nun durch _ bzw. ' von einem zweiten Teilwort getrennt wird kann ich ja frühestens _nach_ der Suche rausfinden.
Wie kann ich also SUCHWORT_andereswort finden ohne standardmäßig mit RLIKE oder LIKE zu suchen?
Gruß, Andreas
Hallo,
Ich bin gerade dabei meine eigene Forums-Suche weitgehend Sonderzeichenresistent zu machen und jetzt dies: nimm an, Du suchst das Wort SUCHWORT. In einem Posting kommt es so vor: SUCHWORT_andereswort. Wenn ich das nun in mySQL so suche
select * from tabelle
where match(suchspalte) against ('SUCHWORT')dann wird es nicht gefunden,
Wie kann ich also SUCHWORT_andereswort finden ohne standardmäßig mit RLIKE oder LIKE zu suchen?
Das kommt auf die MySQL-Version an. Seit 4.0.1 geht:
SELECT suchspalte FROM tabelle
WHERE MATCH(suchspalte) AGAINST ('SUCHWORT*' IN BOOLEAN MODE);
http://www.mysql.com/doc/en/Fulltext_Search.html
Warum SELECT * schlecht ist, weißt Du hoffentlich?
viele Grüße
Axel
Hallo Axel,
Das kommt auf die MySQL-Version an. Seit 4.0.1 geht:
SELECT suchspalte FROM tabelle
WHERE MATCH(suchspalte) AGAINST ('SUCHWORT*' IN BOOLEAN MODE);
dankeschön, erstmal lesen.
Warum SELECT * schlecht ist, weißt Du hoffentlich?
nö. War zwar nur'n Beispiel, ich suche in echt nur
SELECT ID...
aber interessieren tut es mich trotzdem: warum?
Gruß, Andreas
Hallo Andreas,
Warum SELECT * schlecht ist, weißt Du hoffentlich?
nö. War zwar nur'n Beispiel, ich suche in echt nurSELECT ID...
aber interessieren tut es mich trotzdem: warum?
http://www.dclp-faq.de/q/q-sql-select.html
viele Grüße
Axel
Das kommt auf die MySQL-Version an. Seit 4.0.1 geht:
SELECT suchspalte FROM tabelle
WHERE MATCH(suchspalte) AGAINST ('SUCHWORT*' IN BOOLEAN MODE);
wenn ich das richtig verstehe und meine Tests richtig sind, kann ich damit nur SUCHWORT_... suchen, aber nicht ..._SUCHWORT gell? Weißt Du dafür auch noch einen Rat?
Gruß, Andreas
Hallo,
SELECT suchspalte FROM tabelle
WHERE MATCH(suchspalte) AGAINST ('SUCHWORT*' IN BOOLEAN MODE);wenn ich das richtig verstehe und meine Tests richtig sind, kann ich damit nur SUCHWORT_... suchen, aber nicht ..._SUCHWORT gell?
Ja. Fulltext-Suche basiert auf einem Fulltext-Index. Bei Dir müsste das in der Tabelle "tabelle" der Index FULLTEXT(suchspalte) sein.
Wie ein Index funktioniert weißt Du?
Dann ist Dir auch klar, dass _kein_ Index soetwas wie: *SUCHWORT oder *SUCHWORT* abdecken kann. Ein Index kann _nur_ SUCHWORT* abdecken.
Weißt Du dafür auch noch einen Rat?
Ja.
SELECT suchspalte FROM tabelle WHERE suchspalte LIKE '%SUCHWORT%';
Performanter geht _das_, meiner Meinung nach, nicht.
viele Grüße
Axel
Wie ein Index funktioniert weißt Du?
ja, in etwa...
Dann ist Dir auch klar, dass _kein_ Index soetwas wie: *SUCHWORT oder *SUCHWORT* abdecken kann.
okeeokee...;)
SELECT suchspalte FROM tabelle WHERE suchspalte LIKE '%SUCHWORT%';
Performanter geht _das_, meiner Meinung nach, nicht.
schönschön, nur - wie ich eingans schon schrieb - Ich kann nicht voraussehen, ob ein SUCHWORT in dieser Stellung: ..._SUCHWORT vorkommt. Also müßte ich in dieser Variante _von vornherein_ mit LIKE oder RLIKE suchen. Aber ich will das ja möglichst vermeiden.
Gruß, Andreas