FTS im MS SQL-Server (2. Teil): Komponenten der FTS

30. Oktober 2013

Vielen Entwicklern, die mit SQL-basierten Datenbanken arbeiten, dürfte bekannt sein, dass sich mit Hilfe des LIKE– oder des ‘=’-Operators Zeichenketten auf teilweise oder exakte Übereinstimmung überprüfen lassen. Häufig reichen solche einfachen Textabfragen allerdings nicht mehr aus, um den gewünschten Informationsgewinn zu erzielen.

Suchen in der IT können sich in der heutigen Zeit nicht mehr ausschließlich auf die Überprüfung eindeutiger Begrifflichkeiten oder einzelner Textbausteine beschränken. Spätestens seitdem moderne Suchmaschinen wie Bing oder Google Einzug in das World Wide Web gehalten haben und dort kaum noch wegzudenken sind, hat sich das Suchen und Finden der relevanten Informationseinheiten teilweise sogar zu einem regelrechten Wettkampf entwickelt.

Nachdem in meinem ersten Beitrag “Flexionen-Abfragen mit FTS und MS SQL-Server” zunächst ein paar allgemeine Grundlagen zur Volltextsuche  anhand von Beispielen aus der Linguistik erläutert wurden, sollen in diesem Artikel die wichtigsten Datenbank-Objekte für eine individuelle Volltextsuche innerhalb des Microsoft SQL-Servers vorgestellt werden.

Dabei konzentriert sich der Artikel insbesondere auf folgende Komponenten:

  • Suchkataloge
  • Volltextindizes
  • Stoppwortlisten

Es wird sowohl der Verwendungszweck als auch das Zusammenspiel der einzelnen Komponenten analysiert und erläutert. Des Weiteren wird auch gezeigt, wie die Volltextsuche an bestimmten Stellen konfiguriert werden kann.

Allgemeine Grundlagen

Installationsüberprüfung

Als Erstes gilt es zu überprüfen, ob die Volltextsuche für eine SQL-Server-Datenbank verfügbar ist. Dies kann durch Absetzen des folgendes SQL-Statements einfach und schnell verifiziert werden:

   1: SELECT SERVERPROPERTY('IsFullTextInstalled') AS IsFullTextInstalled;

Ist die Volltextsuche erfolgreich installiert, so liefert diese Abfrage folgendes Ergebnis:

image

Sollte die Volltextsuche noch nicht vorhanden sein, muss diese über das SQL-Server Setup installiert werden. Nähere Informationen zur Einrichtung der Volltextsuche können zum Beispiel unter Quelle [1] recherchiert werden.

Daten und Dateitypen

Mit Hilfe der Volltextsuche können nicht nur “einfache” und textbasierte Spalten in Datenbank-Tabellen oder -Views abgefragt werden, sondern auch Spalten mit binären oder XML-basierenden Dateien, die umfangreichen Text-Dokumente enthalten. Damit erweist sich die Volltextsuche des SQL-Server durchaus als geeignet für komplexe Text-Analysen oder gar Text Mining– Verfahren. Die Volltextsuche innerhalb des SQL-Server kann für folgenden Datentypen angewendet werden [2]:

  • CHAR
  • VARCHAR
  • NCHAR
  • NVARCHAR
  • TEXT
  • NTEXT
  • XML
  • VARBINARY

Suchkataloge

Um die Spalten von Tabellen einer Datenbank zu einer Volltextsuche im SQL-Server hinzuzufügen, muss als Erstes ein Suchkatalog (engl.: “Full-Text Catalog”)  angelegt werden. Bei einem solchen Suchkatalog handelt es zunächst nur um ein virtuelles Objekt bzw. ein logisches Konzept mit dem andere Komponenten der Volltextsuche, die so genannten “Volltextindizes” (siehe nachfolgenden Abschnitt), zu einer Gruppe zusammengefasst werden können [2], [3]

Die Erstellung eines Suchkatalogs kann beispielsweise mit folgender T-SQL-Syntax erfolgen [3]:

   1: CREATE FULLTEXT CATALOG catalog_name 

   2:     [ON FILEGROUP filegroup ] 

   3:     [IN PATH 'rootpath'] 

   4:     [WITH <catalog_option>] 

   5:     [AS DEFAULT] 

   6:     [AUTHORIZATION owner_name ] 

   7:     <catalog_option>::= ACCENT_SENSITIVITY = {ON|OFF} 

Hierbei können unterschiedliche Modifikationen für das Verhalten des Suchkatalogs vorgenommen werden. Beispielsweise kann über die Option ACCENT_SENSITIVITY gesteuert werden, ob Akzente (z.B. im Wort “Café”) für Unterscheidungen bei Textabfragen berücksichtigt werden sollen oder nicht.

Alternativ kann ein Suchkatalog auch über Dialogmasken innerhalb des SQL-Server Management Studios konfiguriert werden. Die folgenden beiden Abbildungen stellen dies bildlich dar:

