steckl: mySql: MATCH AGAINST matcht nicht

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

  1. 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
    
    1. 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

  2. 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

    1. 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