Linuchs: Städtenamen ausserhalb des ASCI-Zeichensatzes finden

Moin,

wie könnte ein Lösungsansatz aussehen, in einem Web-Projekt mit internationalem Publikum (noch überwiegend lateinische Schrift mit Sonderzeichen) nach Städtenamen in der Datenbank zu suchen?

Der Engländer hat keine Umlaute auf seiner Tastatur, keine Chance Köln zu finden. Vorausgesetzt, er kennt überhaupt den deutschen Namen und sucht nicht Cologne

Und wir Deutschen? Kennen wir die polnischen Namen ehemals deutscher Städte? Etwa Swinemünde, was jetzt Świnoujście heißt? Wenn der polnische Name ohne Haken und Ösen geschrieben wird, also Swinoujscie reagiert die Datenbank nicht mit einem Treffer.

Für ein paar Orte habe ich zwar alternative Bezeichnungen hinterlegt, so wird Szczecin auch unter Stettin gefunden. Aber das löst nicht mein grundsätzliches Problem.

Linuchs

  1. Hallo Linuchs,

    Und wir Deutschen? Kennen wir die polnischen Namen ehemals deutscher Städte? Etwa Swinemünde, was jetzt Świnoujście heißt?

    Ja, auch nach alternativen Bezeichnungen suchen, wäre eine Möglichkeit.

    Wenn der polnische Name ohne Haken und Ösen geschrieben wird, also Swinoujscie reagiert die Datenbank nicht mit einem Treffer.

    Es gibt auch in SQL die Möglichkeit der Mengenangabe. Damit kannst du nach vielen möglichen Buchstaben suchen. Ich würde zudem nicht nach dem gesamten Namen suchen sondern nur nach dem Anfang, vielleicht 5 Buchstaben.

    Da gibts bestimmt was fertiges dazu. Kommt auch auf die verwendete Datenbank an.

    SELECT * FROM `Table`
    WHERE City LIKE 'świno%'; 
    
    SELECT * FROM `Table`
    WHERE City LIKE '[sśŝşš]wino%'; 
    

    Bis demnächst
    Matthias

    --
    Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
    1. Hallo Matthias Apsel,

      Da gibts bestimmt was fertiges dazu.

      Stimmt (Zweiter Schritt)

      Bis demnächst
      Matthias

      --
      Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
  2. Tach!

    wie könnte ein Lösungsansatz aussehen, in einem Web-Projekt mit internationalem Publikum (noch überwiegend lateinische Schrift mit Sonderzeichen) nach Städtenamen in der Datenbank zu suchen?

    Was ergab ein Test mit dem von dir verwendeten DBMS?

    Und wir Deutschen? Kennen wir die polnischen Namen ehemals deutscher Städte? Etwa Swinemünde, was jetzt Świnoujście heißt? Wenn der polnische Name ohne Haken und Ösen geschrieben wird, also Swinoujscie reagiert die Datenbank nicht mit einem Treffer.

    Wirklich nicht? Dann hast du nicht die richtige Kollation eingestellt.

    dedlfix.

    1. Böse Anforderung...

      Kollation ist ein naheliegendes Argument, aber welche soll er denn einstellen? Das Publikum ist ja nicht auf Polen beschränkt. Man müsste wissen, in welcher Sprache gerade gesucht wird und dann für die jeweilige Abfrage per COLLATE eine andere Collation einstellen. Aber weiß man das jedesmal?

      Soundex ist nicht unbedingt geeignet, weil der Algorithmus auf die englische Sprache optimiert ist.

      Ich kann mir vorstellen, dass Like-Abfragen mit regulären Ausdrücken keinen Index verwenden können und daher zum Table Scan führen, bestenfalls zu einem linearen Index Scan.

      Eine Bildschirmtastatur für frei wählbare Sprachen wäre vielleicht möglich, dann könnte der Brite "Köln" eingeben. Aber ob es mir gelingen würde, korrekt Świnoujście zu tippklicken? Irgendein Strichlein wäre garantiert falsch. Und bei თბილისი (Tbilissi = Tiflis) wäre ich am Ende. Aber das ist ja auch keine lateinische Schrift :)

      Ein weiterer sinnvoller Ansatz ist vermutlich eine Suchindex mit einer Zeile pro geographischem Begriff und Sprache. Einmal seine Heimatsprache, und dann ein Eintrag pro unterstützter Sprache deiner Webseite. Um das Akzeptproblem zu entschärfen, könntest Du zwei Spalten führen: eine in aller akzentuierten Pracht und eine in einer latinisiert-akzentfreien Form (Köln/koln, Świnoujście/swinoujscie, København/kobenhavn, Holbæk/holbaek, und auch Nichtbuchstaben müssen raus: Klein-Möhringen/kleinmohringen).Dem mutigen Anwender könnte man dann sagen, er könne bei Nichtfinden von Begriffen versuchen, die Zeichen, die er auf der Tastatur nicht hat, einfach ohne Akzent einzugeben.

      Der Brite, der die Seite auf englisch sieht, kann nun Cologne suchen. Aber wenn er "Köln" kennt, kann er "Köln" über die Bildschirmtastatur eingeben. Das findest Du dann als nationale Schreibweise. Ein Niederländer gibt Keulen ein - da er die Seite auf Niederländisch sieht, kannst Du das als Match für den NL-Alias anerkennen. Und ich, der ich die Seite auf deutsch sehe und etwas zu Tiflis wissen will, gebe das ein. Wird als Tiflis (de) gefunden, als Alias von Tbilissi (ge). Wobei - der Brite braucht wiederum Tbilisi (en).

      Ein Thema, bei dem ich froh bin, dass mein Arbeitgeber seinen Wirkungsbereich in Deutschland hat 😉

      Rolf

      1. Tach!

        Kollation ist ein naheliegendes Argument, aber welche soll er denn einstellen? Das Publikum ist ja nicht auf Polen beschränkt. Man müsste wissen, in welcher Sprache gerade gesucht wird und dann für die jeweilige Abfrage per COLLATE eine andere Collation einstellen. Aber weiß man das jedesmal?

        utf8_general_ci. Hat zumindest für die angegebenen Beispiele gepasst.

        Ich kann mir vorstellen, dass Like-Abfragen mit regulären Ausdrücken keinen Index verwenden können und daher zum Table Scan führen, bestenfalls zu einem linearen Index Scan.

        Hängt davon ab, ob das Muster vorn einen Platzhalter hat oder nicht.

        dedlfix.

  3. Hello,

    da schau dir mal die Reduktionsfunktion aus dem File-Upload-Artikel im Wiki an.

    Füge eine Extraspalte mit diesem kastrierten Namen ein und prüfe beim Suchen gegen den ebenfalls kastrierten Suchbegriff.

    Alternativ gibt es bestimmt auch eine soundex()-Funktion in MySQL.

    Liebe Grüße
    Tom S.

    --
    Die Krawatte ist das Kopftuch des Westens