mySql: MATCH AGAINST matcht nicht
steckl
- datenbank
Hi,
ich habe mir über Ostern mal die Blog-Software Jlog installiert, die mir hier im Forum empfohlen wurde.
Dabei hatte ich jedoch noch das Problem, dass die Suche nicht funktioniert. Das heißt sie findet nie irgendetwas.
Das ist sowohl lokal (mysql 5.0.51a, XAMPP) als auch auf meinem Webspace (mySql 4.1.22-log) der Fall.
Da das Posting jedoch schon im Archiv ist und die Suche immer noch nicht funktioniert möchte ich dem Problem nochmal nachgehen.
Ich denke es liegt daran, dass in folgendem (stark vereinfachtem) Query scoring immer 0 ist.
SELECT topic, keywords, teaser, content, MATCH ( topic, keywords, teaser, content ) AGAINST ('test') AS scoring FROM jlog_content;
+-------------+----------+--------------+-------------+---------+
| topic | keywords | teaser | content | scoring |
+-------------+----------+--------------+-------------+---------+
| erster test | | nur ein test | erster test | 0 |
+-------------+----------+--------------+-------------+---------+
Warum scoring 0 ist kann ich aber absolut nicht nachvollziehen. Kann mir das irgendwer erklären?
Wenn ich nach "'test'" noch "IN BOOLEAN MODE" schreibe steht in scoring eine 1, aber dann kann ich anschließend nichtmehr richtig nach scoring sortieren.
Komisch ist auch, dass das erste Beispiel aus dem mySql-Manual (http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html) klappt. (lokal getestet)
Kann es vielleicht sein, dass was mit dem FULLTEXT bei der Tabelle nicht stimmt? Aber dann müsste ich ja eigentlich eine Fehlermeldung bekommen, oder?
Die Tabelle wird mit folgendem Query (von einen PHP-Script) erstellt:
CREATE TABLE `jlog_content` (
id int(11) auto_increment,
url varchar(200),
topic varchar(255),
date datetime,
teaser mediumtext,
teaserpic varchar(10),
teaserpiconblog tinyint(1),
keywords varchar(255),
content longtext,
comments tinyint(1) default '1',
allowpingback tinyint(1) default '1',
section varchar(10) default 'weblog',
UNIQUE KEY id (id),
FULLTEXT KEY content_index (content, topic, teaser, keywords)
) TYPE=MyISAM;
Fehlen noch irgendwelche Informationen?
Wäre dankbar, wenn mir jemand helfen könnte.
mfG,
steckl
Hi,
Ich denke es liegt daran, dass in folgendem (stark vereinfachtem) Query scoring immer 0 ist.
SELECT topic, keywords, teaser, content, MATCH ( topic, keywords, teaser, content ) AGAINST ('test') AS scoring FROM jlog_content;
> +-------------+----------+--------------+-------------+---------+
> | topic | keywords | teaser | content | scoring |
> +-------------+----------+--------------+-------------+---------+
> | erster test | | nur ein test | erster test | 0 |
> +-------------+----------+--------------+-------------+---------+
>
> Warum scoring 0 ist kann ich aber absolut nicht nachvollziehen. Kann mir das irgendwer erklären?
Wie viele Datensaetze hast du in der Tabelle, und wie viele davon enthalten das Wort test?
<http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html>:
> A natural language search [...]
> The stopword list applies. In addition, words that are present in 50% or more of the rows are considered common and do not match.
> Wenn ich nach "'test'" noch "IN BOOLEAN MODE" schreibe steht in scoring eine 1, aber dann kann ich anschließend nichtmehr richtig nach scoring sortieren.
IN BOOLEAN MODE nimmt die vorgenannte Einschraenkung nicht vor.
> Komisch ist auch, dass das erste Beispiel aus dem mySql-Manual (<http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html>) klappt. (lokal getestet)
Da hat's auch mehr als 50% Datensaetze, die das Suchwort \*nicht\* enthalten.
MfG ChrisB
Hi,
Wie viele Datensaetze hast du in der Tabelle, und wie viele davon enthalten das Wort test?
Je 1.
http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html:
A natural language search [...]
The stopword list applies. In addition, words that are present in 50% or more of the rows are considered common and do not match.
Da hat's auch mehr als 50% Datensaetze, die das Suchwort *nicht* enthalten.
Das war mein Fehler. Vielen Dank an euch beide. Dass das eine Rolle spielt hätte ich nie gadacht.
Da passt wiedermal Zitat '231:
2 Stunden ausprobieren können Ihnen 10 Minuten Handbuchlesen sparen.
Nur dass es bei mir etwas mehr als 2 Stunden waren.
mfG,
steckl
Hallo,
Ich denke es liegt daran, dass in folgendem (stark vereinfachtem) Query scoring immer 0 ist.
ein vereinfachtes Query taugt nichts, es sei denn das ist ein korrektes Resultat aufgrund der vorhandenen Daten.
SELECT topic, keywords, teaser, content, MATCH ( topic, keywords, teaser, content ) AGAINST ('test') AS scoring FROM jlog_content;
> +-------------+----------+--------------+-------------+---------+
> | topic | keywords | teaser | content | scoring |
> +-------------+----------+--------------+-------------+---------+
> | erster test | | nur ein test | erster test | 0 |
> +-------------+----------+--------------+-------------+---------+
>
> Warum scoring 0 ist kann ich aber absolut nicht nachvollziehen. Kann mir das irgendwer erklären?
Die Wichtung von test könnte einfach 0 sein, siehe in von Dir verlinktem Handbuchabschnitt:
<zitat>
Every correct word in the collection and in the query is weighted
according to its significance in the collection or query. Consequently,
a word that is present in many documents has a lower weight (and may even
have a zero weight), because it has lower semantic value in this
particular collection. Conversely, if the word is rare, it receives a
higher weight. The weights of the words are combined to compute the
relevance of the row.
</zitat>
> Komisch ist auch, dass das erste Beispiel aus dem mySql-Manual (<http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html>) klappt. (lokal getestet)
>
> Kann es vielleicht sein, dass was mit dem FULLTEXT bei der Tabelle nicht stimmt? Aber dann müsste ich ja eigentlich eine Fehlermeldung bekommen, oder?
Nein, wieso?
> Die Tabelle wird mit folgendem Query (von einen PHP-Script) erstellt:
> ~~~sql
> CREATE TABLE `jlog_content` (
> id int(11) auto_increment,
> url varchar(200),
> topic varchar(255),
> date datetime,
> teaser mediumtext,
> teaserpic varchar(10),
> teaserpiconblog tinyint(1),
> keywords varchar(255),
> content longtext,
> comments tinyint(1) default '1',
> allowpingback tinyint(1) default '1',
> section varchar(10) default 'weblog',
> UNIQUE KEY id (id),
> FULLTEXT KEY content_index (content, topic, teaser, keywords)
> ) TYPE=MyISAM;
>
Fehlen noch irgendwelche Informationen?
Ja, die Daten in Deiner Tabelle, mit denen Du Deinen Versuch gemacht hast.
Freundliche Grüße
Vinzenz
Hi,
Danke auch an Dich, für die sehr schnelle Hilfe.
Ich hätte einfach nie gedacht, dass es eine Rolle spielt, in wie vielen Datensätzen das Suchwort vorkommt. Aber so kann man sich täuschen.
Und: Wer lesen kann ist klar im Vorteil.
mfG,
steckl