like, regexp,pregmatch und konsorten

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

  • like, regexp,pregmatch und konsorten

    Hallo,
    komme mit der Artikelsuche nicht so richtig auf DEN grünen Zweig.
    Hab sämtliche regular expressions ausprobiert, finde aber keinen zufriedenstellenden Weg.
    Momentan hab ich mich wieder auf like beschränkt.
    Das Problem ist: Angenommen der Artikel Lavendelöl wird gesucht.
    In der db steht er mit Lavendel-Öl drin.
    Da fängts schon an: Der Bindestrich ist ein Problem.
    Öl findet er, aber Öle schon wieder nicht.
    Wie kann ich in dem Fall den Suchbegriff öl finden, egal ob im Plural oder im Namen integriert ist? Öllampe (geht mit öl, aber nicht mit öle)
    Im Prinzip ist eine intelligente Suche gefragt.
    Ich weiß zumindest wo ich mein Bier finde - im Kölschrank.

  • #2
    Fakt ist, dass LIKE keine Allzweckwaffe ist. Wenn es für deine Zwecke nicht ausreicht, wirst du nicht umhin kommen, mit PHP nachzuarbeiten.
    Stellt sich also die Frage, was besser/schneller ist:

    1. Alles aus der DB holen und dann mit PHP darauf rumreiten, bis Zufriedenheit eintritt.
    2. Nur das aus der DB holen, was im Entferntesten passen könnte und dann mit (weniger) PHP darauf rumreiten.

    Mit "rumreiten" meine ich approximiertes Matching, es könnte aber u.U. auch mit den preg-Funktionen gehen.

    Kommentar


    • #3
      natürlch hab ich mir like eigenlcih abgeschmickt, aber ich hab halt keine gute Lösung gefunfen

      Kommentar


      • #4
        Okay, wenn du alles mit PHP machen willst ...

        Dann ziehst du eben erstmal alle Tupel aus der DB und untersuchst jeweils wie gut das Attribut 'Artikel' zu dem Suchstring passt.

        Ich weiß nicht, inwiefern die Domäne von 'Artikel' eingegrenzt ist; d.h. ob es beim Eintragen neuer Artikel irgendwelche Beschränkung in der Notation gibt. Darum nehme ich mal an, im Feld 'Artikel' kann alles mögliche stehen.
        Auf den Suchstring hast du wahrscheinlich überhaupt keinen Einfluß, da er vom User ins Suchformular eingegeben wird. Oder?

        Nimm dir zunächst den kompletten Suchstring und vergleiche 'Artikel' von jedem Attribut damit. Wenn es Treffer gibt, sind das perfekte Treffer und die sollten in der Trefferliste ganz oben stehen.
        Dann verkürzt du den Suchstring um einen Buchstaben und suchst wieder. Aber nicht mehr in den Tupeln, bei denen es schon vorher (bei längerem Suchstring) einen Match gab.
        Das wiederholst du immer wieder - String verkürzen, vergleichen, Treffer unten an die Liste anhängen, Treffer-Tupel aus der Liste streichen, um sie beim nächsten Durchlauf nicht wieder zu durchsuchen - bis der Suchstring "zu kurz" geworden ist.

        Oder anders: Du baust dir aus allen in der DB vorhandenen Artikel-Strings einen Suffix- oder Keyword-Tree. Das ist ziemlich aufwendig und muß bei INSERT, UPDATE, DELETE gepflegt werden - eignet sich also eher, wenn sich der Artikelbestand nur selten ändert. Dafür läuft die Suche dann in linearer Zeit.
        (Wie du die passenden Tupel dann aus der DB holst, steht auf einem anderen Blatt.)

        Jede der Varianten kannst du nach Belieben "würzen". Zum Beispiel mit einer Substitutionsmatrix, die angibt wie gut oder schlecht jeweils zwei Zeichen zusammenpassen. Oder einer Scoringfunktion, die das exakte Matchen ersetzt. Oder oder oder.

        Kommentar


        • #5
          oder du versuchst es erstmal ganz profan mit similar_text, vielleicht reicht dir das ja schon
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            ...mit dem -1 hatte ichs schon mal probiert.
            Hilft in einigen Fällen ganz gut, weil halt doch mal hose oder hosen, lampe oder lampen eingegeben wird.
            Bei öl wars dann aber problematisch - da wurde fast die ganze db ausgeworfen.
            Habs jetzt so gemacht:

            $count = strlen($product);
            if($count >2) $product = substr($product, 0, -1);

            Kommentar

            Lädt...
            X