Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 1/2007.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Ergänzen Sie eine Datenbank um einen Volltextindex über alle Tabellen.

Techniken

VBA, Indizierung

Voraussetzungen

Access 2000 und höher

Beispieldatei

volltext.mdb

Shortlink

440

Universelle Volltextsuche

Sascha Trowitzsch, Berlin

Erst nach Fertigstellung eines Datenbankprojekts fällt Ihrem Auftraggeber plötzlich noch ein, dass er noch ein unentbehrliches Feature benötigt: Er will alle Tabellen der Datenbank global nach bestimmten Stichwörtern durchsuchen können, etwa indem er den Namen „Meyer“ in ein Suchfeld eingibt und schnell sämtliche Vorkommen in einer Ergebnisliste erhält. Hieraus will er die entsprechenden Stellen anschließend aufrufen. Einfach, denken Sie, und signalisieren Ihrem Kunden: „O.K., alles kein Problem!“ Doch bei näherer Betrachtung fällt Ihnen auf, dass es da mehr zu bedenken gibt, als zunächst vermutet ...

Schwache Leistung

Die Idee, die Sie vielleicht haben, ist, einfach alle Tabellen der Datenbank anhand der TableDefs-Auflistung zu ermitteln, jede mit einem Recordset zu öffnen und in allen Feldern nach dem Begriff zu suchen. Welche Felder der Tabellen in die Suche mit einbezogen werden sollen, entscheidet der Datentyp: Nur Textfelder müssen nach den Wünschen des Auftraggebers durchsucht werden und diese ergeben sich aus den Type-Eigenschaften der Field-Objekte des Recordsets. Sie dürfen den DAO-Typ dbText oder dbMemo aufweisen. Der Inhalt der so gefilterten Felder wird dann Datensatz für Datensatz ausgelesen. Dabei wird mit der VBA-Funktion InStr() ermittelt, ob darin der Suchbegriff vorkommt.

Das würde sicherlich funktionieren, doch dann kommen Ihnen berechtigte Zweifel, ob diese Art der Suche nicht mit Performance-Schwierigkeiten zu kämpfen hätte. Schließlich müsste die Anwendung alle Datensätze aller Textfelder aller Tabellen durchlaufen, was bei dem erwarteten Datenaufkommen und der Tatsache, dass viele Benutzer auf die Datenbank zugreifen werden, nicht zu einem Resultat führt, dem man das Prädikat „schnell“ anheften könnte. Ein Produkt mit schlechter Performance möchten Sie aber nicht abliefern und deshalb muss eine andere Lösung her.

Suchmaschine

Suchmaschinen wie Google suchen ja auch nicht jeweils im gesamten Terabyte-schweren Bestand von Webseiten, die ihre Robots aus dem Netz gefischt haben, wenn Sie einen Suchbegriff eingeben.

Stattdessen besitzen sie einen eindeutigen Index aller Begriffe, die irgendwo auf den Seiten vorkommen. Etwas Ähnliches sollte auch unsere Volltextsuche enthalten. In Abb. 1 sehen Sie einen Vorschlag für den Aufbau der zum Volltextindex gehörenden Tabellen.

relations.tif

Abb. 1: Tabellenaufbau des Volltextsuchindex

Die Angelegenheit teilt sich in zwei Vorgänge auf: Zuerst werden alle Tabellen der Datenbank ermittelt und iher Namen sowie Primärschlüsselnamen in der Tabelle tblFulltextTables abgelegt.

Außerdem wird die Tabelle tblFulltextFields mit den zu den Tabellen gehörenden Feldnamen gefüllt – aber nur für jene Felder, die Texte enthalten. Diese beiden Tabellen stellen die Grundlage für die anschließende Indizierung dar. Die Tabellen enthalten zusätzlich je ein Boolean-Feld namens bScan, das mitteilt, ob die Tabelle oder das Feld überhaupt für die Indizierung relevant sind.

Nur wenn bScan den Wert True hat, wird das Feld oder die Tabelle in die Indizierung mit einbezogen.

Im zweiten Schritt werden dann die Feldinhalte der nun ermittelten Textfelder ausgelesen, in Worte gesplittet und diese werden in die Tabelle tblFulltextWords aufgenommen.

