Linuchs: mySQL: Ähnlichkeits-Suche

Moin,

ich habe immer wieder das Problem, dass eingegebene Suchbegriffe keine Treffer erzielen, weil die Schreibweise von Suchwort und Findewort in der DB unterschiedlich sind, Beispiele

Die Suchworte „Shanty-chor” und Shanty Chor” finden „Shanty Chor“, „Shanty-Chor“ und „Shantychor”, weil ich Space und - durch % ersetze:

where titel LIKE "shanty%chor"

Andersrum mit Suchwort „Shantychor“ funktionert es nicht. „Shanty-Chor“ und „Shanty Chor” werden nicht gefunden.

Gibt es einen Trick, auch den titel in der Datenbank für das LIKE mit % zu versehen?

Fragt Linuchs

  1. Hallo,

    Gibt es einen Trick,

    Soundex und Konsorten

    Gruß
    Kalk

    1. Hallo Tabellenkalk,

      SOUNDEX funktioniert halbwegs brauchbar für die englische Sprache. Ansonsten hat das mysql Handbuch eine klare Meinung:

      This function, as currently implemented, is intended to work well with strings that are in the English language only. Strings in other languages may not produce reliable results.

      Rolf

      --
      sumpsi - posui - clusi
    2. Hallo Tabellenkalk,

      Soundex und Konsorten

      Hihi: Britney Spears = bewährten Superzicke

      Bis demnächst
      Matthias

      --
      Du kannst das Projekt SELFHTML unterstützen,
      indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
  2. Hallo Linuchs,

    sowas solltest du nicht zur Laufzeit tun, das bremst die DB massiv.

    Du hast eine Menge von Feldern, in denen gesucht wird. In diesen Feldern stehen Worte. Du kannst nun jedes Feld in Worte zerlegen, jedes Wort in eine "leichter suchbare" Form bringen und damit einen Wortindex anlegen.

    Dann speicherst Du pro Suchwort die Einträge, die darauf passen, im Prinzip also eine m:n Beziehung. Sowas muss nicht zwingend live passieren, dass kann auch morgens um 5 durch einem Batchjob passieren. An der m:n Relation kannst Du noch speichern, welcher Art dieser Treffer ist (welches Datenfeld, welcher Eintragstyp) und damit bei der Suche dann filtern.

    Einfacher als ein Wortindex ist sicherlich ein Set von Schattenfeldern, in denen die Texte der normalen Felder in suchoptimierter Form stehen.

    Ein Überführen in eine "leichter suchbare Form" ist sicherlich kein triviales Unterfangen. Erster Schritt ist, alles klein zu schreiben und Sonderzeichen zu entfernen. Man könnte auch y und ü in i umwandeln, á, à, â (usw) in a, é, è, ä in e und ö, tja, vielleicht in o. Ein x in chs oder ks. Das ist nur exemplarisch - man müsste schauen ob es für sowas Libraries gibt. Es muss sicherlich auch spezifisch für deutsche Sprache gemacht werden (hast Du dänische oder niederländische Einträge?)

    Alles darüber hinaus gehende wird immer wieder mit den Mehrdeutigkeiten von Sprache kollidieren. Mitmachorchester. Ist das ein Chor (Mitma-Chor-Chester)? Gerade eine optimierte Suche nach Wortteilen, die Google relativ gut vorführt, setzt gute Wörterbücher oder KI voraus.

    Rolf

    --
    sumpsi - posui - clusi
    1. Hallo,

      Alles darüber hinaus gehende wird immer wieder mit den Mehrdeutigkeiten von Sprache kollidieren. Mitmachorchester. Ist das ein Chor (Mitma-Chor-Chester)?

      Nein, ein Ester: Mit-Macho-RCH-Ester…

      Gruß
      Kalk

  3. Like ist dafür nicht die Lösung, denn das was Du beschreibst ist eine Frage der Kollation.

    A collation is a set of rules that defines how to compare and sort character strings.

    Eine Solche kannst Du selbst erstellen

    MFG

  4. Hello,

    Du könntest beide Seiten des Vergleichs durch einen Normalizer schicken.

    Die Datenbankseite (Bestand) lässt Du zweckmäßigerweise im Hintergrund in eine neue Spalte normalisieren. Inserts lässt Du sofort normalisieren und dort ablegen.

    Den Suchbegriff kannst Du dann on the Fly normalisieren. Nun kannst Du mit like die vorberechnete Spalte durchsuchen lassen.

    Aber Vorsicht: das ist immer noch sehr teuer!

    Glück Auf
    Tom vom Berg

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
  5. Hallo Linuchs,

    habe gerade nochmal etwas gegoogelt... hast Du die MYSQL Volltextsuche schon für deine Zwecke evaluiert?

    Rolf

    --
    sumpsi - posui - clusi