MATCH AGAINST findet nix?
Lydia.h
- datenbank
0 Vinzenz Mai0 Lydia.h0 Alexander Brock0 Lydia.h0 Lydia.h0 Marc Reichelt
Hallo Ihr Lieben,
mein Match Against findet einen Eintrag nicht, ob wohl er mit "WHERE =" vorhanden ist:
In dem Datensatzfeld steht 'Verkauf'.
---
SELECT * FROM tabelle WHERE MATCH login_group AGAINST ( 'Verkauf Einkauf Grafik')
---
Ergebnis ist trotzdem 0 Datensätze (für Verkauf)
Wenn ich "WHERE login_group='Verkauf'" suche, erhalte ich alle DS.
Der Index des Feldes ist "Fulltext, Größe 255".
Ich kriege einfach nicht raus, was da falsch läuft.
Liebe Grüße
Lydia.
Hallo Lydia,
mein Match Against findet einen Eintrag nicht, ob wohl er mit "WHERE =" vorhanden ist:
wahrscheinlich haben die Wörter keine Relevanz.
SELECT * FROM tabelle WHERE MATCH login_group AGAINST ( 'Verkauf Einkauf Grafik')
Ergebnis ist trotzdem 0 Datensätze (für Verkauf)Wenn ich "WHERE login_group='Verkauf'" suche, erhalte ich alle DS.
Alle, d.h. das Wort ist in jedem Datensatz vorhanden: keine Relevanz, automatisches Stopword, siehe Handbuch, ich zitiere (da sich kein Anker in der Nähe des Abschnittes befindet):
<zitat>
The search result is empty because the word “MySQL” is present in at least 50% of the rows. As such, it is effectively treated as a stopword. For large datasets, this is the most desirable behavior: A natural language query should not return every second row from a 1GB table. For small datasets, it may be less desirable.
</zitat>
Möglicherweise helfen Dir Boolean Full-Text Searches weiter, siehe auch letzter Absatz des zuerst verlinkten Handbuchabschnittes.
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
Alle, d.h. das Wort ist in jedem Datensatz vorhanden: keine Relevanz, automatisches Stopword, siehe Handbuch, ich zitiere (da sich kein Anker in der Nähe des Abschnittes befindet):
Das mit dem Anker verstehe ich nicht, muß ich den selber setzen?
<zitat>
The search result is empty because the word “MySQL” is present in at least 50% of the rows. As such, it is effectively treated as a stopword. For large datasets, this is the most desirable behavior: A natural language query should not return every second row from a 1GB table. For small datasets, it may be less desirable.
</zitat>
Das ist tatsächlich nicht so. Es ist in vielen DS aber nicht in allen.
Möglicherweise helfen Dir Boolean Full-Text Searches weiter, siehe auch letzter Absatz des zuerst verlinkten Handbuchabschnittes.
Ja, das hat geholfen, vielen Dank.
Heißt das, dass man immer 'IN BOOLEAN MODE' eingeben muß oder wie bestimme ich die RELEVANZ?
Liebe Grüße
Lydia.
hi,
Alle, d.h. das Wort ist in jedem Datensatz vorhanden: keine Relevanz, automatisches Stopword, siehe Handbuch, ich zitiere (da sich kein Anker in der Nähe des Abschnittes befindet):
Das mit dem Anker verstehe ich nicht, muß ich den selber setzen?
D'oh ...
Das ist tatsächlich nicht so. Es ist in vielen DS aber nicht in allen.
Was genau hamm wa denn an
"The search result is empty because the word “MySQL” is present in at least 50% of the rows."
nicht verstanden?
gruß,
wahsaga
hi,
Was genau hamm wa denn an
"The search result is empty because the word “MySQL” is present in at least 50% of the rows."
nicht verstanden?
Jetzt alles :-) Es sind meine ersten Gehversuche mit MATCH und ich bin doch erstaunt, dass etwas OFT vorkommt und deshalb verschwindet :-? Werde versuchen, die Erklärung von MATCH in deutsch zu finden, liegt mir besser ;-)
gruß,
wahsaga
Danke und Gruß zurück
Lydia.
Hi Lydia,
Werde versuchen, die Erklärung von MATCH in deutsch zu finden, liegt mir besser ;-)
da musst du nicht weit suchen: die Dokumentation zur Version 5.1 von MySQL und damit auch das Kapitel zur Volltextsuche ist in Deutsch verfügbar.
Gruß,
Andreas.
Hallo Forum,
<zitat>
The search result is empty because the word “MySQL” is present in at least 50% of the rows. As such, it is effectively treated as a stopword. For large datasets, this is the most desirable behavior: A natural language query should not return every second row from a 1GB table. For small datasets, it may be less desirable.
</zitat>
Ich finde dieses Verhalten doof.
Es ist bei einem Suchwort vielleicht hilfreich, aber wenn ich zwei Wörter habe, die in jeweils 50,08% der Datensätze vorkommen, die Schnittmenge aber nur 0,2% der Datensätze umfasst kann man das ganze Ding wegschmeißen, weil es genau die paar passenden Daten nicht findet.
Gruß
Alexander Brock
Hallo Alexander,
Ich finde dieses Verhalten doof.
Es ist bei einem Suchwort vielleicht hilfreich, aber wenn ich zwei Wörter habe, die in jeweils 50,08% der Datensätze vorkommen, die Schnittmenge aber nur 0,2% der Datensätze umfasst kann man das ganze Ding wegschmeißen, weil es genau die paar passenden Daten nicht findet.
Dem muss ich zustimmen: Bei kleinen Datenmengen macht dieses Verhalten nicht viel Sinn.
Aber bereits bei normalen Datenmengen (beispielsweise Zitatesammlung) ist dieses Verhalten wirklich sinnvoll. Und bei den (zu erwartenden) Datenmengen auf 'Linux Drivers' dürfte dies wirklich sinnvoll sein.
P.S.: Ich glaube, dass wir MATCH AGAINST auch gut für die linuxhwdb verwenden können - bereits für die normale Suche. Oder brauchen wir die Suche nach Teilwörtern _unbedingt_?
Natürlich werde ich dann in der my.cnf den Parameter ft_min_word_len auf 3 setzen, wie hier erwähnt - damit auch Begriffe wie 'ATI' und 'AMD' zu erfolgreichen Ergebnissen führen.
Was hältst du davon?
Ach: Im Übrigen kann man MySQL so kompilieren, dass die 50%-Grenze nicht beachtet wird. Dazu ist lediglich die Änderung einer Konstante erforderlich.
Das ist aber nicht notwendig - bei der Booleschen Volltextsuche wird sie auch ignoriert. :-)
Grüße
Marc Reichelt || http://www.marcreichelt.de/
Möglicherweise helfen Dir Boolean Full-Text Searches weiter, siehe auch letzter Absatz des zuerst verlinkten Handbuchabschnittes.
Leider hat es nicht geholfen. Ich kriege Match-Against nicht in den Griff.
Was kann ich denn alternativ tun, wenn ich z.b. die Wörter 'Hallo Welt' in einer Spalte AUF JEDEN FALL finden will (sowohl nur 'Hallo' als auch 'Welt' und 'Hallo Welt')?
Liebe Grüße
Lydia.
Möglicherweise helfen Dir Boolean Full-Text Searches weiter, siehe auch letzter Absatz des zuerst verlinkten Handbuchabschnittes.
Leider hat es nicht geholfen. Ich kriege Match-Against nicht in den Griff.
Was kann ich denn alternativ tun, wenn ich z.b. die Wörter 'Hallo Welt' in einer Spalte AUF JEDEN FALL finden will (sowohl nur 'Hallo' als auch 'Welt' und 'Hallo Welt')?
Ich glaube, ich finde das Problem: Wenn man statt WHERE MATCH ... HAVING MATCH ... benutzt, ändert sich das gesamte Verhalten. Ein System kann ich jedoch nicht erkennen.
Liebe Grüße
Lydia.
Hallo Lydia.h,
Leider hat es nicht geholfen. Ich kriege Match-Against nicht in den Griff.
Was kann ich denn alternativ tun, wenn ich z.b. die Wörter 'Hallo Welt' in einer Spalte AUF JEDEN FALL finden will (sowohl nur 'Hallo' als auch 'Welt' und 'Hallo Welt')?
Wie erwähnt: Verwende die Boolesche Volltextsuche.
In deinem Fall dürfte der Query etwa so aussehen (du musst ihn natürlich noch auf deine Bedürfnisse anpassen):
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('Hallo Welt' IN BOOLEAN MODE);
So werden alle Einträge mit 'Hallo', 'Welt' und 'Hallo Welt' gefunden.
Grüße
Marc Reichelt || http://www.marcreichelt.de/