Im Folgenden werden an Hand von Beispielen die Such-Möglichkeiten in einem Textsuchfeld erklärt.
Die Such-Strategie und genaue Definition welche Felder und welche verknüpften Objekte durchsucht werden, werden im Creator festgelegt . Oft ist die Entscheidung welche Felder durchsucht werden, gerade für die Volltext-Suche auch eine Performance-Entscheidung.
Easydb generiert für PostgreSQL-Datenbanken seit Version 4.0.159 wesentlich performantere Suchanfragen. Dabei wurden auch Feinheiten und Platzhalter-Suchen überarbeitet und neu definiert.
Mit der Config-Variable SEARCH_AUTO_WILDCARD kann vom System-Administrator festgelegt werden, dass um Suchterms, die keine Platzhalter oder Anführungszeichen enthalten, automatisch ein * vor und nach jedem Suchwort eingefügt werden.
Eingabe im Text-Suchfeld | Beschreibung | Anmerkung |
---|---|---|
Begriff1 Begriff2 oder: Begriff1 AND Begriff2 |
Suche nach Begriff1 UND Begriff2. Dies ist der Standard-Fall, alle Begriffe, die Sie eingeben, müssen in den von dem Textsuchfeld definierten Feldern oder ggfs. den verknüpften Objekten vorkommen. | Das Schlüsselwort AND muss in Großbuchstaben geschrieben werden. |
Begriff1 OR Begriff2 | Suche nach Begriff1 ODER Begriff2. Mindestens einer der Begriffe die Sie eingeben, muss in den von dem Textsuchfeld definierten Feldern oder ggfs. den verknüpften Objekten vorkommen. | Das Schlüsselwort OR muss in Großbuchstaben geschrieben werden. |
Begriff1 NOT Begriff2 | Suche nach Begriff1 unter Ausschluss von Begriff2. Objekte die gefunden werden, enthalten den Begriff1, nicht aber den Begriff2. | Sie können die Kombination OR NOT nicht verwenden. |
"Begriff1 Begriff2" | Suche nach "Begriff2 Begriff1", die in einem der durchsuchten Felder in der Reihenfolge (nur durch Leerzeichen getrennt) und in einem Feld (z.B. Titel oder Beschreibung) auftreten. Die Suche erfolgt Case-Insenitiv, d.h. Klein- und Großbuchstaben werden gleichbehandelt. Für Felder, die Volltext durchsucht werden, wird nach ganzen Wörtern gesucht. Ein Platzhalter * am Anfang bzw. am Ende des Suchterms sucht auch innerhalb von Wörtern. |
|
'BegRiff1 begriff2' | Exakte Suche nach "Begriff2 Begriff1", die in einem der durchsuchten Feldern exakt so aufreteten müssen, d.h. unter Beachtung von Klein- und Großbuchstaben, Leerzeichen, Sonderzeichen etc. Für Felder, die Volltext durchsucht werden, wird automatisch nach ganzen Wörtern gesucht. Ein Platzhalter * am Anfang bzw. am Ende des Suchterms sucht auch innerhalb von Wörtern. |
Seit Version 4.0.159 und nur für PostgreSQL. Ein literales * suchen Sie mit \*. |
Begr* | Die Suche mit dem Platzhalter * sucht alle Texte, die mit Begr beginnen. D.h. es wird sowohl Begriff1, Begriff2 als auch Begrünen gefunden. Die *-Ersetzung erfolgt auch innerhalb "der exakten Suche". | Wenn das * am Anfang eines Wortes steht, kann Easydb keinen Index benutzen und die Suche wird langsamer. |
H?nd | Die Suche mit dem Platzhalter ? sucht alle Objekte, die an der Stelle des ? im Text irgendein Zeichen aufweisen. Mit dem Suchwort H?nd wird beispielsweise Hund und Hand gefunden. | Wenn das ? am Anfang eines Wortes steht, kann Easydb keinen Index benutzen und die Suche wird langsamer. |
""Paul Klee"" | Die Suche in zweifachen, doppelten Anführungszeichen sucht die angegebenen Wörter innerhalb eines Objektes ohne Berücksichtigung der Reihenfolge (so wie einfachen Anführungszeichen) und dem Feld in dem sich das Wort befindet (die Felder müssen nur zu der selben Tabelle gehören). | Mehr Informationen finden Sie im Beispiel. Seit Version 4.0.159 und nur für PostgreSQL. |
Um genau zu sehen, wie easydb einzelne Suchanfragen in SQL-Anfragen übersetzt, gibt es eine Übersicht in dem driver/searchdef-Artikel.
Mit zwei einfachen Anführungszeichen in einem Textfeld kann nach Objekten gesucht werden, die in diesem Feld keinen Inhalt haben.
Lfd. Nr. | Anmerkung |
---|---|
1 | Die Suchbegriffe können nicht mit Klammern gruppiert werden. Klammern, die nicht in Anführungszeichen stehen, werden ignoriert. |
2 | Versionen vor 4.0.159. und MySQL-Backends benutzen ältere Such-Anfragen die teilweise in langsamen Suchanfragen resultieren. Verwenden Sie daher nach Möglichkeit eine aktueller Version und eine PostgreSQL-Datenbank. |
3 | Unter Verwendung von PG 9.1 können die Akzente auch weggelassen werden. D.h. é und è werden equivalent zu e gesucht. Für andere Versionen werden keine Akzente und andere Buchstabenmarkierungen für die Suche berücksichtigen. D.h. Buchstaben wie é,è,á,à müssen explizit gesucht werden. |
4 | Es können in der Suche keine regulären Ausdrücke verwendet werden, sondern nur die Platzhalter * und ?. |
5 | easydb verlässt sich bei der Suche auf die verwendete Datenbank und ihrer Fähigkeiten. MySQL und PostgreSQL haben jeweils Eigenarten, die die Suche beinflussen können. So kann beispielsweise ein MySQL-Volltext-Index nicht gut nach deutschen Umlauten suchen und eine Suche nach Bär findet auch immer Bar. Wir sind ständig bemüht alle Features der benutzten Datenbank möglichst gut auszuschöpfen, jedoch gibt es im Detail immer wieder Grenzen. Beispielweise beherrscht keine der beiden Datenbanken eine Ähnlichkeitssuche. |
6 | Die Schlüsselworte AND, OR und NOT lassen sich auch für mehrere Begriffe verwenden. Sie können also Italien OR Frankreich AND ‘Ein exakter Titel’ suchen. Die Schlüsselworte werden in der Reihenfolge wie angegeben interpretiert und verknüpft. |
7 | easydb benutzt keine Stopp-Wörter, d.h. es kann nach allen Wörtern gesucht werden. Beachten Sie, dass Suchen nach sehr häufig vorkommenen Worten in Kombination mit AND, OR und NOT zu langsamen Suchanfragen führen können. |
8 | Die Such-Algorithmen unterscheiden sich leicht zwischen Text und String-Feldern. Je nach Typ wird ein Volltext-Index benutzt ( Text ) oder nur ein einfacher Index ( String ). Der Volltext-Index interpretiert die Text-Felder wortweise, der einfache Index interpretiert den ganzen Text als eine Zeichenkette. Das Beispiel zeigt die prinzipiellen Unterschiede in der Suche auf. |
9 | Sobald Sie nach (,),&,: oder | suchen, wird kein Volltext-Index benutzt. |
10 | Suchen mit ? und/oder * werden nur bis zum Platzhalter über einen Volltext-Index gesucht, d.h. eine Suche nach H?nd ist langsam, da nur für das H der Index benutzt werden kann. |
Das Beispiel bezieht sich auf eine easydb ab Version 4.0.159 und PostgreSQL als Datenbank-Backend.
Für das bessere Verständnis der Suchsyntax gehen wir von folgendem Beispiel aus:
Feld | Inhalt | Typ |
---|---|---|
Inventar-Nr | IV 12 345/2 | String (kein Volltext) |
Titel | Frosch am Teich | Text (Volltext) |
Beschreibung | Ein grüner Frosch sitzt an einem Teich. Im Hintergrund sind Bäume zu sehen. Am Teich steht Herr Peter Müller. | Text (Volltext) |
Fotograf | Hans-Peter Steiner | 1-n Link zu Kuenstler, Vorname+Nachname: Text (Volltext) |
Pool | Natur > heimische Tiere | 1-n Link zu Pool, Name: String (kein Volltext) |
In unserer fiktiven Tabelle Bilder befindet sich ein Bild mit dem Titel Frosch am Teich. Mit den Bildern ist ein Künstler aus der Tabelle Fotograf verknüpft, hier: Hans-Peter Steiner. Die Erfassung des Fotografen erfolgt mit Vor- und Nachname getrennt. Das Bild befindet sich im Pool heimische Tiere. Die Tabelle Pool ist hierarchisch organisiert und der Pool heimische Tiere befindet sich im Pool Natur.
Die Suche (driver/searchdef) ist so konfiguriert, dass der Titel Volltext durchsucht wird, die Inventar-Nr. als Zeichenkette (String), die Beschreibung als Volltext, die Felder Vor- und Nachname im Künstler jeweils als Volltext und der Name des Pool als Zeichenkette, also ohne Volltext.
Die folgende Tabelle zeigt in der Übersicht verschiedene Suchanfragen mit dem entsprechenden Suchergebnis. Die Geschwindigkeits-Spalte gibt an, ob es sich um eine indizierte, schnelle Suchanfrage handelt oder nicht.
Suchterm | Ergebnis | Geschwindigkeit | Anmerkungen |
---|---|---|---|
Frosch | 1 Bild | + | Der Titel und die Beschreibung des Bildes passen zur Suche. |
"Frosch Teich" | 0 Bilder | + | Es gibt kein Feld, in dem Frosch und Teich ohne etwas dazwischen vorkommen, deshalb wird kein Bild gefunden. |
""Frosch Teich"" | 1 Bild | + | Das Bild wird gefunden, da Frosch und Teich im Titel vorkommen. |
""Frosch Müller"" | 1 Bild | + | Das Bild wird gefunden, da im Titel Frosch und in der Beschreibung Müller vorkommen. |
IV 12 345 | 0 Bilder | ++ | Das Bild wird nicht gefunden, da die Inventar-Nr. als Zeichenkette gesucht wird (also in einem Stück). |
"IV 12 345" | 0 Bilder | ++ | Das Bild wird nicht gefunden, da die Inventar-Nr. anders lautet. |
"IV 12 345/2" | 1 Bild | ++ | Die Suche ist exakt die Inventar-Nr. deshalb wird das Bild gefunden. |
"IV 12*" | 1 Bild | ++ | Durch das Sternchen als Platzhalter wird das Bild gefunden. |
Hans Müller | 1 Bild | ++ | Der Vorname findet sich beim Fotografen und der Nachname in der Beschreibung des Bildes. |
""Hans Müller"" | 0 Bilder | ++ | Beide Worte finden sich nirgends in einer Tabelle. |
""Hans Steiner"" | 1 Bild | ++ | Der Fotograf wird im Vor- und Nachnamen Volltext durchsucht, deshalb wird das Bild gefunden. |
heimische Tiere | 0 Bilder | ++ | Da der Name des Pool als Zeichenkette durchsucht wird, wird das Bild nicht gefunden. |
"heimische Tiere" | 1 Bild | ++ | Das Bild wird gefunden, da der Suchterm exakt dem Pool-Namen entspricht. |
‘bäume’ | 0 Bilder | - | In der Beschreibung kommt zwar Bäume vor, aber groß geschrieben, deshalb wird das Bild nicht gefunden. |
‘sind Bäume’ | 1 Bild | - | Der Suchterm findet sich exakt so in der Beschreibung unter Berücksichtigung ganzer Wörter. |
‘*nd Bäu*’ | 1 Bild | - | Der Suchterm findet sich exakt so in der Beschreibung ohne Berücksichtigung ganzer Wörter. |
"Frosch * Teich" | 1 Bild | + | Der Suchterm enthält einen Platzhalter wodurch Frosch am Teich gefunden wird. |
easydb versucht möglichst genau im Suchergebnis (und auch in der Detailansicht), die gesuchten Begriffe zu markieren. Da der dafür zuständige Algorithmus ein anderer als der Such-Algorithmus ist, kann es teilweise zu ungenauen Markierungen kommen. Die Markierungen im Suchergebnis sind nur als Hilfestellung zur besseren Lesbarkeit gedacht, sie geben nicht immer exakt die Such-Algorithmen wieder.
Bei einem Suchbegriff, der einen alleinstehenden Slash / beinhaltet (z.B.: begriff1 / begriff2), muss der Suchbegriff in doppelte Anführungszeichen gesetzt werden. Das heißt es muss nach "begriff1 / begriff2" gesucht werden um einen Datensatz zu finden der "begriff1 / begriff2" enthält.
Der easydb Connector sucht mit einem Volltext-Suchfeld in anderen easydbs und führt die Recherche-Ergebnisse zusammen.
Es kann vorkommen, das andere easydb nicht diesselbe Such-Syntax unterstützen, weil es sich beispielsweise um ältere easydbs handelt. Insbesondere funktionieren die Suchen in einfachen Anführungszeichen und doppelten Anführungszeichen nur in Ausnahmefällen.