Linuchs: Konzept zur Keyword-Suche

problematische Seite

Moin,

gibt es irgendwo eine Norm oder ein Usus (Brauch), nach was gesucht werden muss, wenn der User bestimmte Begriffe eingibt?

Vor Jahren gab es das mal bei Google, zuerst sollten die Treffer kommen, die sämtliche Worte des Suchbegriffs enthalten. Ist nicht mehr so.

In meinem Kalender biete ich eine Suchfunktion an.

Nehmen wir mal shanty-chor, das kann im Namen von Mitgliedern oder in Titeln von Veranstaltungen enthalten sein. Andere Suchbegriffe können auch Ortsnamen finden.

Wer danach sucht, erwartet wohl auch Treffer wie shantychor und shanty chor, aber nicht Wort-Drehungen wie chor für shantys. Das wäre abgedeckt mit

$keyword = "shanty-chor";
$keyword = str_replace( "-", "%", mb_strtoupper( $keyword ));
AND         UPPER( trm1.titel ) LIKE '%".$keyword."%' COLLATE utf8_bin

(COLLATE utf8_bin sorgt dafür, dass bei Suche nach ö NICHT AUCH nach o gesucht wird)

Es wäre wohl falsch, alle Sonderzeichen und Leerzeichen des Suchbegriffs mit % als SQL-Platzhalter zu ersetzen? Aber wenn ich nur Leerzeichen ersetze, findet shanty-chor die anderen Schreibweisen nicht.

Bei Eingabe mit Gänsefüßen "shanty chor" ist das Leerzeichen relevant.

Alternativer Ansatz: Nach mehreren Worten suche ich einzeln, dann werden auch Dreher gefunden und Feldinhaltemit anderen Worten dazwischen:

$arr = explode( " ", "shanty chor festival" );
$q = "
..."
foreach( $arr as $suchwort ) {
  $q .= "OR LOWER( trm1.titel ) LIKE '%".$suchwort."%' COLLATE utf8_bin
":
}

Wie könnte ich die Ausgabe sortieren, dass die meisten Übereinstimmungen zuerst kommen? Chorfestivals ohne shanty sind in diesem Zusammenhang nicht interessant.