image

image

Nachdem der neue Suchkatalog erstellt wurde, wird er in der Liste der Volltextkataloge aufgeführt und steht der Datenbank – wie die folgende Grafik zeigt – zur Verfügung:

image 

Volltextindizes

Die wichtigste Komponente der Volltextsuche stellen die Volltextindizes dar. Alle Spalten der Datentypen CHAR, VARCHAR, NCHAR, NVARCHAR, TEXT oder NTEXT, welche mit Hilfe der Volltextsuche abgefragt werden sollen, müssen in den Volltextindex der Tabelle aufgenommen werden.

Volltextindizes können, ähnlich wie bei den Suchkatalogen, mit Hilfe von SQL-Statements angelegt und verwaltet werden. Beispielsweise können hierbei bestimmte Spracheinstellungen hinterlegt oder das Änderungsverhalten des Volltextindex bei Änderungen der Spalteninhalte beeinflusst werden. Das Anlegen eines neuen Volltextindex per Programmierung orientiert sich dabei am SQL-Template aus folgendem Code-Ausschnitt [5], [6]:

   1: CREATE FULLTEXT INDEX ON table_name/view_name

   2:    [ ( { column_name 

   3:              [ TYPE COLUMN type_column_name ]

   4:              [ LANGUAGE language_term ] 

   5:              [ STATISTICAL_SEMANTICS ]

   6:         } [ ,...n] 

   7:       ) ]

   8:     KEY INDEX index_name 

   9:     [ ON <catalog_filegroup_option> ]

  10:     [ WITH [ ( ] <with_option> [ ,...n] [ ) ] ]

  11: [;]

  12:  

  13: <catalog_filegroup_option>::=

  14:  {

  15:     fulltext_catalog_name 

  16:  | ( fulltext_catalog_name, FILEGROUP filegroup_name )

  17:  | ( FILEGROUP filegroup_name, fulltext_catalog_name )

  18:  | ( FILEGROUP filegroup_name )

  19:  }

  20:  

  21: <with_option>::=

  22:  {

  23:    CHANGE_TRACKING [ = ] { MANUAL | AUTO | OFF [, NO POPULATION ] } 

  24:  | STOPLIST [ = ] { OFF | SYSTEM | stoplist_name }

  25:  | SEARCH PROPERTY LIST [ = ] property_list_name 

  26:  }

Etwas einfacher und intuitiver dürfte das Anlegen und Verwalten eines Volltextindex über die Benutzeroberfläche des SQL-Server Management Studio sein. Die folgenden Abbildungen zeigen die einzelnen Konfigurationsschritte:  

image

image

image

Sonderfall: Dateistrukturen

Für Spalten, welche komplette Dateien speichern und vom Datentyp XML oder VARBINARY sind, muss eine weitere Voraussetzung erfüllt sein, um in den Volltextindex aufgenommen werden zu können. Neben der Spalte mit dem zu durchsuchenden Inhalt selbst muss im Rahmen der Konfiguration zusätzlich eine Typ-Spalte mit hinterlegt werden. Diese Typ-Spalte gibt an, welches Dateiformat (z.B. Microsoft Word, XML-Datei, PDF-Format, …) der Spalteninhalt besitzt.

Die folgende Abbildung zeigt, wie diese Typ-Spalte, in der die entsprechende Dateiendung steht, ausgewählt werden kann:

image

Des Weiteren kann zur Recherche aller im SQL-Server unterstützen Dateiformate  (z.B. “.doc” für Word-Dateien, “.html” für Web-Formulare, …) folgende View-Abfrage abgesetzt werden [7]

   1: SELECT * FROM sys.fulltext_document_types;

Stoppwortlisten

Suchabfragen in großen Datenmengen und umfangreichen Textdokumenten können viel Rechenzeit und Ressourcen beanspruchen. Auch würde der Volltextindex sehr viel Speicherkapazität benötigen, wenn alle Worte einer Sprache in den Volltextindex aufgenommen werden.

Meistens sind aber gar nicht alle Wörter für die Suche relevant und sollten daher auch nicht(!) in den Volltextindex aufgenommen werden. Worte, die nur geringe Information enthalten und daher als Stoppwörter (englisch: Noise Word) bezeichnet werden, sollen bei einer Volltextsuche am besten ignoriert werden. In der deutschen Sprache zählen hierzu insbesondere 

  • Artikel (z.B. ‚der‘, ‚die‘, ‚das‘, …),
  • Präpositionen (z.B. ‚an‘, ‚ab‘, ‚aus‘, …) oder
  • Konjunktionen (z.B. ‚und‘, ‚oder‘, ‚da‘, ‚weil’, …)

Für die Volltextsuche im SQL-Server können  Stoppwörter in Stoppwortlisten organsiert und verwaltet werden, welche wiederum als Datenbank-Objekte innerhalb der Datenbank abgelegt werden.

