FULLTEXT-Suche nach abcd$efg
mic
- datenbank
hi,
ich habe ein mysql-abfrage nach dem muster:
abcd$efgh
SELECT id FROM tabelle WHERE MATCH ( spalte1, spalte2, spalte3 ) AGAINST ( abcd$efg' IN BOOLEAN MODE );
das problem ist, dass sql abcd$efg scheinbar in abcd efgh umwandelt und somit nach abcd ODER efg sucht, was mir gar nicht hilft. gibt man "abcd$efg" erhalt somit nur die datensaätze in denen abcd vorkommt weil egf ja, weil < 4 buchstaben, stopword ist.
weiss jemand ein lösong wie man nach einem string suchen kann der ein sonderzeichen $, § etc. enthält?
danke für die anstrengungen
mic
yo,
SELECT id FROM tabelle WHERE MATCH ( spalte1, spalte2, spalte3 ) AGAINST ( abcd$efg' IN BOOLEAN MODE );
das fehlende erste ' des strings ist nur ein tippfehler und du benutzt nicht zufällig php, wo das $ als variable erkannt wird ?
Ilja
das fehlende ' war grad nur ein tippfehler hier im forum. der $ hat nichts mmit php zu tun. das ist der befehl den ich direkt so in die db gebe:
SELECT id FROM tabelle WHERE MATCH ( spalte1, spalte2, spalte3 ) AGAINST ( 'abcd$efg' IN BOOLEAN MODE );
außerdem passiert das selbe wenn ic anstatt $ ein § mache...
mic
yo,
$ ist meiner ansicht nach kein sonderzeichen bei mysql, um so mehr verwundert mich diese sonderbehandlung des zeichens. bei regulären ausdrücken kennzeichnet das $ das ende eines strings, vielleicht kommt er damit durcheinander, aber alles nur eine vermutung von mir. deshalb versuch einfach mal das sonderzeichen als normales zeichen mit den \ kenntlich zu machen.
'abcd$efg'
Ilja
$ ist meiner ansicht nach kein sonderzeichen bei mysql, um so mehr verwundert mich diese sonderbehandlung des zeichens.
mic hats auch verwundert.
deshalb versuch einfach mal das sonderzeichen als normales zeichen mit den \ kenntlich zu machen.
'abcd$efg'
hab ich schon geht aber leider auch net. ob es ein sonderzeichen ist oder nicht ist eigentlich auch egal. es ist nämlich so, dass mysql alles bei der indizierung als ein wort anerkennt, was
A 4 oder mehr buchstaben
B und durch _ verbunden ist
also wenn abcd§fgh gesucht wird, sucht er nach abcd, §, fgh. und weil nur abcd Bedingung A erfüllt findet er alles mit abcd. und das ist in meinem fall ein wor dass praktisch in jedem datensatz vorkommt. also ist die ganze db nbrauchbar...
ÄRGERLICH!!!!
es müsste eine möglichkeite geben, Bedingung B mit § zu erweitern...
gruß
mic
was passiert den, wenn due das den boolen mode weglässt, also
SELECT id FROM tabelle WHERE MATCH ( spalte1, spalte2, spalte3 ) AGAINST ('abcd$efg');
gleiches ergebnis ?
Ilja
was passiert den, wenn due das den boolen mode weglässt, also
SELECT id FROM tabelle WHERE MATCH ( spalte1, spalte2, spalte3 ) AGAINST ('abcd$efg');
gleiches ergebnis ?
jupp, genau die selbe SCH***E und +, -, * etc. gehen net. was natürlich auch net klar gwehen würde...
was nun? man muss doch nach zB gestzen suchen können stpo§24 oder so...
Halihallo mic
das problem ist, dass sql abcd$efg scheinbar in abcd efgh umwandelt und somit nach abcd ODER efg sucht, was mir gar nicht hilft. gibt man "abcd$efg" erhalt somit nur die datensaätze in denen abcd vorkommt weil egf ja, weil < 4 buchstaben, stopword ist.
<cite>
MySQL uses a very simple parser to split text into words. A word'' is any sequence of characters consisting of letters, digits, `'', and `\_'. Any
word'' that is present in the stopword list or is just too short is ignored. The default minimum length of words that will be found by full-text searches is four characters. This can be changed as described in section 6.8.2 Fine-tuning MySQL Full-text Search.
</cite>
ein "Wort" definiert ist als eine Zeichenfolge aus Buchstaben,
Ziffern, "'" und "_". Nun, ein Fulltext-Search arbeitet auf dieser
Wortebene und somit liesse sich eine Volltextsuche nach dem
_Wort_ "abcd$efg" nicht ohne ändern des Sourcecodes realisieren.
Natürlich könntest du mit field LIKE "%abcd$efg%" arbeiten, wobei
dies vielleicht nicht in deinem Interesse (besonders nicht im
Interesse der Performance) liegt.
weiss jemand ein lösong wie man nach einem string suchen kann der ein sonderzeichen $, § etc. enthält?
IMHO ist ein LIKE/RLIKE oder ähnliche
(http://www.mysql.com/doc/en/String_comparison_functions.html)
Funktion die einzige Möglichkeit (wenn auch nicht vorteilhaft bzgl.
Performance).
Viele Grüsse
Philipp