Gruß, Linuchs

  1. problematische Seite

    Hallo,

    gibt es irgendwo eine Norm oder ein Usus (Brauch), nach was gesucht werden muss, wenn der User bestimmte Begriffe eingibt?

    ob es festgeschriebene Regeln oder einen Standard gibt, weiß ich nicht. Üblich ist aber:

    • Groß- und Kleinschreibung wird nicht beachtet
    • mehrere Suchbegriffe werden durch Leerzeichen getrennt
    • meist gilt implizit eine UND-Verknüpfung der Suchbegriffe (d.h. alle müssen vorkommen)

    Vor Jahren gab es das mal bei Google, zuerst sollten die Treffer kommen, die sämtliche Worte des Suchbegriffs enthalten. Ist nicht mehr so.

    Nein? Ich meine schon. Zuerst die, die alle Suchbegriffe enthalten (UND), weiter hinten auch die, die nur eine Teilmenge der Suchbegriffe enthalten (ODER).

    Nehmen wir mal shanty-chor, das kann im Namen von Mitgliedern oder in Titeln von Veranstaltungen enthalten sein. Andere Suchbegriffe können auch Ortsnamen finden.

    Wer danach sucht, erwartet wohl auch Treffer wie shantychor und shanty chor, aber nicht Wort-Drehungen wie chor für shantys.

    Vielleicht nicht bewusst. Wenn diese Stelle aber auch bei den Treffern auftaucht, wird sich mancher an die Stirn klatschen: Ach ja, stimmt eigentlich!

    Anstatt einzelner Suchbegriffe auch Wortkombinationen zu finden, dürfte etwas kniffliger sein.

    (COLLATE utf8_bin sorgt dafür, dass bei Suche nach ö NICHT AUCH nach o gesucht wird)

    Elegant wäre aber, wenn bei der Suche nach 'ö' alternativ auch 'oe' gefunden wird. Zumindest im Deutschen - in Schwedisch, Türkisch oder Ungarisch wäre das vermutlich Unsinn.

    Es wäre wohl falsch, alle Sonderzeichen und Leerzeichen des Suchbegriffs mit % als SQL-Platzhalter zu ersetzen? Aber wenn ich nur Leerzeichen ersetze, findet shanty-chor die anderen Schreibweisen nicht.

    Ich würde einen anderen Ansatz wählen:

    • trenne den Suchstring an allen Zeichen auf, die keine Buchstaben sind
    • wirf die Fragmente weg, die dann nur noch einen Buchstaben haben (z.B. weil Gustav's in Gustav und s zerlegt wurde)
    • suche nach jedem der übriggebliebenen Begriffe einzeln
    • Bilde am Schluss die Schnittmenge (UND) oder Obermenge (ODER) der erhaltenen Teilmengen So eliminierst du auch die Reihenfolge der Keywords.

    Bei Eingabe mit Gänsefüßen "shanty chor" ist das Leerzeichen relevant.

    Okay, das ist dann ein Sonderfall, den du beim Parsen in Schritt 1 berücksichtigen musst.

    Alternativer Ansatz: Nach mehreren Worten suche ich einzeln, dann werden auch Dreher gefunden und Feldinhalte, in denen die Worte in anderer Reihenfolge vorkommen:

    Ach, genau. Eben sag ich's noch ... ;-)

    Wie könnte ich die Ausgabe sortieren, dass die meisten Übereinstimmungen zuerst kommen?

    Indem du zu jeder Teilsuche die Zahl der Treffer mitführst?

    So long,
     Martin

    --
    Wovon träumt eine Katze nachts? - Von einem prächtigen Muskelkater.
  2. problematische Seite

    Ist es gleichwertig, ob ich mit UPPER oder mit LOWER arbeite?

    Was wäre UPPER("ß") ?

    1. problematische Seite

      Hallo Linuchs,

      UPPER("ß") == "ẞ" (großes ẞ)

      Aber ich würde keine edlen Körperteile drauf verwetten, dass das alle Systeme korrekt unterstützen. Ob Du mit LOWER besser bedient bist, kann ich allerdings auch nicht sagen.

      Sicherer wäre vermutlich, ß und ẞ durch ss zu ersetzen. Analog alle Akzentzeichen. Bzw wenn Du in MYSQL suchst, überlass das dem Burschen, in dem Du eine Collation mit ci und ai verwendest (case insensitive, accent insensitive). Ich weiß allerdings nicht ab welcher MYSQL Version die ai Collations unterstützt werden.

      Was ist eigentlich, wenn Dir jemand Shantychor eingibt? Soll auch dann Shanty gefunden werden? Sprich: Brauchst Du ein Wörterbuch, um zusammengesetzte Begriffe zu erkennen (ohne Wörterbuch kann das schief gehen, siehe Urinstinkt)? Ein Wörterbuch könnte Dir dann auch Flexionen in Grundformen übersetzen und die Schreibweise neutralisieren. Was im Wörterbuch drinsteht, kann sich auf Grund deiner Stichworte entwickeln. Trivial ist die Sache jedenfalls nicht. Suchmaschinen sind nicht ohne Grund kompliziert.

      Wenn deine Seite komplett Google-indiziert ist, könntest Du auch einfach frech die Google-Suche nutzen und site:remso.eu hinzufügen...

      Rolf

      --
      sumpsi - posui - clusi
  3. problematische Seite

    Tipp: Die MySQL Doku beschreibt sehr ausführlich wie man eine Volltextsuche realisiert. Und wie man sie verfeinert. MFG

    1. problematische Seite

      wie man eine Volltextsuche realisiert.

      Da habe ich mich nie rangetraut als Bangebüx, dass die Suche zu lange läuft.

      Die Zahl meiner Datensätze ist nur ein kleiner 4-stelliger Wert, da mag das noch akzeptabel sein.

      Hat jemand Erfahrung mit Volltextsuche gegen Suche in einem bestimmten Datenfeld (Titel) bei 1500 Datensätzen?

      1. problematische Seite

        Hallo Linuchs,

        die 1500 ist nicht das alleinige Kriterium. Wieviele User pro Sekunde machen das gleichzeitig?

        Rolf

        --
        sumpsi - posui - clusi
  4. problematische Seite

    4 Stunden später, ich habe das erstmal so gelöst (Helptext für das Suchfeld):

    such_TID_titel