Linuchs: Text-Suche: Sonderzeichen in der DB sind ein Problem

Moin,

ich arbeite an einer Liederliste mit knapp 1.200 Titeln, die Anzeige kann gefiltert werden.

Beim Test beklagt der Kunde, dass seine Filter-Eingabe (such_titel) „Junge komm“ kein Ergebnis bringt, obwohl es den Titel „Junge, komm bald wieder“ mit Komma gibt.

Zahlreiche Titel enthalten Sonderzeichen. Nach Eingabe des such_titel kann ich die leicht eliminieren, aber wie bekomme ich dann Treffer aus der Datnbank, die Sonderzeichen enthalten?

Beispiele in der Datenbank:

Bless 'Em All
West - Zuid -West v. Ameland 1,2 (Ballastliedje)
Way, Stormalong, John
Heave away cheerily o!

Wie man mit deutscher Tastatur sowas finden könnte, ist mir schleierhaft:

Blåser kallt,kallt, Våder ifran Sjön
Derriére chez nous

Ideen?

Gruß, Linuchs

  1. Hi Karl,

    Joker emphiehlt Full-Scan der Spalte mit LIKE und Jokerzeichen.

    Vorher alle Kommata, Leerzeichen, Bindestriche usw. gegen % austauschen.

    Bei 1.200 Einträgen ist dax vertretbar.

    Grüße aus Gotham-City
    Joker

    1. Hallo Joker,

      Bei 1.200 Einträgen ist dax vertretbar.

      Das hatte ich auch überlegt - aber es hängt davon ab, wieviele Leute ständig auf der DB rumrödeln. Du musst ja für jede Suche jeden der 1200 Titel normieren, immer wieder. Ich würde eine Extraspalte vorziehen. Aber vielleicht bin ich auch von den Umständen in meinem Beruf „verdorben“, wo eher zwölf Millionen statt zwölfhundert Sätze durchsucht werden. Von mehr als zwölftausend Leuten, drölf Stunden am Tag.

      Rolf

      --
      sumpsi - posui - obstruxi
    2. Moin, Joker,

      Vorher alle Kommata, Leerzeichen, Bindestriche usw. gegen % austauschen.

      Nur, um die Grenzen dieses Vorschlags zu verstehen:

      Vertauschte Worte werden nicht gefunden? Also „komm%junge“ findet nicht „Junge, komm“?

      Da müsste ich dann wohl mehrere LIKES als ODER absetzen=?

      Edit: Ne, geht auch nicht. Bei Junge komm sollen ja beide Wort-Fetzen vorkommen. Jungs, die gehen, sind nicht gefragt.

      1. Da müsszest Du dann AND und LIKE benutzen und den Suchtext vorher an den Sonder-/Leerzeichen exploden in die einzelnen Suchteile.

        SELECT id, titletext from TITLES where titletext LIKE "%junge%" AND titletext LIKE "%komm%"

        Grüße
        Findus

  2. Hallo Linuchs,

    hatten wir das Thema nicht schon mal? Vielleicht nicht bei Dir.

    Wenn Du das performant lösen willst, brauchst Du in der DB eine Extraspalte, die die zu durchsuchenden Texte normalisiert enthält. Bei der Erstbefüllung musst Du einen Job über die DB laufen lassen, und in Folge musst Du bei Updates das Suchfeld mit updaten.

    • Akzente entfernen
    • Sonderzeichen durch Leerstellen ersetzen
    • danach: mehrfache Leerstellen zu einer standardisieren
    • großschrift beseitigen (wobei ich nicht weiß ob es Sprachen gibt wo das ein Problem sein könnte)

    Das ist, wenn es international laufen soll, nicht so einfach. Bei den Akzentzeichen und Groß-/Kleinschreibung kann dir ggf. MYSQL helfen, wenn Du eine Collation mit CI und AI verwendest (das kann man im Zweifelsfall im SQL mit der COLLATE Klausel festlegen, oder auch in der Tabellendefinition für die Spalte). Wenn CI und AI funktionieren, kannst Du die Pflege des Suchfeldes ggf. auch durch einen Update-Trigger lösen; das entfernen von Sonderzeichen und mehrfachen Leerstellen könnte sich innerhalb von MySQL lösen lassen.

    Bei den Leerstellen achte auch auf Unicode-Sonderleerstellen.

    Wenn Du das Suchfeld hast, kannst Du Suchbegriffe nach den gleichen Regeln aufbereiten und damit eine LIKE Suche starten. Oder Du guckst Dir die Volltext-Suchfunktion von MySQL an (habe ich selbst noch nicht genutzt), ob die das ganze vereinfachen kann.

    Ich hoffe, dass das zielführend ist.

    Bei jeder Suche alle durchsuchten Textfelder in der DB on the fly zu normalisieren solltest Du jedenfalls nicht tun. Das ist zu langsam.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. @@Rolf

      • Sonderzeichen durch Leerstellen ersetzen

      Könnt Ihr bitte aufhören, von „Sonderzeichen“ zu sprechen? Kommas sind keine Sonderzeichen, å, æ, ą auch nicht.

      • großschrift beseitigen (wobei ich nicht weiß ob es Sprachen gibt wo das ein Problem sein könnte)

      Ja, tlhIngan Hol (Klingonisch).

      🖖 Stay hard! Stay hungry! Stay alive! Stay home!

      --
      “Turn off CSS. If the page makes no sense, fix your markup.” —fantasai
      1. Hallo Gunnar Bittersmann,

        Könnt Ihr bitte aufhören, von „Sonderzeichen“ zu sprechen? Kommas sind keine Sonderzeichen, å, æ, ą auch nicht.

        Kommata könnten aber durchaus Sonderzeichen sein.

        Bis demnächst
        Matthias

        --
        Du kannst das Projekt SELFHTML unterstützen,
        indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
        1. @@Matthias Apsel

          Könnt Ihr bitte aufhören, von „Sonderzeichen“ zu sprechen? Kommas sind keine Sonderzeichen, å, æ, ą auch nicht.

          Kommata könnten aber durchaus Sonderzeichen sein.

          Ampersands auch. Alles eine Frage des Blickwinkels, d.h. des Kontexts.

          🖖 Stay hard! Stay hungry! Stay alive! Stay home!

          --
          “Turn off CSS. If the page makes no sense, fix your markup.” —fantasai
      2. Könnt Ihr bitte aufhören, von „Sonderzeichen“ zu sprechen? Kommas sind keine Sonderzeichen, å, æ, ą auch nicht.

        Wie nennst du den Sammelbegriff von Zeichen, die nicht dem ABC und nicht den Ziffern 0..9 zugehören?

        Schon in der ersten Klasse haben wir das Alphabet aufgesagt, die Umlaute und das EsZet gehörten nicht dazu.

        Und Computer haben mit den nicht-ANSI-Zeichen immer wieder Probleme.

        1. @@Linuchs

          Könnt Ihr bitte aufhören, von „Sonderzeichen“ zu sprechen? Kommas sind keine Sonderzeichen, å, æ, ą auch nicht.

          Wie nennst du den Sammelbegriff von Zeichen, die nicht dem ABC und nicht den Ziffern 0..9 zugehören?

          Kommas gehören zu den Satzzeichen; å, æ, ą sind Buchstaben mit diakritischen Zeichen. Der Sammelbegriff heißt „Zeichen“.

          Schon in der ersten Klasse haben wir das Alphabet aufgesagt, die Umlaute und das EsZet gehörten nicht dazu.

          Eszet gehört aufs Frühstücksbrötchen.[1]

          Und Computer haben mit den nicht-ANSI-Zeichen immer wieder Probleme.

          Nein, Computer haben damit keine Probleme. Einige Programme haben Probleme – diese sind von unfähigen Programmierern/Produktmanagern erstellt. (Geh nicht von Böswilligkeit aus, wenn Dummheit genügt.[2])

          Rassismus inklusive.

          🖖 Stay hard! Stay hungry! Stay alive! Stay home!

          --
          “Turn off CSS. If the page makes no sense, fix your markup.” —fantasai

          1. Eszet ↩︎

          2. Hanlon’s Razor ↩︎

          1. @@Gunnar Bittersmann

            å, æ, ą sind Buchstaben mit diakritischen Zeichen.

            Æh, æ wohl weniger. Das ist eine Ligatur aus a und e, so wie es auch ä ursprünglich mal war.

            🖖 Stay hard! Stay hungry! Stay alive! Stay home!

            --
            “Turn off CSS. If the page makes no sense, fix your markup.” —fantasai
            1. Hallo Gunnar,

              å, æ, ą sind Buchstaben mit diakritischen Zeichen.

              Æh, æ wohl weniger. Das ist eine Ligatur aus a und e, so wie es auch ä ursprünglich mal war.

              ja, spielt aber keine Rolle. Es ist (in manchen Sprachen) ein ganz normaler Buchstabe. Ob ö, ó, ø, oder œ - sie alle gehören in der einen oder anderen Sprache zum üblichen Zeichenvorrat (wobei ich mal gehört habe, dass sogar die Franzosen das œ mehr und mehr zugunsten von oe links liegenlassen).

              Ergo: Ob diakritisch oder Ligatur oder eine ganz eigene Variante, ist völlig egal. Die Unterscheidung zwischen diesen Variationen ist sinnlosunerheblich.

              Live long and pros healthy,
               Martin

              --
              Home is where my beer is.
        2. Hallo Linuchs,

          Und Computer haben mit den nicht-ANSI-Zeichen immer wieder Probleme.

          Ich denke, wenn es Probleme gibt, dann meist schon mit denen außerhalb von ASCII. ANSI verstehe ich als ISO-8859-1 ≈ Windows-1252 und umfasst damit bereits Umlaute (bei denen man hierzulande bekanntlich als erstes merkt, wenn es Probleme mit der Zeichenkodierung gibt).

          Gruß
          Julius

  3. Hallo,

    Beim Test beklagt der Kunde, dass seine Filter-Eingabe (such_titel) „Junge komm“ kein Ergebnis bringt, obwohl es den Titel „Junge, komm bald wieder“ mit Komma gibt.

    Ergänzend zu den anderen Ideen: Zerlege auch den den Suchausdruck in "Atome", und suche die getrennt. Dann wird nämlich auch "komm junge wieder" gefunden.

    Zahlreiche Titel enthalten Sonderzeichen.

    Was sind Sonderzeichen?

    Beispiele in der Datenbank:

    Bless 'Em All
    West - Zuid -West v. Ameland 1,2 (Ballastliedje)
    Way, Stormalong, John
    Heave away cheerily o!
    

    Da ist nichts, was ich als Sonderzeichen betrachten würde.

    Wie man mit deutscher Tastatur sowas finden könnte, ist mir schleierhaft:

    Blåser kallt,kallt, Våder ifran Sjön
    Derriére chez nous
    

    Die Akzente sind auch mit einer deutschen Tastatur leicht einzugeben. Buchstaben wie å, ø oder æ sind da schon kniffliger. Aber wer sich öfter mit denen befasst, hat vielleicht ein Tastaturlayout, das die Eingabe dieser Zeichen unterstützt.

    Oder die Zeichentabelle nebenher geöffnet.

    Übrigens meintest du bestimmt Derrière chez nous.

    Live long and pros healthy,
     Martin

    --
    Home is where my beer is.
  4. Hallo Linuchs,

    ich habe mal eine Tabelle mit Volltext-Index angelegt. Spalten ID, Interpret, Titel. Interpret und Titel sind mit Collation UTF8_GENERAL_CI angelegt. Sorry für den Hinweis auf AI Collations, das kennt MySQL scheinbar nicht (zumindest meins nicht), das scheint MS SQL Server zu sein.

    Satz 1:
    Interpret: Freddy Quinn
    Titel: Junge, komm bald wieder

    Satz 2:
    Interpret: Freddy Mercury
    Titel: Who wants to live forever

    Satz 3:
    Interpret: Freddy Krueger
    Titel: I'm a Dreamer

    Satz 4:
    Interpret: Freddi Quinn
    Titel: Junge, komm bald wieder, bald wieder, nach Haus. Junge, fahr nie wieder, nie wieder hinaus

    Für diese Tabelle habe ich einen Volltextindex auf die Spalten Interpret und Titel angelegt. Darauf kann man nun mit

    SELECT Match(Titel,Interpret) AGAINST (:query), Titel, Interpret 
    ORDER BY 1 DESC
    

    abfragen (PDO-Style, statt :query kann man auch ? schreiben für MYSQLI)

    Was er nicht macht, ist Freddy für Freddi finden.

    Aber man kann z.B. nach Freddy Junge suchen. Oder Freddy Forever. Oder auch nach FREDDY oder freddy. Und vor allem auch nach Frêddy. Fräddy nicht. Man kann auch nicht mit Fräddy nach Fræddy suchen. Ganz so super ist es also auch nicht. Ggf. kannst Du eine Eingabehilfe vorsehen für die häufigsten Zeichen die auf einem T1-Layout nicht stehen - oder einen Affiliate Link für T2-Tastaturen bereitstellen 😂.

    Was Du nicht musst, ist Leerzeichen und Sonderzeichen rausschmeißen. Darum kümmert sich MYSQL. Aber du könntest ggf. ein Indexfeld einfügen wo die "ungewöhnlichen" Zeichen "normiert" werden, z.B. æ zu ä, und darauf dann eine Volltextsuche machen.

    MATCH...AGAINST liefert einen Trefferscore. Nach dem kann man absteigend sortieren und ggf. noch auf 10 oder 50 Zeilen limitieren.

    So, das wollte ich mal untersucht haben.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hallo Rolf,

      whow, du kniest dich ja wirklich rein. Dank dafür, ich probier's aus.

  5. ich denke mir das so:

    Den eingegebenen Filter gehe ich mit PHP Zeichen für Zeichen durch und erzeuge ein Array von zusammenhängenden lateinischen a..z und arabischen Zeichen 0..9

    Da sind Satz-, Leer- und Sonderzeichen nicht mehr dabei.

    Dann suche ich mit mehreren LIKE und AND die Titel durch.

    Mal sehen, was das gibt und wie sich die Laufzeit ändert.