Dabei ist das Feld Word eindeutig indiziert, sodass jeder Begriff nur einmal in der Tabelle vorkommen kann. ID ist ein Autowert. Die wichtigste Tabelle des Systems ist nun tblFulltextFind. Dort werden die folgenden Informationen zusammengefasst:

  • IDWord: enthält einen Verweis auf ein Wort der Tabelle tblFulltextWords
  • IDTable: enthält einen Verweis auf einen der in tblFulltextTables enthaltenen Tabellennamen
  • IDField: enthält einen Verweis auf ein Feld der in IDTable gespeicherten Tabelle
  • IDRecord: der Wert des Primärschlüssels, der zu dem Datensatz gehört, in dem der Text mit dem Suchbegriff steht

Das macht auch schon eines deutlich: Um einen Feldinhalt wiederzufinden, ist es praktisch unumgänglich, dass die Tabellen einen eindeutigen Primärschlüssel aufweisen. Ohne diesen kann ein Datensatz später nicht identifiziert werden. Sie sollten es sich daher zur Angewohnheit machen, jede auch noch so kleine Tabelle mit einem Primärschlüssel zu versehen. Das lässt sich auch noch nachträglich erledigen, indem Sie Tabellen ohne Schlüssel ein zusätzliches Autowert-Feld spendieren.

Suchen

Wie erfolgt nun die Suche nach einem Begriff? Zunächst schaut die Anwendung im Feld Word der Tabelle tblFulltextWords nach, ob der Begriff vorhanden ist. Falls nicht, kommt also das Wort nirgendwo vor. Falls ja, wird die Tabelle tblFulltextFind zu Rate gezogen und nach Datensätzen gefiltert, die den richtigen Wert für IDWord enthalten. Und schon haben wir die Ergebnisliste mit Datensätzen, die auf Tabellen, Felder und Primärschlüssel verweisen.

Da geschieht also nicht viel und das genau ist der Vorteil der indizierten Volltextsuche. Sie läuft schnell ab. Das Suchen ist einfach, das Indizieren allerdings relativ aufwändig und Zeit raubend.

Modul zur Volltextindizierung

Ich erspare Ihnen, die Routinen zur Indizierung selbst zu programmieren. Im Modul mdlVolltextindex der Beispieldatenbank finden Sie alles Notwendige. Die Erläuterung einzelner Code-Stellen folgt weiter unten. Die Datenbank enthält neben den notwendigen Tabellen zur Indizierung (s. Abb. 1) als Beispiel noch die Tabellen aus der Südsturm-Datenbank [1] sowie ein Suchformular frmVolltextsuche (s. Abb. 3), das die Funktionalität demonstrieren soll.

Das Formular enthält eine Schaltfläche Suchindex neu aufbauen, deren Betätigung die Routinen zur Neuindizierung aller Tabellen der Datenbank anstößt. Dabei wird in einem Zwischenschritt die Tabelle tblFulltextTables geöffnet, die mit der als Unterdatenblatt eingeblendeten Tabelle tblFulltextFields verknüpft ist. Das gibt Ihnen die Gelegenheit, für jede Tabelle und jedes Feld festzulegen, ob es bei der Indizierung berücksichtigt werden soll.

Dazu müssen Häkchen in die Verwenden-Checkboxen gesetzt werden (s. Abb. 2).

datenblatt.tif

Abb. 2: Tabellen und Felder mit Textinhalten

Ich würde hier anregen, das Feld PLZ zu deaktivieren, denn es macht wenig Sinn, Postleitzahlen in eine Volltextsuche zu integrieren.

Nach dem Schließen der Tabelle fährt die Routine automatisch fort und indiziert den gesamten Datenbestand.

Sie meldet sich nach Vollzug schließlich mit einer Ausgabe der benötigten Zeit. Das wird ungefähr eine Sekunde dauern.In Datenbanken mit Zigtausenden von Datensätzen wird die Sache allerdings anders aussehen. Hier kann die Indizierung ohne Weiteres mehrere Minuten beanspruchen.

Nach der Indizierung können Sie einen Suchbegriff in das Formular eingeben, auf Suchen! klicken und Sie erhalten eine Ergebnisliste wie in Abb. 3.

formular.tif

Abb. 3: Suchformular der Beispieldatenbank

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

© 2003-2015 André Minhorst Alle Rechte vorbehalten.