Beitrag von Hagen (24 Beiträge) am Donnerstag, 22.Februar.2001, 22:42.
Wie finde ich ein Wort oder INNERHALB eines Satzes ???
Vielleicht kann mir jemand helfen, der ein ähnliches Problem hatte :
Ich habe eine Datenbank mit dem Feld "Name"
und dem Inhalt "Hans-Heinrich Friedrich"
Meine Besucher geben nun "Hans Heinrich" oder
"Heinrich Friedrich" oder "Heinrich" oder
"Friedrich" ein ... ;-(
... und der Datensatz wird nicht gefunden,
da BP immer am Anfang des Datensatzes sucht.
Kennt jemand den Perl-Befehl, mit dem ich auch
ein (oder mehrere) Wörter INNERHALB des Datensatzes
finden kann ?
Vielen Dank im Voraus für die Hilfe
Hagen
Antworten
Beitrag von Sander (8133 Beiträge) am Donnerstag, 22.Februar.2001, 23:03.
Re: Wie finde ich ein Wort oder INNERHALB eines Satzes ???
Es ist zur Zeit nur mit viel Perlaufwand möglich, das zu bewerkstelligen. (siehe Volltextsuche in mehreren vergangenen Thread - auch heute)
In der nächsten Version ist es mit implementiert (hat Christoph versprochen).
Sander
Antworten
Beitrag von Stephan Hix (106 Beiträge) am Freitag, 23.Februar.2001, 00:44.
Weil so oft danach gefragt wird ...
... hier eine einfache UND-Suche nach Textbausteinen, d.h. für ein erfolgreiches Suchergebnis müssen ALLE eingegebenen Begriffe gefunden werden.
Aber bitte nicht bei sehr großen Datenbanken einsetzen! Laut Christoph wird da die Serverlast doch etwas heftig (obwohl es doch nur eine loop ist!?)
Ich hoffe, es hilft.
Gruß
Stephan
<do action=all>
# Erläuterung:
$db_feld="Hans-Heinrich Friedrich"; # also das, was in der Datenbank steht
$input="Friedrich Hans"; # das, was gesucht wird, z.B. aus einem Formular
$input=~s/-/\ /g; # Bindestrich in Leerzeichen umwandeln
@suchworte=split(" ",$input); # die Sucheingabe in einzelne Worte aufteilen und in Array speichern
<loop db=datenbankname code=perl> # Aufruf der Datenbank
$i=0; # Zähler auf 0 setzen
foreach (@suchworte){ # gehe alle Suchworte durch
if ($db_feld=~/$suchworte[$_]/){ # wenn das Namensfeld eines der Suchworte enthält
$i++; # Zähler um 1 erhöhen
} # Ende if
} # Ende foreach
if ($i==@suchworte){ # Wenn der Zählerstand gleich der Anzahl der Suchworte ist, also alles gefunden wurde
out <<EOF; # beginne HTML-Code
<p>Datensatz $_id gefunden</p> # hier steht beliebiger HTML-CODE dazwischen
EOF # hier endet der HTML-Code
} # Ende if
</loop> # Ende loop
Antworten
Beitrag von Stephan Hix (106 Beiträge) am Freitag, 23.Februar.2001, 00:52.
Und die Korrektur - Flüchtigkeitsfehler ;-)
nach dem <do action ...
die ersten beiden $ sind nur Erklärung, die müssen raus!
danach fehlt ein <perl> (vor dem $input=~ ...)
und vor das erste <loop ... muss ein </perl>
Sorry.
Gruß
Stephan
Antworten
Beitrag von Ivan (14 Beiträge) am Freitag, 23.Februar.2001, 10:41.
Re: Und die Korrektur - Flüchtigkeitsfehler ;-)
Vielleicht bin ich noch sehr verschlafen, aber ich bekomme immer wieder ein Fehlermeldung wenn ich diese vorschlag verwende:
[error (loop): Unrecognized character \240 at (eval 48) line 5. ][error (loop): Unrecognized character \240 at (eval 54) line 5. ] # Ende loop
Was habe ich da falsch gemacht? Habe db_feld mit mein feldname ersetzt, und db_datenbankname mit mein datenbankname, aber es geht irgendwie nicht so wie ich es mir vorstelle.
Sorry, falls dies ein Newby fehler ist, kenntnis ill gelernt werden (auch mit erklärungen)
Danke
Ivan
Antworten
Beitrag von Stephan Hix (106 Beiträge) am Freitag, 23.Februar.2001, 11:10.
Uuups! Da muss der Kommentar raus ...
Hallo Ivan!
Da wollte ich zu genau erklären ;-)
Mit </loop> beendet man in diesem Fall auch den Abschnitt mit Perl-Code. Und da passt es halt nicht, wenn dahinter noch in Perl kommentiert wird. Nimm also den Kommentar "# Ende loop" aus dem Code, dann sollte es gehen.
Gruß
Stephan
Antworten
Beitrag von Ivan (14 Beiträge) am Freitag, 23.Februar.2001, 11:30.
Re: Uuups! Da muss der Kommentar raus ...
Hi Stephan,
Man ich bin begeistert wie schnell alles gehen kann!!! Danke als erste, aber leider geht's noch immer nicht,
Ich habe zwar jetzt die #Ende loop nicht mehr in mein fehlermeldung, es kommt aber noch immer zu:
[error (loop): Unrecognized character \240 at (eval 1136) line 5. ][error (loop): Unrecognized character \240 at (eval 1142) line 5. ]
Jedesmal wenn ich ein re-load vom die seite mache, ändert sich die (eval ****) werte. Es muß was kleines sein, aber ich sehe es einfach nicht!!
Danke
Ivan
Antworten
Beitrag von Ivan (14 Beiträge) am Freitag, 23.Februar.2001, 11:48.
Re: Uuups! Da muss der Kommentar raus ...
Hi Stephan,
Man ich bin begeistert wie schnell alles gehen kann!!! Danke als erste, aber leider geht's noch immer nicht,
Ich habe zwar jetzt die #Ende loop nicht mehr in mein fehlermeldung, es kommt aber noch immer zu:
[error (loop): Unrecognized character \240 at (eval 1136) line 5. ][error (loop): Unrecognized character \240 at (eval 1142) line 5. ]
Jedesmal wenn ich ein re-load vom die seite mache, ändert sich die (eval ****) werte. Es muß was kleines sein, aber ich sehe es einfach nicht!!
Danke
Ivan
Antworten
Beitrag von Stephan Hix (106 Beiträge) am Freitag, 23.Februar.2001, 12:19.
Okay, es war spät :-) Anbei verbesserter Code - getestet!
<!--
# Erläuterung:
# Gefragt war nach einer Lösung für das Problem, dass ein in der Datenbank gespeicherter
# Name gefunden werden soll, auch wenn er etwas ungenau geschrieben wurde.
//-->
<!-- Beginn Variablendefinition für Perl und Datenvorbereitung //-->
<perl>
# Variablendefinition
$db_feld="Hans-Heinrich Friedrich"; # also das, was in der Datenbank steht, könnte auch =$name sein
# oder auch mehrere Felder =$name.$text.$strasse.$ort
$input="Friedrich Hans"; # das, was gesucht wird, z.B. aus einem Formular
$datenbankname="Namensregister"; # Name der BP-Datenbank eingeben
# Vorbereitung der Daten
$input=~s/-/\ /g; # Bindestrich in Leerzeichen umwandeln
$input=lc($input); # in Kleinbuchstaben umwandeln
@suchworte=split(" ",$input); # die Sucheingabe in einzelne Worte aufteilen und in Array speichern
</perl>
<!-- Ende Variablendefinition für Perl und Datenvorbereitung //-->
<!-- Beginn der Datenbankabfrage //-->
<loop db=$datenbankname code=perl>
$i=0; # Zähler auf 0 setzen
foreach (@suchworte){ # gehe alle Suchworte durch
$suchworte=lc($suchworte); # in Kleinbuchstaben umwandeln
if ($db_feld=~/$suchworte/){ # wenn das Namensfeld eines der Suchworte enthält
$i++; # Zähler um 1 erhöhen
} # Ende if
} # Ende foreach
out "<p>Sie haben nach <b>$input</b> gesucht:</p>"; # So kann man in Perl HTML ausgeben
if ($i==@suchworte){ # Wenn der Zählerstand gleich der Anzahl der Suchworte ist, also alles gefunden wurde
out <<EOF;
<!-- ab hier HTML schreiben //-->
<p>Datensatz $_id enthält alle Suchworte.</p>
<!-- Ende HTML //-->
EOF
} # Ende if
</loop>
<!-- Ende der Datenbankabfrage //-->
Antworten
Beitrag von Ivan (14 Beiträge) am Freitag, 23.Februar.2001, 12:56.
Re: Okay, es war spät :-) Anbei verbesserter Code - getestet!
Hi Stephan,
Tut mir leidt wegen die 2 postings, war nicht als druckmacher gemeint, mein browser ist anscheinend irgendwie nochmals dazugekommen.
Danke für deine mühe, aber jetzt kommt etwas anderes wieder als fehlermeldung:
[error (loop): Can't find string terminator " EOF" anywhere before EOF at (eval 640) line 18. ][error (loop): Can't find string terminator " EOF" anywhere before EOF at (eval 646) line 18. ]
Ich habe wegen EOF nachgelesen, und es scheint daß alles in ordnung ist - als erste ist out<<EOF; und dann auf eine eigene zeile nur EOF.
Kann es sein daß es mit ein copy + paste problem zu hat , da ich dein script mit copy+paste eingefüt habe.
Danke nochmals für deine mühe!!
Ivan
Antworten
Beitrag von Andreas (396 Beiträge) am Freitag, 23.Februar.2001, 13:10.
Re: Okay, es war spät :-) Anbei verbesserter Code - getestet!
Hallo,
beim EOF ist es _ganz_ wichtig, daß es _ganz_ alleine in einer Zeile steht, also auch keine Leerzeichen davor oder dahinter.
Gruß, Andreas
Antworten
Beitrag von Ivan (14 Beiträge) am Freitag, 23.Februar.2001, 13:38.
Re: Okay, es war spät :-) Anbei verbesserter Code - getestet!
Tschuldigung,
es war ein leerzeichen nach dem EOF.
Jetzt basstle ich weiter an die richtige formular anfrage.
Danke für al eure hilfe
Ivan
Antworten