Volltextsuche |
|
Definition:
Operator = Bestimmt die Art der Übereinstimmung:
Operator Bedeutung Möglicher Treffer bei Suche nach "leben" |
---|
~~ Suche irgendwo im Text; Ignoriere Gross/Klein-Schreibung ES WAR SEHR BELEBEND! |
~= Suche Wortanfang; Ignoriere Gross/Klein Diese Lebendigkeit! |
== Suche exaktes Wort; Ignoriere Gross/Klein Das Leben ist schön. |
~~! Suche irgendwo im Text; Beachte Gross/Klein-Schreibung Das muss man erleben! |
~=! Suche Wortanfang; Beachte Gross/Klein Er ist sehr lebending. |
==! Suche exaktes Wort; Beachte Gross/Klein Wie kann man so leben? |
Suchtexte = Texte nach denen gesucht wird, durch Kommas getrennt. Diese können durch vorangestellte Zusätze miteinander verknüpft werden.
Zusatz Bedeutung |
---|
+ muss enthalten sein (UND) |
- darf nicht enthalten sein (NICHT) |
(kein Zusatz) bei mehreren: eins davon muss enthalten sein (ODER) |
Beispiele:
<do action=all _fullsearch==+hans,-stefan>
gibt alle Einträge aus, die auf jeden Fall "hans" enthalten und auf keinen Fall "stefan".
<loop _fullsearch==hans,stefan> ... </loop>
findet Einträge bei denen "hans" oder "stefan" enthalten ist
Man kann die Volltextsuche auch mit "normalen" Feldabfragen kombinieren:
<loop _fullsearch==+andreas,berta,meyer,meier Alter<30 range=0,20> ... </loop>
Findet die ersten 20 Einträge in denen auf jeden fall "andreas" UND "berta" ODER "meyer" ODER "meier" enthalten sind und mit ein Alter unter 30 haben.
Die Volltextsuche findet die gesuchten Texte überall - z.B. auch in HTML-Tags. Wenn Sie also HTML-Code in Ihren Einträgen verwenden, wundern Sie sich nicht, wenn z.B. die Suche nach "der" auch Einträge findet, die <table border=...> enthalten.
Sie können angeben, in welcher Reihenfolge und nach welcher Sortierung die Suche erfolgt. Im Gegensatz zum "normalen" sort einer Datenbank-Abfrage können Sie hier nur ein Feld angeben.
|
Definition:
Wenn Sie fullsearch_sort nicht angeben, wird nach den neuesten durchsucht.
Beispiele:
Angenommen Sie haben eine Datenbank in der Texte abgelegt sind, die von den Nutzern bewertet werden können. Sie möchten nun eine Volltextsuche anbieten, die die passenden Texte mit den meisten Punkten zuerst ausgibt.
<loop _fullsearch==$suchbegriffe fullsearch_sort=-Punkte> ... </loop>
Wenn Sie die automatische Suchreihenfolge nach den neuesten Einträgen umkehren und also nach den ältesten suchen möchten, dann müssen Sie dies so angeben:
fullsearch_sort=Id
baseportal sucht bei einer Volltextsuche als Vorgabe in maximal 2500 Datensätzen und bis 10 Treffer gefunden wurden. Sie können diese Vorgabe aber beliebig ändern oder angeben, welche Datensätze durchsucht werden sollen und so ein "Blättern" ermöglichen.
Definition:
Beispiele:
fullsearch_range=100,200 fullsearch_match=50
sucht in den Datensätzen 100 bis 300 bis 50 Treffer erzielt wurden.
Auch negative Angaben sind möglich:
fullsearch_range=-500,400
durchsucht die obersten 400 der letzten 500 Einträge. Die max. Anzahl der Treffer ist standardmässig auf 10 gesetzt.
fullsearch_match=20
sucht in den ersten 2500 Datensätzen bis 20 Treffer erzielt wurden.
|
Nach einer Volltextsuche werden folgende Variablen mit Werten gefüllt:
Name Bedeutung |
---|
$_fullsearch Suchbegriffe |
$_fullsearch_range Starteintrag für die Volltextsuche |
$_fullsearch_range_length Anzahl der zu durchsuchenden Einträge |
$_fullsearch_match Anzahl der zu findenden Treffer |
$_fullsearch_match_pos Eine Position nach dem zuletzt gefundenen Treffer |
$_fullsearch_amount Anzahl der bei der Volltextsuche gefundenen Treffer |
$_fullsearch_regex Muster um im Text die Suchtexte zu markieren |
So können Sie feststellen wieviel Treffer erzielt wurden und ob die Datenbank schon komplett durchsucht wurde. Hier zwei nützliche Tests:
if($_fullsearch_range+$_fullsearch_range_length<$_amount_all) ...
Trifft die Bedingung zu, wurde der angegebene Bereich durchsucht, es sind aber noch Datensätze in der Datenbank vorhanden.
if($_fullsearch_match_pos<$_fullsearch_range+$_fullsearch_range_length) ...
Trifft die Bedingung zu, wurde die max. Anzahl Treffer gefunden und die Suche beim letzten Treffer abgebrochen.
Interessant ist die Variable $_fullsearch_regex. baseportal ist so freundlich und stellt darin das Muster für eine regular expression bereit, mit der die Suchbegriffe in den Einträgen erkannt werden können. Ein passender Suchbegriff steht dann in $1:
$eintrag=~ s/$_fullsearch_regex/+++$1+++/g;
Stellt vor und hinter alle passenden Suchbegriffe in der Variablen $eintrag drei Plus-Zeichen "+++".
|
Im folgenden ein kleines Suchskript, das auch mit sehr grossen Datenbanken zurecht kommt: Es lässt die ersten 10 Treffer oder max. 2500 Einträge (durch)suchen. Ist die Datenbank dann noch nicht zuende, kann der Nutzer weitersuchen lassen, bis die nächsten 10 Treffer gefunden oder die nächsten 2500 Einträge durchsucht sind.
Zu Beginn ein einfaches Eingabefeld für die Suchtexte. Die Suchwörter sind durch Leerzeichen zu trennen und können "+" und "-" vorangestellt bekommen. Aufgrund des ~~ suchen wir irgendwo im Text, auch mitten in Wörtern.
Zwischen dem
out <<EOF; ... EOF
steht die Ausgabe eines gefundenen Eintrags. Hier haben wir die Felder "Titel", "Beschreibung" und "Kommentar" verwendet. In der regular expression werden die Suchbegriff fett und rot markiert.
Die Variable $newrange wird auf den Startpunkt der nächsten Suche gesetzt. Dann wird geprüft, ob schon alle Datensätze durchsucht wurden und wenn nicht, warum nicht (max. Treffer gefunden oder Suchbereich zuende). In diesem Fall wird dann ein Link mit den Suchwörtern und dem neuen Suchbereich zum Weiterblättern ausgegeben.
<form action="baseportal.pl?htx=$htx" method="post" enctype="multipart/form-data"> <input type="hidden" name="htx=" value="$htx"> Freie Suche: <input type="text" name="_fullsearch~~" value="$_fullsearch"> <input type="submit" value="Suchen"> </form> <perl> return if $_fullsearch eq ""; get "fullsearch_match=10"; while(get_next) { $out= <<EOF; <b>$Titel</b><br>$Beschreibung - $Kommentar<p> EOF $out=~ s#$_fullsearch_regex#<b><font color=red>$1</font></b>#g; out $out; } my $newrange=$_fullsearch_range+$_fullsearch_range_length; my $txt; if($_fullsearch_match_pos<$newrange) { $txt="Suche nach weiteren Treffern"; $newrange=$_fullsearch_match_pos; } else { out "<b>Kein Treffer.</b><p>" if $_fullsearch_amount<1; $txt="Suche in weiteren Datensätzen"; } if($newrange<$_amount_all) { out "Es wurde noch nicht in allen Datensätzen gesucht: "; out "<a href=\"baseportal.pl?htx=$htx&_fullsearch~~".convert_url($_fullsearch). "&fullsearch_range=$newrange,$_fullsearch_range_length\">$txt</a>"; } else { out "Die Datenbank wurde komplett durchsucht."; } </perl> <br>