Rotier: Datenbank nach mehreren Suchbegriffen durchforsten

Hi,

folgendes Problem:

Ich habe in php4/mysql eine Suchmaschine für meine Seite erstellt.
Der User soll nun mehrere Wörter eingeben können.

Zuerst schneide ich mögliche führende oder nachziehnde Leerzeichen mit trim() ab.

Dann mache ich ein suchwoerter=explode(" ",$suchwort)

Nun habe ich mehrere Suchbegriffe nach denen ich suchen kann, WEIß ABER NICHT WIE VIELE!

Nun habe ich das sql Statement in eine forschleife gepackt mit die genau i<count($suchwoerter) mal durchläuft.

Das blöde ist, dass ich nun viele Suchtreffer doppelt habe.
Weiß jemand eine Lösung für dieses Problem?

Danke.

Rotier

  1. Hi,

    folgendes Problem:

    Ich habe in php4/mysql eine Suchmaschine für meine Seite erstellt.
    Der User soll nun mehrere Wörter eingeben können.

    Zuerst schneide ich mögliche führende oder nachziehnde Leerzeichen mit trim() ab.

    Dann mache ich ein suchwoerter=explode(" ",$suchwort)

    Nun habe ich mehrere Suchbegriffe nach denen ich suchen kann, WEIß ABER NICHT WIE VIELE!

    Nun habe ich das sql Statement in eine forschleife gepackt mit die genau i<count($suchwoerter) mal durchläuft.

    Das blöde ist, dass ich nun viele Suchtreffer doppelt habe.
    Weiß jemand eine Lösung für dieses Problem?

    anscheinend sind hier im Moment allerhand Leute, die eigene S-Maschinen schreiben wollen?! :-)

    Warum nutzt Du nicht die Volltextsuche bei MySQL?
    Das ist ein hervorstechendes Merkmal dieser Datenbank.
    Doku findest Du auf http://www.mysql.com/doc/en/Fulltext_Search.html

    Gruß
    Reiner

    1. Hi!

      Warum nutzt Du nicht die Volltextsuche bei MySQL?
      Das ist ein hervorstechendes Merkmal dieser Datenbank.
      Doku findest Du auf http://www.mysql.com/doc/en/Fulltext_Search.html

      Ja kenne ich, aber da kann ich wieder nur nach einem Suchbegriff suchen. Und packe ich es in eine Schleiße habe ich sie wieder doppelt. Also gleiches Problem.
      Rotier

      1. Halihallo Rotier

        Warum nutzt Du nicht die Volltextsuche bei MySQL?
        Das ist ein hervorstechendes Merkmal dieser Datenbank.
        Doku findest Du auf http://www.mysql.com/doc/en/Fulltext_Search.html

        Ja kenne ich, aber da kann ich wieder nur nach einem Suchbegriff suchen. Und packe ich es in eine Schleiße habe ich sie wieder doppelt. Also gleiches Problem.

        [ ] du hast dir die verlinkte Adresse _wirklich und vollständig_ durchgelesen.

        Schleiße? - Schleife ist Scheisse, ja [1]. :-)

        [1] Prämisse, dass die Aussage wahr wird: Wenn in jedem Durchgang jeweils ein Query
            ausgeführt wird..

        Viele Grüsse

        Philipp

        1. Ja, sicher habe ich mir die Doku durchgelesen.
          Also mein Problem ist nicht das durchsuchen sondern wie kreire ich den SQL Befehl, wenn ich vorher nicht weiß, wie viele Suchbegriffer der Benutzer in das Feld eingetragen hat:

          mysql> SELECT * FROM articles WHERE MATCH (title,body)
              ->     AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);

          Für "MySQL" und "YourSQL" müsste ich Variablen setzen.
          Aber die Suchbegriffe sind doch in einem Array, das ich mit explode() erstellt habe.
          Wie bekomme ich die nun in das SQL Statement.
          DAS ist das Problem. Nicht die Ausführung des mysql Besfehls, den verstehe ich wohl.

          Rotier

          1. Hi Rotier,

            Also mein Problem ist nicht das durchsuchen sondern wie kreire ich den SQL Befehl, wenn ich vorher nicht weiß, wie viele Suchbegriffer der Benutzer in das Feld eingetragen hat:

            in dem Moment, in welchem Deine serverseitige Anwendung läuf, weiß sie das.

            Aber die Suchbegriffe sind doch in einem Array, das ich mit explode() erstellt habe.
            Wie bekomme ich die nun in das SQL Statement?

            Du baust Dir das SQL-Statement in einer Schleife zusammen.

            Viele Grüße
                  Michael

            --
            T'Pol: I apologize if I acted inappropriately.
            V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
            (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
            Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
          2. Ja, sicher habe ich mir die Doku durchgelesen.
            Also mein Problem ist nicht das durchsuchen sondern wie kreire ich den SQL Befehl, wenn ich vorher nicht weiß, wie viele Suchbegriffer der Benutzer in das Feld eingetragen hat:

            mysql> SELECT * FROM articles WHERE MATCH (title,body)
                ->     AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);

            Für "MySQL" und "YourSQL" müsste ich Variablen setzen.
            Aber die Suchbegriffe sind doch in einem Array, das ich mit explode() erstellt habe.
            Wie bekomme ich die nun in das SQL Statement.
            DAS ist das Problem. Nicht die Ausführung des mysql Besfehls, den verstehe ich wohl.

            Hae?
            Wieso das denn?
            Ich weiß, ehrlich gesagt gar nicht, was explode() macht - ich stelle mir da einen lauten Knall vor -, aber warum übernimmst Du nicht einfach das Query, packst das in EINE Variable und fertig???

            Gruß
            Reiner

      2. Hi!

        Warum nutzt Du nicht die Volltextsuche bei MySQL?
        Das ist ein hervorstechendes Merkmal dieser Datenbank.
        Doku findest Du auf http://www.mysql.com/doc/en/Fulltext_Search.html

        Ja kenne ich, aber da kann ich wieder nur nach einem Suchbegriff suchen. Und packe ich es in eine Schleiße habe ich sie wieder doppelt. Also gleiches Problem.

        Entweder verstehe ich Dein Problem nicht oder Du hast die Doku nicht gelesen. Fulltext unter MySQL kann dazu genutzt werden, eine gewichtete Suche zu veranlassen. Was meinst Du mit DOPPELT???

        1. Nochwas:

          Falls Du mit der Auf/Umsetzung Probleme hast, guck Dir meine Kiste mal an!
          Das richtig tolle ist eben die boolsche Suche, d.h. Du kannst die Suche sehr genau steuern.

          +reiner -rusch
          findet alle Seiten mit meinem Vor- aber ohne meinen Nachnamen

          +reiner +rusch
          beides muß vorkommen

          "reiner rusch"
          mein Name muß genau in der Reihenfolge vorkommen

          rein*
          findet "reiner" genauso wie "reingefallen" :-)

          usw.

          Ist ja bei MySQL alles dokumentiert.

          Gruß
          Reiner

  2. Hallo.

    Nun habe ich das sql Statement in eine forschleife gepackt

    Hmm, da freut sich der Server.
    Warum packst Du die Worte nich nacheinander in eine where-Klausel?
    for(..)
    {
      $where.= " OR spalte='$wort'";
    }

    Grüße aus Würzburg
    Julian

    --
    ss:) zu:{ ls:< fo:) de:< va:} ch:° n4:} rl:° br:> js:| ie:{ fl:( mo:)
    1. Julian,

      Nun habe ich das sql Statement in eine forschleife gepackt
      Hmm, da freut sich der Server.
      Warum packst Du die Worte nich nacheinander in eine where-Klausel?
      for(..)
      {
        $where.= " OR spalte='$wort'";
      }

      Na das ist ja eine geile Idee.
      Daran habe ich noch nicht gedacht. Werde ich auf jeden Fall mal probieren.

      Danke

  3. Hi Rotier,

    Der User soll nun mehrere Wörter eingeben können.

    und welche Bedeutung soll eine solche Eingabe haben?
    Ich kann mir da bequem mehrere Möglichkeiten vorstellen (fangen wir mal mit AND und OR an ...).

    Definiere eine Aufgabenstellung. Danach fällt die die Implementierung mehr oder weniger in den Schoß.

    Nun habe ich das sql Statement in eine forschleife gepackt mit die genau i<count($suchwoerter) mal durchläuft.

    Ganz schlechte Idee (sehr inperformant).

    Das blöde ist, dass ich nun viele Suchtreffer doppelt habe.

    Ach ja, das ist das nächste überflüssige Problem, welches dabei auch entsteht.

    Weiß jemand eine Lösung für dieses Problem?

    Eine Lösung muß eine Aufgabenstellung erfüllen. Ergo: Schreibe zuerst mal eine Aufgabenstellung.

    Viele Grüße
          Michael

    --
    T'Pol: I apologize if I acted inappropriately.
    V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
    (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
    Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.