Die Volltextsuche durchsucht die komplette Datenbank nach angegebenen Suchtexten, die irgendwo in den Einträgen enthalten sind. Man gibt dazu als Such"feld" den speziellen Namen
_fullsearch an. Ansonsten verhält es sich ähnlich wie eine normale Datenbank-Abfrage.
 | Beachten Sie |
Verwenden Sie die Volltextsuche nicht als schlechten Ersatz für die Indizierung von Feldern! Eine Adressverwaltung mit Feldern wie "Name", "Vorname", "PLZ", "Ort" sollten Sie weiterhin einzeln indizieren/sortieren und nicht versuchen, alles mit einer Volltextsuche zu erschlagen.
|
|
Definition:
_fullsearch<Operator><Suchtexte>
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.
Reihenfolge und Sortierung bestimmen
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.
 | Beachten Sie |
Das Feld, das die Such-Reihenfolge festlegt, muss als sortiert definiert sein.
|
|
Definition:
fullsearch_sort=[-]Name
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:
Suchbereich und Trefferanzahl festlegen
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:
fullsearch_range=[-]<Start>,<Anzahl zu durchsuchende Einträge>
fullsearch_match=<Anzahl max. Treffer>
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.
sucht in den ersten 2500 Datensätzen bis 20 Treffer erzielt wurden.
 | Know-How |
Je nach Sortierung und Bereich werden andere Einträge ausgegeben. Hier der Zusammenhang zwischen den 4 grundlegenden Möglichkeiten:
Angenommen wir haben eine Datenbank mit dem Feld "Buchstabe" und 26 Einträgen für je einen Buchstaben, also einfach "a b c d e f g h i j k l m n o p q r s t u v w x y z". Die folgenden Parameterangaben führen dazu, dass die angegebenen Einträge in der angegebenen Reihenfolge durchsucht werden:
Parameter Durchsuchte Einträge
fullsearch_sort=Buchstabe fullsearch_range=0,10 a b c d e f g i h j
fullsearch_sort=-Buchstabe fullsearch_range=0,10 j h i g f e d c b a
fullsearch_sort=Buchstabe fullsearch_range=-10,10 q r s t u v w x y z
fullsearch_sort=-Buchstabe fullsearch_range=-10,10 z y x w v u t s r q
|
|
Variablen
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 "+++".
 | Beachten Sie |
Achten Sie beim Ersetzungstext auf den Slash /, der für das Ende der regular expression steht - wenn Sie hier HTML-Code schreiben, müssen Sie darin befindliche Slash-Zeichen mit einem vorangestellten Backslash \ "escapen". Oder Sie verwenden ein anderes Zeichen, z.B. ein # als Markierung für die regular expression:
$eintrag=~ s#$_fullsearch_regex#$1#g;
|
|
Komplettes Beispiel
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
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>
|