Mario: UNION in Volltextsuche, Wo bleibt die Relevanz? (MySQL4.1)

Hallo,

In meiner Volltextsuche kombiniere ich zwei Selects via UNION.
Das Ergebnis der Suche ist, was UNION von seinem Anspruch her tut, eine Aneinanderreihung der Ergebnisse beider Selects.
D.h. Das die relevanten Ergebnisse des zweiten Selects immer weiter unten stehen.

Wie erreiche ich aber, das die Relevanz beider Ergebnisse in der Gesamtdarstellung eine Rolle spielt?

Vielen Dank,

Mario.

  1. Hallo,

    könntest du vieleicht dein Select-Statement aufschreiben. An einem
    Bsp. läst es sich einfacher arbeiten und analysieren!?

  2. echo $begrüßung;

    Wie erreiche ich aber, das die Relevanz beider Ergebnisse in der Gesamtdarstellung eine Rolle spielt?

    Willst du das Ergebnis vielleicht per ORDER BY sortieren?
    Beachte dabei das richtige Setzen der Klammern: http://dev.mysql.com/doc/refman/5.0/en/union.html

    echo "$verabschiedung $name";

    1. Hallo,

      Du meinst also so?, ich probier das gleich mal.

      SELECT col1_in_tab1, MATCH (col1_in_tab1) AGAINST('text') as ORDER
      FROM tab1 WHERE MATCH (col1_in_tab1) AGAINST('text')

      UNION

      SELECT col1_in_tab2, MATCH (col1_in_tab2) AGAINST('text') as ORDER
      FROM tab2 WHERE MATCH (col1_in_tab2) AGAINST('text')

      ORDER BY ORDER

      Gruss, Mario

      1. echo $begrüßung;

        Du meinst also so?, ich probier das gleich mal.

        SELECT col1_in_tab1, MATCH (col1_in_tab1) AGAINST('text') as ORDER
        FROM tab1 WHERE MATCH (col1_in_tab1) AGAINST('text')

        UNION

        SELECT col1_in_tab2, MATCH (col1_in_tab2) AGAINST('text') as ORDER
        FROM tab2 WHERE MATCH (col1_in_tab2) AGAINST('text')

        ORDER BY ORDER

        Wenn du Schlüsselwörter wie ORDER für andere Zwecke missbrauchen willst, musst du sie so kennzeichnen, dass sie nicht als Schlüsselwörter erkannt werden. Je nach Fall wäre das '' oder ``. Du kannst auch ein Wort nehmen, das kein Schlüsselwort ist.

        Das ORDER BY bezieht sich auf das zweite SELECT, wenn du nicht klammerst.

        (SELECT ...)
        UNION
        (SELECT ...)
        ORDER BY ...

        So mus es aussehen, wenn das ORDER BY sich auf die vereinigte Ergebnismenge beziehen soll.
        Hast du die von mir verlangte Handbuchseite gelesen?

        echo "$verabschiedung $name";

        1. Hallo,

          Deinen Artikel habe ich gelesen. Vielen Dank.

          ich bin wieder ein Stück weiter, aber noch nicht am Ziel,:

          1. So ist das SQL erst einmal richtig (Klammern drum und ohne Schlüsselwörter)

          (SELECT col1_in_tab1, MATCH (col1_in_tab1)
          AGAINST('text hallo') as Relevanz
          FROM tab1 WHERE MATCH (col1_in_tab1)
          AGAINST('text hallo'))

          UNION

          (SELECT col1_in_tab2, MATCH (col1_in_tab2)
          AGAINST('text') as Relevanz
          FROM tab2 WHERE MATCH (col1_in_tab2) AGAINST('text'))
          ORDER BY Relevanz DESC

          Das Ergebnis ist wie gewünscht

          ABER

          ich hatte doch tatsächlich die Boolean-Option vergessen. Darum erst einmal das Experiment ohne UNION

          SELECT col1_in_tab1, MATCH (col1_in_tab1)
          AGAINST('text hallo' IN BOOLEAN MODE) as Relevanz
          FROM tab1 WHERE MATCH (col1_in_tab1)
          AGAINST('text hallo' IN BOOLEAN MODE)
          ORDER BY Relevanz DESC

          Das Ergebnis ist, das die ganze Relevanz-Spalte mit 1 gefüllt ist (Dieses Phänomen ist auch in Deinem Artikel beschrieben). Ein findiger User kam dann auf folgende Idee:

          SELECT col1_in_tab1, MATCH (col1_in_tab1)
          AGAINST('text hallo') as Relevanz
          FROM tab1 WHERE MATCH (col1_in_tab1)
          AGAINST('text hallo' IN BOOLEAN MODE) HAVING Relevanz > 0.2
          ORDER BY Relevanz DESC

          Das Ergebnis ist nun wieder richtig. ABER nun habe ich das ganze in mein richtiges SQL getan und ein Detail übersehen...

          (SELECT t1.col1_in_tab1, t3.col1_in_tab3 MATCH (t1.col1_in_tab1, t3.col1_in_tab3)
          AGAINST('text hallo') as Relevanz
          FROM tab1 t1, tab3 t3 WHERE MATCH (t1.col1_in_tab1, t3.col1_in_tab3)
          AND t1.id=t3.id_t1
          AGAINST('text hallo' IN BOOLEAN MODE) HAVING Relevanz > 0.2)

          UNION

          (SELECT col1_in_tab1, col2_in_tab1  MATCH (col1_in_tab1, col2_in_tab1)
          AGAINST('text hallo') as Relevanz
          FROM tab1 WHERE MATCH (col1_in_tab1, col2_in_tab1)
          AGAINST('text hallo' IN BOOLEAN MODE) HAVING Relevanz > 0.2)
          ORDER BY Relevanz DESC

          Im ersten Select mache ich schon eine Volltextsuche über zwei Tabellen und nicht nur über eine Tabelle. Wenn ich die beiden SQLs seperat ausführe, erhalte ich im zweiten ein richtiges Ergebnis, und im ersten den besagten Fehler:

          #1210 - Incorrect arguments to MATCH

          Gruss, Mario

  3. yo,

    Das Ergebnis der Suche ist, was UNION von seinem Anspruch her tut, eine Aneinanderreihung der Ergebnisse beider Selects.

    nur als tipp, der gerne vergessen wird. UNION führt ein automatisches DISTINCT der beiden ergebnismengen aus, sprich gleiche Datensätze werden herausgefiltert. das ist aber nicht immer gewünscht und sollte man im auge behalten.

    Ilja