QueryProblem mit MATCH

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • QueryProblem mit MATCH

    Moin Leute,

    Also, es geht um Folgendes. Ich habe ein Script, mit dem man kategorien erstellen kann. Nun möchte ich eine Abfrage basteln, die die bereits vorhandenen Kategorien nach Kategorien durchsucht, die ähnlich der Eingabe sind. Dies wollte ich auf folgendes weise mit MATCH tun:



    PHP-Code:
    $query "SELECT
                name, id
               FROM
                   "
    .$sql_db_listen."
               WHERE
                   MATCH(name) AGAINST('"
    .$name."')
               AND
                   gruppe = '"
    .$gruppen_id."'

               "

    Ausgeben wollte ich das ganze dann erstmal wie folgt um zu schauen ob es überhaupt funktioniert:

    PHP-Code:
    $res mysql_query($query);
         
    $row mysql_fetch_assoc($res);

         echo 
    '<pre>';
         
    print_r($row);
         echo 
    '</pre>'
    Ich habe das Feld "name" auf VOLLTEXT-Index gesetzt, wie es im MySQL Handbuch steht. Dann hab ich einen Datensatz erstellt bei dem name ="Banane" ist. Wenn ich nun in mein Eingabefeld ( $name im Query ) "Banane" eingebe wird aber kein Ergebnis ausgegeben. $row ist vollkommen leer.

    Wo liegt mein Fehler ? Danke schonmals im Voraus.
    Mein aktuelles Projekt: Hausaufgaben Datenbank für kostenlose Hausaufgaben

  • #2
    Keiner ne Idee ? Oder ist das überhaupt der falsche Ansatz für eine Funktion, die einem bereits vorhandene, ähnliche Einträge auflisten soll ?
    Mein aktuelles Projekt: Hausaufgaben Datenbank für kostenlose Hausaufgaben

    Kommentar


    • #3
      doch.

      STOPPWORT!!


      http://dev.mysql.com/doc/refman/5.1/...xt-search.html

      (suche dort nach originalsatz und ersetze MySql durch Banane : "Das Suchergebnis ist leer, weil das Wort „MySQL“ in mindestens 50 Prozent der Datensätze vorhanden ist. Insofern wird es letztendlich als Stoppwort behandelt.")



      (edit: vielleicht würde ein einfaches LIKE in deinem Falle ausreichen??)
      **********
      arkos
      **********

      Kommentar


      • #4
        Danke erstmal für deine Antwort!

        Für das Beispiel der Banane würde ohne Frage ein LIKE ausreichen.

        Der eigentliche Verwendugnszweck ist jedoch, zu ermitteln ob bereits Listen mit einem ähnlichen Namen, wie dem, unter dem man gerade eine erstellen will, vorhanden sind. Damit Listen eben nicht doppelt erstellt werden.

        Soweit ich das verstanden habe gibt MATCH einen Wert zurück, der für die Übereinstimmung des Suchwortes und des Textes im Datenbankfeld steht.

        Ich dachte mir ich probier das lieber über ein QUery zu regeln. Ich könnte natürlich auch alle Listen-Titel aus der DB holen und dann mit levenshtein(); die Übereinstimmung ermitteln und dann danach sortieren. Dachte aber das mit dem Query ist besser für die Performance
        Mein aktuelles Projekt: Hausaufgaben Datenbank für kostenlose Hausaufgaben

        Kommentar


        • #5
          Okay, ich hab mir alles nochmal genau durchgelesen. Die Sache funktioniert jetzt.

          Ein Problem habe ich allerdings noch. Ein "Joker" in der Suche ist nur beim BOOLEAN MODE möglich, allerdings hat der BOOLEAN MODE den Nachteil, dass die Ergebnisse nichtmehr nach Relevanz sortiert werden.

          Wäre aber doof, wenn beim Suchwort "Banane" der Begriff "Bananenbrot" nicht gefunden würde. Allerdings mag ichs auchnich, wenn das nicht nach Relevanz sortiert wird.

          Hat da jemand ne Lösung ?
          Mein aktuelles Projekt: Hausaufgaben Datenbank für kostenlose Hausaufgaben

          Kommentar


          • #6
            wenn die funktion annähernd wasserdicht sein soll, und listen nicht 100 mal täglich angelegt werden, dann müsstest du vielleicht überlegen, ob du mehrere funktion nacheinander kombinierst. spirch match, like und vielleicht sogar levenshtein??



            Original geschrieben von nohfreak
            Allerdings mag ichs auchnich, wenn das nicht nach Relevanz sortiert wird.

            Original geschrieben von http://dev.mysql.com
            Das folgende Beispiel ist komplexer. Die Abfrage gibt die Relevanzwerte zurück und sortiert die Datensätze zudem nach absteigender Relevanz. Um dieses Ergebnis zu erhalten, sollten Sie MATCH() zweimal angeben: einmal in der SELECT-Liste und ein weiteres Mal in der WHERE-Klausel. Hierdurch wird die Systembelastung nicht erhöht, da der MySQL-Optimierer bemerkt, dass die beiden MATCH()-Aufrufe identisch sind, und den Code für die Volltextsuche insofern nur einmal aufruft.

            mysql> SELECT id, body, MATCH (title,body) AGAINST
            -> ('Security implications of running MySQL as root') AS score
            -> FROM articles WHERE MATCH (title,body) AGAINST
            -> ('Security implications of running MySQL as root');
            +----+-------------------------------------+-----------------+
            | id | body | score |
            +----+-------------------------------------+-----------------+
            | 4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 |
            | 6 | When configured properly, MySQL ... | 1.3114095926285 |
            +----+-------------------------------------+-----------------+
            2 rows in set (0.00 sec)
            ??? oder versteh ich dich falsch?
            **********
            arkos
            **********

            Kommentar


            • #7
              Öhm, ja, du verstehst mich falls. Dennoch möchte ich dir erstmal für die Hilfe danken!

              Also, eine MATCH-KLausel reicht schon, der sortiert dann automatisch absteigend nach Relevanz, hab ich im Manual gelesen und auch ausprobiert.

              Es gibt aber zwei Typen von MATCH-Queries. Einmal die Natursprachliche-Suche und die Boolean-Suche. Beim Natursprachlichen kann man keine Joker ( Wie % bei LIKE ) angeben. Das geht nur beim Boolean-Mode. Benutzt man aber den Boolean-Mode, dann wird nicht absteigend nach Relevanz sortiert.

              Nun könnte man ja sagen, dann benutzt man zur Relevanz-Sortierung eben den Natursprachlichen Modus. Hab ich ausprobiert, geht nicht, wirft MySQL-Error. Macht ja auch Sinn, wie sollen die Ergebnisse des einen Modus nach den Werten des anderen sortiert werden. Evtl. würden manche Datensätze beim einen ja garnicht gefunden.

              Also da dieses Script nicht allzuoft benutzt werden wird, denke ich, ich werde doch lieber alle Titel auslesen und mit PHP auswerten. ^^
              Mein aktuelles Projekt: Hausaufgaben Datenbank für kostenlose Hausaufgaben

              Kommentar


              • #8
                Und was ist wenn du im Natursprachlichen Modus den Score noch mal zusätzliche selektierst beziehungsweise selber danach sortierst? Welche Fehlermeldungen tauchen auf?
                Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                Kommentar

                Lädt...
                X