Autovervollständigen
Gast
- php
Hallo,
habe es lange vor mir hergeschoben, aber jetzt muss ich mich mit Autovervollständigen beschäftigen. Es geht um das Vorschlagen von Städtenamen.Immer ein Ärgernis, wenn man die richtige "Neustadt" nicht findet.
Merkwürdig, dass die Suche hier zu diesem Stichwort nichts ausspuckt.
Gibt es eine schlanke Einführung? Im Prinzip muss ich wohl
* die getippten Buchstaben per Ajax an den Server senden. Ich denke ab drei Buchstaben macht das Sinn,
* dort ein PHP- Programm haben, das in der Datenbank nachschaut und fünf (?) Ergebnisse zurückmeldet, vielleicht abhängig von den (von anderen Besuchern) zuvor gesuchten Städten? Ich merke mir die gesuchten Worte und zähle die Suchvorgänge pro Wort. So merke ich, dass vielleicht immer nach "Prag" gesucht wird, obwohl die Stadt "Praha" heisst.
* und jetzt Neuland für mich: Ich muss eine Auswahlliste aufmachen und per Up/Down Taste oder Maus aus dem Eingabefeld raus in diese Liste. Wie das geht, ist mir nicht klar, da hätte ich gerne ein Beispiel zum Anschauen. Bei Google blicke ich nicht durch.
Gruß, Gast
Tach!
Gibt es eine schlanke Einführung? Im Prinzip muss ich wohl
Das Prinzip hast du ja schon verstanden. Beim PHP-Teil ...
* dort ein PHP- Programm haben, das in der Datenbank nachschaut und fünf (?) Ergebnisse zurückmeldet, vielleicht abhängig von den (von anderen Besuchern) zuvor gesuchten Städten? Ich merke mir die gesuchten Worte und zähle die Suchvorgänge pro Wort. So merke ich, dass vielleicht immer nach "Prag" gesucht wird, obwohl die Stadt "Praha" heisst.
... ist die Frage, wie komplex es am Ende werden soll. Bringt die Statistik etwas? Ist es wirklich so, dass die meist gesuchten oben stehen sollen oder vielleicht nicht doch lieber eine alphabetische Liste (oder gar eine Kombination aus beiden)? Merken was gesucht wird, kannst du sinnvoll erst nach der Auswahl, sonst hast du einen Haufen unvollständiger Eingabeversuche in der Statistik, die du irgendwie mit den tatsächlichen Einträgen in Übereinstimmung bringen musst. Der Statistik-Eintrag kann also erst nach der Auswahl aus der Liste (per Ajax an den Server übertragen) oder der Einfachheit halber nach dem Absenden des Formulars vorgenommen werden.
* die getippten Buchstaben per Ajax an den Server senden. Ich denke ab drei Buchstaben macht das Sinn,
* und jetzt Neuland für mich: Ich muss eine Auswahlliste aufmachen und per Up/Down Taste oder Maus aus dem Eingabefeld raus in diese Liste. Wie das geht, ist mir nicht klar, da hätte ich gerne ein Beispiel zum Anschauen.
Hier würde ich einfach eine fertige Komponente aus einer Javascript-Bibliothek verwenden. Die sollte auch so dokumentiert sein, dass du sie in dein Projekt integrieren kannst. Die Schnittstellen zum PHP-Teil dürften übersichtlich sein und mit letzterem hast du noch genug eigene Arbeit.
dedlfix.
Hallo dedlfix,
... ist die Frage, wie komplex es am Ende werden soll. Bringt die Statistik etwas? Ist es wirklich so, dass die meist gesuchten oben stehen sollen oder vielleicht nicht doch lieber eine alphabetische Liste (oder gar eine Kombination aus beiden)?
Tja, da muss ich experimentieren. Habe eben mal in die Datenbank geschaut. Bei den drei Buchstaben "neu" am Wortanfang gibt es 162 Treffer. Die alfabetisch erste "Neustadt" ist Nr. 138 Neustadt (Hessen), davor sowas wie Neu-Darchau, Neumünster, Neunkirchen.
Also alfabetisch macht es keinen Sinn.
Ich stelle mir solche Fragen am Anfang. Ist blöd, wenn man eine Woche Arbeit in die Programmierung steckt und dann feststellt, dass das Problem gar nicht lösbar ist.
Merken was gesucht wird, kannst du sinnvoll erst nach der Auswahl, sonst hast du einen Haufen unvollständiger Eingabeversuche in der Statistik, die du irgendwie mit den tatsächlichen Einträgen in Übereinstimmung bringen musst. Der Statistik-Eintrag kann also erst nach der Auswahl aus der Liste (per Ajax an den Server übertragen) oder der Einfachheit halber nach dem Absenden des Formulars vorgenommen werden.
Logisch, dass ich nur Treffer vorschlage, die es wirklich gibt. Bei Youtube habe ich es öfter, dass Wortkombinationen im Suchfeld vorgeschlagen werden, die aber rein gar nichts mit den dann gefundenen Treffern zu tun haben.
Hier würde ich einfach eine fertige Komponente aus einer Javascript-Bibliothek verwenden.
Tipp?
Gruß, Gast
Tach!
Hier würde ich einfach eine fertige Komponente aus einer Javascript-Bibliothek verwenden.
Tipp?
Ich würde es im jQuery-Umfeld suchen, weil ich damit schon ein paar Erfahrungen habe. Aber Autovervollständigen ist recht populär und sicher überall in ausreichender Qualität zu haben.
dedlfix.
Also alfabetisch macht es keinen Sinn.
Uups - Denkfehler.
Nach drei Buchstaben kann keiner verlangen, dass einer von fünf Vorschlägen _der_ Treffer ist. Also
"neus" - 33 Datensätze
"neust" - 20 Datensätze
"neusta" - 18
"neustadt" - immer noch 18
Hmm - **grübel**
Sorry, wenn ich jetzt mal hier öffentlich "laut denke". Hoffe, nützliche Kommentare zu ernten.
Kann man einem unbedarften Webseiten-Besucher eine Suchmaske verständlich machen?
Er wird vielleicht zu "seiner" Neustadt noch wissen, dass da ein Berg ist. Die Eingabe "nestadt*berg" ergibt dann einen Treffer "Neustadt am Rübenberge".
Nur doof, bei "Neustadt an der Weinstraße" ist auch ein Berg (weiss ich zufällig).
**grübel**
Hi,
Kann man einem unbedarften Webseiten-Besucher eine Suchmaske verständlich machen?
Wie viel verständlicher als „*Name* der Stadt“ kannst du dir noch vorstellen?
Er wird vielleicht zu "seiner" Neustadt noch wissen, dass da ein Berg ist. Die Eingabe "nestadt*berg" ergibt dann einen Treffer "Neustadt am Rübenberge".
Nur doof, bei "Neustadt an der Weinstraße" ist auch ein Berg (weiss ich zufällig).
Wenn er Neustädte finden will, die einen Berg „haben“ – dann soll er googlen gehen.
Ansonsten, vielleicht noch Bundesland und/oder Postleitzahl(-enbereich) mit den Suchergebnissen mit ausgeben – dann fällt die Zuordnung, welche der vielen Neustädte „seine“ ist, vielleicht etwas leichter.
MfG ChrisB
hi,
gute idee das laut denken!
nim als trenner das leerzeichen
ich gebe bei Google ja auch z.b. "neustadt weinstraße" ein.
Wie gehst du eigentlich mit sachen wie "Altneustadt" um? (name ausgedacht)
Gehört das auch zu deinen Treffern oder frägst du hart ab. Also beginnent beim ersten Zeichen?
zu meinem obrigen beispiel z.b.: "Weinstraße Neustadt" da hätte ich gerne das selbe ergebnis wie bei "Neustadt Weinstrasse" oder "Neustadt Weinstraße"
Oh verdammt bin ich heute fies =P
Aber ich denke genau das übersieht man leider viel zu leicht bei so einer Logik. (ae = ä, s und ss, ...)
Gruß Niklas
Tach!
(ae = ä, s und ss, ...)
Wenn das DBMS MySQL heißt, dann ist diese Gleichsetzung neben Groß-/Kleinschreibung schon über die Wahl einer passenden Kollation gegeben und man kann sich Kopfstände diesbezüglich sparen. (Andere DBMS kennen vielleicht ähnliche Features.)
dedlfix.
Tach!
(ae = ä, s und ss, ...)
Wenn das DBMS MySQL heißt, dann ist diese Gleichsetzung neben Groß-/Kleinschreibung schon über die Wahl einer passenden Kollation gegeben und man kann sich Kopfstände diesbezüglich sparen. (Andere DBMS kennen vielleicht ähnliche Features.)
Zumindest bei der Sortierung habe ich schon damit experimentiert.
Muder
Müller (richtig eingeordnet)
Muffler
Beim Thema "finden" muss ich mal gucken, ob das Sinn macht. Wenn ich nach ü suche, möchte ich nicht finden:
09392 Auerbach (!= Aürbach)
78166 Donaueschingen (!= Donaüschingen)
Gast
hi,
oh noch eine vorlage um das Kaffee angebot einzufrieren:
Wie man gut erkennt, sind hier Worte/Namen gegeben, die man nicht verunstalten sollte "Donau". Und davon rutsche ich schon mal in das nächste Thema Rhein ... den Rhein. Wenn ichs dummerweise ohne h schreiben, werde ich nichts finden ...
So eine Suche ist anspruchsvoll, ich denke da gibts auch Möglichkeiten der Optimierung je öfters gesucht wurde. Google kann z.b. auch noch darauf zurück greifen, was andere suchen. (Such mal nach "darf ich mit einer", da schlägt er dir nichts vor wie "Darf ich mit einer Ameise spielen" (Alphabet wäre ja das zu erst ;) ). Ich glaub damit wäre die Suche abgerundet ^^
(Wundert es einen da noch, dass die Leute die so etwas Programmieren, viel Geld verdienen?)
Gruß Niklas
Hallo, Niklas,
... Und davon rutsche ich schon mal in das nächste Thema Rhein ... den Rhein. Wenn ichs dummerweise ohne h schreiben, werde ich nichts finden ...
Okay, ausprobiert. Eingabe "rein". Ausgabe:
lfd;name;land_kz;plz;id;name_zusatz;name_dialekt;keywords;lauf
1;Reinbek;D;21465;6077;;;;2
2;Reinfeld (Holstein);D;23858;6285;;;;2
3;Reinhardshagen;D;34359;7267;;;;2
4;Reinheim;D;64354;9192;;;;2
5;Reinsberg;D;09629;5665;;;;2
6;Reinsdorf;D;08141;5521;;;;2
7;Reinsfeld;D;54421;8542;;;;2
8;Reinstorf;D;21400;6060;;;;2
9;Freinsheim;D;67251;9463;;;;3
10;Rain;D;86641;11274;;;;5
Erklärung:
Es gibt keinen Ort namens "rein", also kein Treffer bei Durchlauf 1.
In Lauf 2 wird nach "rein%" gesucht, Treffer 1 - 8.
Weil 10 Treffer noch nicht voll sind, Lauf 3 mit "%rein%" und Treffer 9.
Weiter mit Lauf 4, der Leerstellen zu % macht, fruchtet hier nicht.
Also Lauf 5 mit "SOUNDS LIKE" ergibt den Treffer 10.
So eine Suche ist anspruchsvoll ... (Wundert es einen da noch, dass die Leute die so etwas Programmieren, viel Geld verdienen?)
Und ich Depp mache es in diesem Fall ehrenamtlich. Aber es schult natürlich für Kundenaufträge.
Gruß Gast
hi,
Hallo, Niklas,
... Und davon rutsche ich schon mal in das nächste Thema Rhein ... den Rhein. Wenn ichs dummerweise ohne h schreiben, werde ich nichts finden ...
Okay, ausprobiert. Eingabe "rein". Ausgabe:
lfd;name;land_kz;plz;id;name_zusatz;name_dialekt;keywords;lauf
1;Reinbek;D;21465;6077;;;;2
2;Reinfeld (Holstein);D;23858;6285;;;;2
3;Reinhardshagen;D;34359;7267;;;;2
4;Reinheim;D;64354;9192;;;;2
5;Reinsberg;D;09629;5665;;;;2
6;Reinsdorf;D;08141;5521;;;;2
7;Reinsfeld;D;54421;8542;;;;2
8;Reinstorf;D;21400;6060;;;;2
9;Freinsheim;D;67251;9463;;;;3
10;Rain;D;86641;11274;;;;5Erklärung:
Es gibt keinen Ort namens "rein", also kein Treffer bei Durchlauf 1.
In Lauf 2 wird nach "rein%" gesucht, Treffer 1 - 8.
Weil 10 Treffer noch nicht voll sind, Lauf 3 mit "%rein%" und Treffer 9.
Weiter mit Lauf 4, der Leerstellen zu % macht, fruchtet hier nicht.
Also Lauf 5 mit "SOUNDS LIKE" ergibt den Treffer 10.
Und mein gesuchtes Hartheim am Rhein (oder Hartheim am Rein) oder Rheinfelden (also Reinfelden)? ;)
Das erste Beispiel ist fies, da der ort dieses Jahr erst umbenannt wurde und das "am Rhein" dazu kam. Also das 2. ist für deine Datenbank realistisch und müsste wohl nicht zu finden sein mit reinfelden.
Wären so testdaten, die ich als hier ortskundiger ausprobieren würde =P
finde dein vorgehen sehr gut. Das solange weiter suchen zu lassen, bis 10 einträge da sind! (und das du es hier so ausführlich erklärst warum es gefunden wurde, find ich sehr bemerkenswert!!!)
So eine Suche ist anspruchsvoll ... (Wundert es einen da noch, dass die Leute die so etwas Programmieren, viel Geld verdienen?)
Und ich Depp mache es in diesem Fall ehrenamtlich. Aber es schult natürlich für Kundenaufträge.
So sehe ich mein helfen hier im Forum immer, es schult und regt die gedanken an. Zudem komme ich so auf lösungen für eigene themen (die nichts mit den themen hier zutun haben ^^
Gruß Gast
Gruß Niklas
Hallo, Niklas,
Und mein gesuchtes Hartheim am Rhein (oder Hartheim am Rein) oder Rheinfelden (also Reinfelden)? ;)
Okay, habe D-79258 Hartheim umbenannt in "Hartheim am Rhein" und nun schaunmermal:
Eingabe: "Hartheim am Rein". Ausgabe:
lfd;name;land_kz;plz;id;name_zusatz;name_dialekt;keywords;lauf
1;Hartheim am Rhein;D;79258;10537;;;;5
Okay, keine Treffer bis auf Lauf 5 "SOUNDS LIKE". Schöner Test.
Eingabe: "Reinfelden". Ausgabe:
Keinen Ort «Reinfelden» gefunden
Würde dir gerne die Webseite zum Testen preisgeben, möchte hier aber nicht meine Anonymität aufgeben. Kannst du mir deine Mail übermitteln, ohne dass man sie jahrzehnteleng bei Google wiederfindet?
So in der Form meinname bei abc punkt def oder ähnlich.
Gast
hi,
lustiger Test, da hab ich wohl genau das getroffen, was du gesucht hast ;)
meine Adresse ist einfach. Meinen Nutzernamen teilen beim k, davor ein @ einfügen und das ganze mit einem .net zur Adresse vollenden.
Stehe dort auch immer für Fragen zur verfügung, die man nicht immer direkt hier posten wollte =)
Gruß Niklas
[latex]Mae govannen![/latex]
meine Adresse ist einfach. Meinen Nutzernamen teilen beim k,
niklas kamenisch
niklask amenisch
davor ein @ einfügen
@niklas kamenisch
@niklask amenisch
SCNR
Stur lächeln und winken, Männer!
Kai
hi,
meine Adresse ist einfach. Meinen Nutzernamen teilen beim k,
niklas kamenisch
niklask amenischdavor ein @ einfügen
@niklas kamenisch
@niklask amenisch
Ich glaub ich formuuliere es mal mit php ewas um:
$name = "niklaskamenisch";
$endung = "net";
$vorname = substr($name, 0, 6);
$nachname = substr($name, 6);
$mail = $vorname."@".$nachname.$endung;
oder lieber noch mit str_replace?
$vorlage = 'vorname@nachname.net';
$mail = str_replace("vorname","niklas",$vorlage);
$mail = str_replace("nachname","kamenisch",$mail);
Man könnte das auch noch von hinten her das "k" suchen und damit arbeiten ;)
dann wäre meine Erklärung wenigstens 1zu1 ersetzt.
Ach ja, du hattest "ni klaskamenisch" bzw. "nik laskamenisch" vergessen ^^
Gruß Niklas
hi,
also ich habe ja schon eine selbstgebaute Suchfunktion, die ist aber hakelig. Wenn mehrere Worte eingegeben werden, könnte das erste die Kfz-Nationalkennung sein, das zweite der Postcode, dann Name.
Habe mal testweise "au" eigegeben, der von dir genannte Ort. Er ist in der Datenbank (D-79280 Au). Aber Antwort: D-07955 Auma (Thüringen), wahrscheinlich von allen au* der kleinste Postcode.
* bis zu 3 Buchstaben am Anfang wird als Kfz-Nationalkennzeichen interpretiert (falls es einen Ort "aus" geben sollte, wird der in Australien gesucht - schlecht)
* 6 Zahlen/Buchstaben könnten Postcode sein oder Name
* ab Wort Nr. 3 auf jeden Fall Name
ich gebe bei Google ja auch z.b. "neustadt weinstraße" ein.
Das klappt bei mir (D-67433 Neustadt an der Weinstraße). Durchlaufe mehrere Schleifen, setze den Datenbank-Joker % erst hinten an, dann vorne, dann alle Leerstellen.
Bei den nicht gefundenen Suchbegriffen sehe ich aber, dass unsere Deutschzeichen äöüß Probleme machen. Das ist aber eine Extra- Baustelle.
Wie gehst du eigentlich mit sachen wie "Altneustadt" um? (name ausgedacht)
Error: Land «», Postcode «%%» und Ort «%ALTNEUSTADT%» not found.
Gehört das auch zu deinen Treffern oder frägst du hart ab. Also beginnent beim ersten Zeichen?
Nein, Worte nehme ich nicht auseinander. "alt neustadt" (zwei Worte) findet D-19306 Neustadt-Glewe und "altneu stadt" D-01829 Stadt Wehlen.
zu meinem obrigen beispiel z.b.: "Weinstraße Neustadt" da hätte ich gerne das selbe ergebnis wie bei "Neustadt Weinstrasse" oder "Neustadt Weinstraße"
Uups - wird beides richtig gefunden. **such** Nee, die Datenbank und das Programm gibt das nicht her. Ist vielleicht eine Eigenschaft von MySQL LIKE ? (ß=ss) **test** Lueneburg (statt Lüneburg) - wird nicht gefunden. Üdem statt Uedem auch nicht.
Oh verdammt bin ich heute fies =P
Ja, deshalb gibt's auch keinen Kaffee, den sonst jeder bei mir bekommt.
Gruß, Gast
Tach!
Uups - wird beides richtig gefunden. **such** Nee, die Datenbank und das Programm gibt das nicht her. Ist vielleicht eine Eigenschaft von MySQL LIKE ? (ß=ss) **test** Lueneburg (statt Lüneburg) - wird nicht gefunden. Üdem statt Uedem auch nicht.
Das ist eine Frage der Kollation, welche Umlaute etc. welchen anderen Zeichen gleichgesetzt sind. Was ist denn da für das betroffene Feld konfiguriert?
dedlfix.
Moin,
Das ist eine Frage der Kollation, welche Umlaute etc. welchen anderen Zeichen gleichgesetzt sind. Was ist denn da für das betroffene Feld konfiguriert?
utf8_unicode_ci
Ich denke, die Umlautbehandlung gehört nicht in ein utf8 Feld? Das kann ja auch japanische Schriftzeichen enthalten.
Gast
Tach!
Das ist eine Frage der Kollation, welche Umlaute etc. welchen anderen Zeichen gleichgesetzt sind. Was ist denn da für das betroffene Feld konfiguriert?
utf8_unicode_ci
Ich denke, die Umlautbehandlung gehört nicht in ein utf8 Feld? Das kann ja auch japanische Schriftzeichen enthalten.
Die Zeichenkodierung ist wichtig, damit der Server weiß, was die Bytes in den Feldern für eine Bedeutung haben, für welches Zeichen sie stehen. utf8(mb4) oder latin1 oder was anderes sagt nur aus, welche Zeichen überhaupt abgelegt werden können und in welcher Form dies geschieht. Die Kollationsangabe ist ein Zusatz und ein Default-Wert, der dann beschreibt, wie die Zeichen der Inhalte beispielsweise zu vergleichen sind.
Ein Vergleichen von Strings unterschiedlicher Schriftsysteme ist in der Regel nicht sinnvoll. Selbst wenn du Texte aus mehreren auf lateinischen Buchstaben basierenden Sprachen in einem Feld ablegst, scheiterst du, wenn du sprachindividuell entscheiden möchtest. Dazu fehlt dir nicht nur die Meta-Information zur Sprache jedes einzelnen Feldinhalts. Du kannst jedenfalls immer nur einen Satz von Sortierregeln berücksichtigen. Diese kann durchaus eine andere sein als für das Feld per Default festgelegt ist.
Du solltest hier nicht alle möglichen theoretischen Fälle berücksichtigen, sondern das was deine Anwender wirklich benötigen. Wieviele davon können überhaupt andere Schriftsysteme verstehen? Und willst du am Ende wirklich die Begriffe in Originalsprache und -schreibung ablegen, auf dass sie das Zielpublikum nicht findet, weil es an fremden Schriftsystemen und zu ihren eigenen Scheibweisen abweichenden Notationen scheitert?
dedlfix.
Wenn jemand unbedingt nach "Neustadt" sucht und nicht weiß, wo sich dieses befindet, brauchst und kannst du ihm mit der Autovervollständigung auch nicht helfen. Überdies ist Neustadt u.U. ein Spezialfall, dann erhält er eben 20 Treffer als Auswahl.
hi,
Gibt es eine schlanke Einführung? Im Prinzip muss ich wohl
* die getippten Buchstaben per Ajax an den Server senden. Ich denke ab drei Buchstaben macht das Sinn,
Wir haben hier einen Ort der heißt "Au" und ich weiß den gibt es noch mal irgendwo (ob in deutschland weiß ich nicht). Auf jeden Fall sind es 2 Buchstaben. Wie oft so was vokommt, müsstest du selber mal ermitteln und für dich entscheiden ob 3 vllt doch ausreicht.
Bei den Ergebnissen beachte bitte, dass ich ja vllt den Ortsteil eingegeben habe und trotzdem gernen ein Ergebnis hätte. Berlin-...
* dort ein PHP- Programm haben, das in der Datenbank nachschaut und fünf (?) Ergebnisse zurückmeldet, vielleicht abhängig von den (von anderen Besuchern) zuvor gesuchten Städten? Ich merke mir die gesuchten Worte und zähle die Suchvorgänge pro Wort. So merke ich, dass vielleicht immer nach "Prag" gesucht wird, obwohl die Stadt "Praha" heisst.
So wie es sich anhört musst du das wirklich angeklickt irgendwie loggen und ein Ranking erstellen. Dadrüber kannst du dann sortieren. Einfache klicks würden als beispiel reichen. Das meist angeklickte nach oben. Oder doch die Stadt die am größten ist bzw in meinem Land? Ber (Berlin oder Bern nach oben?)
* und jetzt Neuland für mich: Ich muss eine Auswahlliste aufmachen und per Up/Down Taste oder Maus aus dem Eingabefeld raus in diese Liste. Wie das geht, ist mir nicht klar, da hätte ich gerne ein Beispiel zum Anschauen. Bei Google blicke ich nicht durch.
Ich habe das vor kurzem mal selber nachbasteln müssen. So quasi ein gefaketes dropdown menü. Oder Dropdown an eingabefeld. Bin da mit diesen Stichworten ganz gut zurecht gekommen. Link habe ich leider grade keinen für dich und kopieren kann ich dir den Code nicht (know how der firma =P)
Gruß Niklas
Bei den Ergebnissen beachte bitte, dass ich ja vllt den Ortsteil eingegeben habe und trotzdem gernen ein Ergebnis hätte. Berlin-...
Meine Basis ist die Open Geo DB, Stand vor etwa fünf Jahren.
Die vielen Berline unterscheiden sich dort nur im Postcode. Ich habe zusätzliche Felder
* name_zusatz (kann der zur PLZ gehörende Ortsteil sein, aber auch eine übergeordnete Verwaltungseinheit, etwa Samtgemeinde)
* name_dialekt
* keywords
und nutze die bei der Suche. So kann ich unter "Fishtown" mit "Bremerhaven" antworten ;-)
Aber die müssen natürlich von Hand gepflegt werden. Klar, dass man "Praha" auch unter "Prag,Prague" findet. Aber eben nur zufällig, weil mir diese Keywords eingefallen sind.
Gast
Hallo,
wenn ich nach "rotenburg tauber" suche, findet der (die das Google?) "Rothenburg ob der Tauber", also mit th.
Gibt es da irgendwie einen einfachen Trick, den Linguisten beherrschen, ich aber nicht? Also etwa die Regeln nach der dritten ostmongolischen Lautverschiebung oder wie das heißt?
Gast
Hi,
wenn ich nach "rotenburg tauber" suche, findet der (die das Google?) "Rothenburg ob der Tauber", also mit th.
Gibt es da irgendwie einen einfachen Trick, den Linguisten beherrschen, ich aber nicht? Also etwa die Regeln nach der dritten ostmongolischen Lautverschiebung oder wie das heißt?
Hilft das?
http://de.wikipedia.org/wiki/Phonetische_Suche
http://www.phpgangsta.de/meinten-sie-eingaben-verbessern-mit-levenshtein-und-soundex
in diesem Zusammenhang noch
http://de.wikipedia.org/wiki/Kölner_Phonetik
in diesem Zusammenhang noch
http://de.wikipedia.org/wiki/Kölner_Phonetik
Danke dir, in die drei Quellen habe ich kurz reingeschaut. Ist sicher wert, aufmerksam gelesen zu werden.
Im Moment gefällt mir meine eigene schlanke Lösung ganz gut (114 Codezeilen plus iclude für DB-Öffnen) mit 5 Durchläufen. Dabei stehen die vermutlich besten Treffer oben. Wenn mehr als 10 Treffer gefunden wurden, werden weitere Durchläufe gebremst (break).
for( $i; $i<5; $i++ )
... (Daten lesen, neue speichern)
if ( $i == 0 ) $such_ort = $such_ort."%";
else if ( $i == 1 ) $such_ort = "%".$such_ort;
else if ( $i == 2 ) $such_ort = str_replace(" ","%",$such_ort);
else if ( $i == 3 )
{
$arr_search = array("ä","ö","ü","ß","ae","oe","ue","ss");
$arr_replace = array("ae","oe","ue","ss","ä","ö","ü","ß");
$such_ort = str_replace($arr_search,$arr_replace,$such_ort);
}
endfor
Zum Schluss tausche ich also noch die Umlaute gegen zwei Buchstaben und umgekehrt.
Beispiel-Eingabe: "dürk". Ausgabe:
lfd;name;land_kz;plz;id;name_zusatz;keywords;lauf
1;Bad Dürkheim;D;67098;9433;;;2
2;Dorn-Dürkheim;D;67585;9527;;;2
3;Worms;D;67550;9518;Herrnsheim, Rheindürkheim;;2
Also alle werden gefunden nachdem $i == 1
Gebt mir bitte mal ein paar Beispiele zum Testen.
Gast
Hi,
Im Moment gefällt mir meine eigene schlanke Lösung ganz gut (114 Codezeilen plus iclude für DB-Öffnen) mit 5 Durchläufen. Dabei stehen die vermutlich besten Treffer oben. Wenn mehr als 10 Treffer gefunden wurden, werden weitere Durchläufe gebremst (break).
und du frägst dann jedesmal die DB an mit LIKE, oder?
Hi,
Im Moment gefällt mir meine eigene schlanke Lösung ganz gut (114 Codezeilen plus iclude für DB-Öffnen) mit 5 Durchläufen. Dabei stehen die vermutlich besten Treffer oben. Wenn mehr als 10 Treffer gefunden wurden, werden weitere Durchläufe gebremst (break).
und du frägst dann jedesmal die DB an mit LIKE, oder?
Ja. Habe jetzt noch den SOUNDS LIKE als weiteren Durchlauf hinzugefügt:
$q = "
SELECT
ort1.id
,ort1.land_kz
,ort1.plz
,ort1.name
,ort1.name_zusatz
,ort1.name_dialekt
,ort1.keywords
FROM orte ort1
";
if ( $i < 5 ) $q .= "
WHERE ort1.name LIKE \"".$such_ort."\"
OR ort1.name_zusatz LIKE \"".$such_ort."\"
OR ort1.name_dialekt LIKE \"".$such_ort."\"
OR ort1.keywords LIKE \"".$such_ort."\"
OR ort1.plz LIKE \"".$such_ort."\"
";
else $q .= "
WHERE ort1.name SOUNDS LIKE \"".$arr_in['such_ort']."\"
";
$q .= "
ORDER BY
CONVERT(ort1.name USING latin1) COLLATE latin1_german2_ci
,ort1.land_kz
,ort1.plz
LIMIT 0,30
";
Und selbst, wenn die Laufzeit durch das LIKE nicht optimal wäre ... die Routine wird ja nur angesprungen, wenn ein Mensch etwas eingegeben hat, nicht für jede Anzeige.
Gast
Jetzt habe ich das Problem, dass das Eintippen der Buchstaben schneller ist als die Requests an den Server. Wenn ich bei jedem onKeyUp ein Request mache, wird der schon abgesendet, bevor der vorige beantwortet wurde.
Ich muss also ein onKeyUp- Event "aufbewahren", bis der vorangegenagene Request erledigt ist.
Wenn ich nun aber den "aufbewahrten" Request losschicken will, könnte es sein, dass die Eingabe schon einige Buchstaben weiter ist, also muss ich einige onKeyUp verwerfen.
Ich habe hier was gefunden, werde aber nicht schlau draus, wann das Objekt request frei ist.
Bei readyState 0 ist es gar nicht eingerichtet und bei readyState 1 läuft es schon?
Gast
Hallo,
Jetzt habe ich das Problem, dass das Eintippen der Buchstaben schneller ist als die Requests an den Server. Wenn ich bei jedem onKeyUp ein Request mache, wird der schon abgesendet, bevor der vorige beantwortet wurde.
das wird oft so gelöst, dass man erst dann einen Request mit der vollständigen bisherigen Eingabe sendet, wenn wieder ein wenig "Ruhe" einkehrt, also beispielsweise dann, wenn länger als eine halbe Sekunde keine Taste mehr gedrückt wurde.
Ciao,
Martin
hi,
das problem kenne ich leider auch.
Hatte mir damit geholfen, dass ich die funktion über eine variable gesperrt habe. Sobald diese true ist, geht keine neue anfrage mehr. Das problem ist bei langsamem Internet, dass so die letzten Buchstaben ignoriert werden => nervig.
Für dich ist daher sinnvoller, einen timer zu verwenden, der prüft das nichts eingegeben wird.
Wenn du mehrere Absendest, solltest du eventuell keys mit senden, damit du weißt wer der letzte Antwortende ist => damit du das älteste dann auch nur ausgibst und nichts altes
Gruß Niklas