Verwaltungsoptionen für Stoppwortlisten und Stoppwörter

Für die Verwaltung der Stopplisten und Stoppwörter in einer Datenbank stehen dem Anwender, analog zu den Suchkatalogen und Volltextindizes, zum einen diverse SQL-Befehle zur Verfügungen. Der folgende Code-Ausschnitt zeigt sie wichtigsten SQL-Statements, mit deren Hilfe Stopplisten angelegt (Zeile 2) oder gelöscht (Zeile 11) werden können. Außerdem wird erläutert, wie einzelne Wörter zu einer Stoppliste hinzugefügt werden (Zeile 5) können und schließlich wie eine Stoppliste zu einem Volltextindex hinzugefügt (Zeile 8) werden kann (in Anlehnung an [8], Seite 95):

   1: -- Anlegen einer Stoppwordliste

   2: CREATE FULLTEXT STOPLIST NameOfStopList FROM SYSTEM STOPLIST;

   3:  

   4: -- Hinzufügen eines Stoppwortes

   5: ALTER FULLTEXT STOPLIST NameOfStopList ADD 'Noise Word' LANGUAGE GERMAN;

   6:  

   7:Stoppliste für Volltextindex einer Tabelle oder eines Views konfigurieren

   8: ALTER FULLTEXT INDEX ON TableOrViewName SET STOPLIST NameOfStopList 

   9:  

  10: -- Löschen einer Stoppwortliste

  11: DROP FULLTEXT STOPLIST NameOfStopList; 

Alternativ können Stoppwortlisten mit ihren darin enthaltenen Stoppwörtern auch wieder mit Hilfe von Dialogen und ein paar Mausklicks innerhalb des SQL-Server Management Studios erstellt und konfiguriert werden. Die nachfolgenden Abbildungen stellen das Anlegen von Stopplisten und das Einfügen von Stoppwörtern in die Stoppwortliste bildlich dar:

image

image
clip_image001

image

Abfragen für Stoppwortlisten und Stoppwörter

Je umfangreicher eine Volltextsuche wird, desto mehr Stoppwörter und auch Stoppwortlisten müssen organsiert und verwaltet werden. Aus diesem Grund bietet es sich an, Stoppwörter zunächst in bestimmten Kategorien zu untergliedern (z.B. Artikel, Präpositionen, Konjunktionen, …) und dann für jede Kategorie eine eigene Stoppwortliste anzulegen.Dies kann je nach Sprache durchaus unterschiedlich, wenn beispielsweise die Anzahl der Artikel in der deutschen und englischen Sprache miteinander verglichen werden.

Damit auch die Anzahl und der Inhalt der einzelnen Stoppwortlisten kontrolliert werden kann, bietet der MS SQL-Server diverse System-Sichten und – Funktionen an, mit denen verwaltete Stoppwörter überprüft und analysiert werden können.

Sollen beispielsweise sämtliche Stopplisten eines Datenbank aufgeführt werden, so kann folgendes SQL-Statement abgesetzt werden (vgl. [8], Seite 96):

   1: -- Alle Stoppwortlisten anzeigen

   2: SELECT * FROM sys.fulltext_stoplists;

Ergebnisliste mit Stoppwortlisten:

Stoppwordlists

Um dagegen alle Stoppworte zu erhalten, unabhängig davon welcher Stoppwortliste diese im Einzelnen zugeordnet sind, bietet sich folgende Abfrage (vgl. [8], Seite 96) an:

   1: -- Alle Stoppworte anzeigen

   2: SELECT * FROM sys.fulltext_stopwords;

Ergebnisliste mit sämtliche Stoppworten:

Stoppwords 

 

Zusammenfassung und Ausblick

In diesem Artikel konnten die wichtigsten Komponenten samt Konfigurationsmöglichkeiten für eine Volltextsuche innerhalb des MS SQL-Servers vorgestellt werden. Des Weiteren konnte gezeigt  werden, dass für eine individuelle Volltextsuche durchaus einige wesentliche Punkte (.z.B. Umfang des Volltextindizes) zu berücksichtigen sind.

Im nächsten Artikel soll auf Thesauris und semantische Suchabfragen eingegangen werden. Dabei wird erläutert, wie in Beziehung stehende Begrifflichkeiten oder Synonyme in SQL-Server-Datenbanken gesucht und gefunden werden können.

 

Quellen:

  1. Volltextsuche (SQL Server) (Letzter Zugriff: 27.10.2013)
  2. CREATE FULLTEXT CATALOG (Transact-SQL) (Letzter Zugriff: 27.10.2013)
  3. Erstellen und Verwalten von Volltextkatalogen (Letzter Zugriff: 27.10.2013)
  4. CREATE FULLTEXT INDEX (Transact-SQL) (Letzter Zugriff: 27.10.2013)
  5. sys.fulltext_document_types (Transact-SQL) (Letzter Zugriff: 27.10.2013)