1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Suchfunktion - komme nicht auf die richtigen Bedingungen

Dieses Thema im Forum "SQLite" wurde erstellt von 0x3a_, 30 September 2011.

  1. 0x3a_

    0x3a_ Benutzer

    Hallo DB-Forum,
    habe folgendes Problem: Ich schreibe zur Zeit an einem Programm, welches auch das Durchsuchen von vorhandener Musik ermöglicht. Durchsucht wird dabei Dateiname, Interpret und Titel.

    Ich habe nun nach langem Testen immernoch keine richtige Syntax gefunden um perfekte Ergebnisse zu erzielen. Vorbild ist hierbei der MediaMonkey-Player (gibts sogar als eingeschränkte FreeWare-Version falls jemand schauen mag).

    Mal ein Beispiel:

    Dateiname: Zigeunerskat.mp3
    Titel: Zigeunerskat
    Interpret In Extremo

    Bei meiner bisherigen Suchanfrage:
    Code:
    SELECT * FROM musik WHERE (dateiname LIKE '%in%' OR dateiname LIKE '%extremo%' OR dateiname LIKE '%zigeunerskat%') AND (titel LIKE '%in%' OR titel LIKE '%extremo%' OR titel LIKE '%zigeunerskat%') AND (interpret LIKE '%in%' OR interpret LIKE '%extremo%' OR interpret LIKE '%zigeunerskat%') 
    Nun muss ja jedes Attribut mindestens einen Suchbegriff enthalten. Bei der Suche nach "In Extremo" würde nun beispielsweise kein Ergebnis kommen, da die Lieder im Titel im Normallfall kein "In", "Extremo" oder gar "In Extremo" beinhalten.

    Nun denkt man natürlich, mit dem einfachen Umdrehen von AND und OR ist es getan:

    Code:
    SELECT * FROM musik WHERE (dateiname LIKE '%in%' AND dateiname LIKE '%extremo%' AND dateiname LIKE '%zigeunerskat%') OR (titel LIKE '%in%'   AND titel LIKE '%extremo%' AND titel LIKE '%zigeunerskat%') OR (interpret LIKE '%in%'   AND interpret LIKE '%extremo%' AND interpret LIKE '%zigeunerskat%') 
    Aber auch hier passiert nicht viel, da nun der Dateiname, der Titel oder der Interpret "In", "Extremo" und "Zigeunerskat" beinhalten muss. Also wird das auch nichts.

    Dieser Code:
    Code:
    SELECT * FROM musik WHERE (dateiname   LIKE  '%in%' OR dateiname LIKE '%extremo%' OR dateiname LIKE '%zigeunerskat%') OR (titel LIKE '%in%'   OR titel LIKE '%extremo%' OR titel LIKE '%zigeunerskat%') OR (interpret LIKE '%in%'   OR interpret LIKE '%extremo%' OR interpret LIKE '%zigeunerskat%') 
    ist in sofern nicht gut, dass er nun so ziemlich alle Lieder anzeigt, da lieder nicht selten ein "In" behalten.

    Ich bin hier noch am verzweifeln. Irgendwas scheint MediaMonkey anders zu machen. Beispielsweise bei der Suche nach "In Ext" kommen sämtliche In Extremo Lieder als Ergebnis und zusätzlich einige Lieder in denen "In" vorkommt und "Extended". Aber alle Lieder, die nur ein "In" enthalten sind nicht in der Suche.

    Brauche unbedingt Hilfe bei diesem Stückchen Code um meine Suche zu optimieren. Entweder kommen zu viel Ergebnisse, oder zu wenig.

    Gruß,
    0x3a_
     
  2. 0x3a_

    0x3a_ Benutzer

    Scheint gelöst zu sein, habe bis jetzt noch keine Defizite bei der Verwendung dieser Abfrage feststellen können:

    Code:
    SELECT * FROM musik WHERE dateiname || titel || interpret LIKE '%in%' AND dateiname || titel || interpret LIKE '%extremo%' dateiname || titel || interpret LIKE '%zigeunerskat%' COLLATE NOCASE
    Sollte jemandem Probleme bei diesem Verfahren auffallen bitte Bescheid sagen! :)

    Gruß,
    0x3a_
     
  3. Walter

    Walter Administrator Mitarbeiter

    Je nachdem wieviele Datensätze Du hast wird bei Deinem Verfahren die Performance sehr schlecht sein.
     
  4. ukulele

    ukulele Datenbank-Guru

    Über sowas hab ich mir auch schon Gedanken gemacht und es gibt sicherlich einige Wege das zu lösen. Google sucht ja auch nicht nur nach dem Wort oder der kompletten Zeichenkette sondern erkennt auch ggf. andere Schreibweisen.

    Ich würde versuchen eine Treffersuche mit Relevanz aufzubauen. Du könntest z.B. nach jedem wort in allen Bereichen suchen. Je nach Wortlänge und Trefferanzahl pro Lied gibt es dann mehr oder weniger Trefferpunkte, die Ergebnisse lieferst du absteigend.

    Man könnte sogar soweit gehen (um verschiedene Schreibweisen zusammen / nicht zusammen) zu erkennen, den Track schon beim einstellen in die DB aufbröseln. Z.B. einfach mal alle Leerzeichen streichen und die Buchstaben in 3er Blöcken auflösen und in eine Tabelle mit Verweiss schreiben. Quasi ein Volltextindex für Buchstabenkombinationen. Die Suchanfrage gleich aufbauen und dann wieder nach Trefferzahl gehen.
     
  5. 0x3a_

    0x3a_ Benutzer

    Also das ganze läuft auf SQLite, habe eben mal mit über 20.000 Datensätzen getestet und es läuft wunderbar. Das einzige was "Probleme" macht ist die LiveSuche, nach jedem Tastenanschlag ein neues ResultSet ist bei 20.000 Daten wohl nicht mehr angenehm. Werde die LiveSuche einfach optional machen mit dem Hinweis auf Instabilität bei großer Datenmenge. Ist nichts problematisches, da das Programm eh dem privaten Rahmen dient und nicht an einen Kunden geht. Da kann ich etwas quick&dirty Code ruhig verkraften. :)

    Danke für deinen Gedankenanstoß, allerdings ist das wie gesagt nur ein privates Projekt. Um genau zu sein ein Musikplayer der auf Feiern eingesetzt werden kann, da dieser im Kiosk-Mode läuft. Den Gästen ist es gestattet Lieder zur Wiedergabeliste hinzuzufügen. Doppelte Lieder in der Wiedergabeliste sind untersagt. Nur dem Adminitrator (benötigt Passworteingabe) ist es gestattet Lieder aus der Wiedergabeliste zu löschen, zu verschieben oder zu überspringen. Damit verhinder ich ständiges Mentor spielen am PC, da die Leute selbst alles machen können und keiner Lieder eines anderen löscht oder verschiebt. :D

    So genug gequatscht, Fazit: Dieses Suchverfahren sollte meinen Gästen reichen. :)

    Vielen Dank für die Hilfe,
    werde bestimmt öfters auf Euch zurückkommen falls wieder eine DB-basierte Anwendung anliegt. :p
     
  6. 0x3a_

    0x3a_ Benutzer

    Hab nachträglich noch eine Frage: Kann man in SQL die LIKE-Klausel abwandeln, dass verschiedene Varianten geprüft werden, beispielsweise:

    Code:
    SELECT * FROM tabelle WHERE column LIKE '%gem{ü|ue|u}se%'
    Um damit die Suche etwas zu verbessern.

    Bin mit dem Handy online und unterwegs, kann es also gerade nicht testen, wäre nett wenn jemand eine Antwort weiss, damit ich nachher direkt loslegen kann falls es eine solche Möglichkeit gibt. :)

    Gruß und besten Dank,
    0x3a_
     
  7. ukulele

    ukulele Datenbank-Guru

    Das kann ich dir nicht sagen aber du kannst im Notfall ja immer mehrere LIKE Anfragen mit OR verknüpfen.
     

Diese Seite empfehlen