Erste Schritte mit der Volltextsuche

In SQL Server sind die Datenbanken standardmäßig volltextfähig. Wenn Sie jedoch einen Volltextindex für eine Tabelle verwenden möchten, müssen Sie die Volltextindizierungsfunktion für die Spalten der Tabellen einrichten, auf die Sie mit dem Volltextmodul zugreifen möchten.

Führen Sie dazu die folgenden grundlegenden Schritte aus:

  1. Erstellen eines Volltextkatalogs zum Speichern der Volltextindizes.

    Jeder Volltextindex muss einem Volltextkatalog angehören. Sie können einen separaten Textkatalog für jeden Volltextindex erstellen oder einem Katalog mehrere Volltextindizes zuordnen.

    HinweisHinweis

    Ab SQL Server 2008 stellt ein Volltextkatalog ein virtuelles Objekt dar, das keiner Dateigruppe angehört. Ein Volltextkatalog ist ein logisches Konzept, das für eine Gruppe von Volltextindizes steht.

  2. Erstellen eines Volltextindex für eine Tabelle oder eine indizierte Sicht.

    Ein Volltextindex ist ein besonderer Typ eines tokenbasierten funktionellen Index, der durch das Volltextmodul erstellt und verwaltet wird. Um eine Volltextsuche für eine Tabelle oder Sicht erstellen zu können, muss ein eindeutiger, einspaltiger Index vorhanden sein, der keine NULL-Werte zulässt. Das Volltextmodul benötigt diesen eindeutigen Index, um jeder Zeile in der Tabelle einen eindeutigen, komprimierbaren Schlüssel zuzuordnen. Ein Volltextindex kann Spalten der Typen char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary und varbinary(max) beinhalten. Weitere Informationen finden Sie unter Übersicht über die Volltextindizierung.

Bevor Sie mehr über das Erstellen von Volltextindizes erfahren, sollten Sie die Unterschiede zu regulären SQL Server-Indizes kennen. In der folgenden Tabelle sind die Unterschiede aufgelistet.

Volltextindizes

Reguläre SQL Server-Indizes

Nur ein Volltextindex pro Tabelle zulässig.

Mehrere reguläre Indizes pro Tabelle zulässig.

Das Hinzufügen von Daten zu Volltextindizes, Auffüllen genannt, muss angefordert werden. Dies erfolgt entweder mithilfe eines Zeitplans bzw. mithilfe einer speziellen Anforderung oder automatisch beim Hinzufügen neuer Daten.

Automatische Aktualisierung, wenn die Daten, auf denen der Index basiert, eingefügt, aktualisiert oder gelöscht werden.

Gruppiert innerhalb derselben Datenbank zu einem oder mehreren Volltextkatalogen.

Nicht gruppiert.

Überlegungen beim Erstellen eines Volltextindex

In diesem Abschnitt werden die folgenden Themen behandelt:

  • Wählen der Spaltensprache

  • Wählen einer Dateigruppe für einen Volltextindex

  • Zuweisen des Volltextindex zu einem Volltextkatalog

  • Zuordnen einer Stoppliste zum Volltextindex

  • Aktualisieren eines Volltextindex

Wählen der Spaltensprache

Weitere Informationen zu Überlegungen beim Auswählen der Sprache für die Spalte finden Sie unter Bewährte Methoden für das Auswählen einer Sprache beim Erstellen eines Volltextindex.

Wählen einer Dateigruppe für einen Volltextindex

Die Erstellung eines Volltextindex ist ein ziemlich E/A-intensiver Vorgang (grob gesprochen besteht es aus dem Lesen von Daten aus SQL Server und dem anschließenden Weitergeben der gefilterten Daten an den Volltextindex). Die beste Vorgehensweise besteht darin, einen Volltextindex in der Datenbankdateigruppe anzuordnen, die am besten für die Optimierung der E/A-Leistung geeignet ist, oder ordnen Sie die Volltextindizes in einer anderen Dateigruppe auf einem anderen Volume an.

Wenn Ihnen eine einfache Verwaltbarkeit wichtig ist, empfiehlt es sich, Tabellendaten und zugehörige Volltextkataloge in derselben Dateigruppe zu speichern. Aus Leistungsgründen kann es in einigen Fällen auch ratsam sein, die Tabellendaten und den Volltextindex in verschiedenen Dateigruppen auf unterschiedlichen Volumes anzuordnen, um die E/A-Parallelität zu erhöhen.

Zuweisen des Volltextindex zu einem Volltextkatalog

Es ist wichtig, die Zuordnung von Volltextindizes für Tabellen zu Volltextkatalogen zu planen.

Es ist zu empfehlen, Tabellen mit denselben Aktualisierungsmerkmalen (z. B. geringe Anzahl an Änderungen gegenüber einer großen Anzahl an Änderungen oder Tabellen, die regelmäßig zu bestimmten Tageszeiten geändert werden) zu gruppieren und demselben Volltextkatalog zuzuweisen. Indem Sie Zeitpläne für Volltextkataloge einrichten, bleiben Volltextindizes mit den Tabellen synchronisiert, ohne dass sich dies in Phasen umfangreicher Datenbankaktivitäten negativ auf die Ressourcenverwendung des Datenbankservers auswirkt.

Wenn Sie einem Volltextkatalog eine Tabelle zuweisen, sollten Sie die folgenden Richtlinien berücksichtigen:

  • Wählen Sie stets den kleinsten eindeutigen Index, der verfügbar ist, als eindeutigen Volltextschlüssel aus (ein 4 Byte umfassender, auf dem integer-Datentyp basierender Index ist am besten geeignet). Hierdurch können Sie den Umfang der Ressourcen, die vom Microsoft Search-Dienst im Dateisystem benötigt werden, erheblich reduzieren. Wenn Sie einen breiten Primärschlüssel verwenden (mehr als 100 Byte), sollten Sie erwägen, als eindeutigen Volltextschlüssel einen anderen eindeutigen Index in der Tabelle auszuwählen (oder einen anderen eindeutigen Index zu erstellen). Andernfalls kann die Volltextauffüllung nicht mehr fortgesetzt werden, wenn der eindeutige Volltextschlüssel die maximal zulässige Größe erreicht (900 Byte).

  • Wenn Sie eine Tabelle indizieren, die über mehrere Millionen Zeilen verfügt, sollten Sie die Tabelle einem eigenen Volltextkatalog zuweisen.

  • Berücksichtigen Sie sowohl den Umfang der Änderungen in den Tabellen, die mit einem Volltextindex indiziert werden, als auch die Gesamtzahl der Tabellenzeilen. Wenn die Gesamtzahl der geänderten Zeilen zusammen mit der Anzahl an Zeilen, die während der letzten Volltextauffüllung in der Tabelle enthalten waren, mehrere Millionen umfasst, sollten Sie die Tabelle einem eigenen Volltextkatalog zuweisen.

Zuordnen einer Stoppliste zum Volltextindex

Mit SQL Server 2008 werden Stopplisten eingeführt. Eine Stoppliste ist eine Liste von Stoppwörtern. Stoppwörter werden auch als Füllwörter bezeichnet. Jedem Volltextindex ist eine Stoppliste zugeordnet, und die Wörter der Stoppliste werden auf Volltextabfragen des Index angewendet. Standardmäßig ist der Systemstoppliste ein neuer Volltextindex zugeordnet. Sie können stattdessen jedoch auch eine eigene Stoppliste erstellen und verwenden. Weitere Informationen finden Sie unter Stoppwörter und Stopplisten.

Die folgende CREATE FULLTEXT STOPLIST-Transact-SQL-Anweisung erstellt z. B. durch Kopieren der Systemstoppliste eine neue Volltext-Stoppliste mit dem Namen myStoplist3:

CREATE FULLTEXT STOPLIST myStoplist FROM SYSTEM STOPLIST;
GO

Die folgende ALTER FULLTEXT STOPLIST-Transact-SQL-Anweisung ändert eine Stoppliste mit dem Namen myStoplist, indem zuerst für Spanisch und dann für Französisch das Wort "en" hinzugefügt wird:

ALTER FULLTEXT STOPLIST MyStoplist ADD 'en' LANGUAGE 'Spanish';
ALTER FULLTEXT STOPLIST MyStoplist ADD 'en' LANGUAGE 'French';
GO

Aktualisieren eines Volltextindex

Volltextindizes können wie reguläre SQL Server-Indizes automatisch aktualisiert werden, sobald Daten in den zugeordneten Tabellen geändert werden. Dies ist das Standardverhalten. Alternativ dazu können Sie die Volltextindizes auch manuell auf dem aktuellen Stand halten oder in bestimmten Abständen aktualisieren lassen. Das Auffüllen eines Volltextindex kann zeitaufwändig und ressourcenintensiv sein. Aus diesem Grund wird die Indexaktualisierung meist als asynchroner Vorgang durchgeführt, der im Hintergrund ausgeführt wird und den Volltextindex jeweils nach Änderungen in der Basistabelle aktualisiert. Das sofortige Aktualisieren eines Volltextindex nach jeder Änderung in der Basistabelle kann ressourcenintensiv sein. Bei sehr hohen Aktualisierungs-, Einfügungs- und Löschungsraten kann es deshalb zu einer Verringerung der Abfrageleistung kommen. In diesem Fall sollten Sie erwägen, eine manuelle Änderungsnachverfolgung und entsprechende Aktualisierungen zu planen, um die zahlreichen Änderungen von Zeit zu Zeit zu bearbeiten, anstatt mit den Abfragen um Ressourcen zu wetteifern.

Zum Überwachen des Auffüllungsstatus verwenden Sie entweder die Funktion FULLTEXTCATALOGPROPERTY oder OBJECTPROPERTYEX. Führen Sie die folgende Anweisung aus, um den Auffüllungsstatus des Katalogs zu ermitteln:

SELECT FULLTEXTCATALOGPROPERTY('AdvWksDocFTCat', 'Populatestatus');

In der Regel ist das zurückgegebene Ergebnis 1, während ein vollständiges Auffüllen ausgeführt wird.

Beispiel: Einrichten der Volltextsuche (Transact-SQL)

Im folgenden zweiteiligen Beispiel wird ein Volltextkatalog mit dem Namen AdvWksDocFTCat in der AdventureWorks2008R2-Datenbank erstellt, und anschließend wird ein Volltextindex für die Document-Tabelle in AdventureWorks2008R2 erstellt. Diese Anweisung erstellt den Volltextkatalog im bei der Installation angegebenen Standardverzeichnis. Der Ordner mit dem Namen AdvWksDocFTCat befindet sich im Standardverzeichnis.

  1. Im Beispiel wird eine CREATE FULLTEXT CATALOG-Anweisung verwendet, um einen Volltextkatalog mit dem Namen AdvWksDocFTCat zu erstellen:

    USE AdventureWorks2008R2;
    GO
    CREATE FULLTEXT CATALOG AdvWksDocFTCat;
    
  2. Bevor Sie einen Volltextindex für die Tabelle Document erstellen können, müssen Sie sicherstellen, dass die Tabelle über einen eindeutigen, einspaltigen Index verfügt, der keine NULL-Werte zulässt. Die folgende CREATE INDEX-Anweisung erstellt in der DocumentID-Spalte der Document-Tabelle den eindeutigen ui_ukDoc-Index:

    CREATE UNIQUE INDEX ui_ukDoc ON Production.Document(DocumentID);
    
  3. Nachdem Sie einen eindeutigen Schlüssel erstellt haben, können Sie in der Document-Tabelle einen Volltextindex erstellen, indem Sie die folgende CREATE FULLTEXT INDEX-Anweisung verwenden.

    CREATE FULLTEXT INDEX ON Production.Document
    (
        Document                         --Full-text index column name 
            TYPE COLUMN FileExtension    --Name of column that contains file type information
            Language 2057                 --2057 is the LCID for British English
    )
    KEY INDEX ui_ukDoc ON AdvWksDocFTCat --Unique index
    WITH CHANGE_TRACKING AUTO            --Population type;
    GO
    

    Die in diesem Beispiel definierte TYPE COLUMN gibt die Typspalte in der Tabelle an, die den Typ des Dokuments in der Spalte Document (binäre Spalte) enthält. In der Typspalte wird die vom Benutzer angegebene Dateierweiterung für das Dokument der betreffenden Zeile gespeichert: .doc, .xls usw. Das Volltextmodul verwendet die Erweiterung einer Zeile, um den richtigen Filter für die Analyse der Daten in dieser Zeile aufzurufen. Nachdem der Filter die binären Daten der Zeile analysiert hat, analysiert die angegebene Wörtertrennung den Inhalt (in diesem Beispiel wird die Wörtertrennung für britisches Englisch verwendet). Beachten Sie, dass der Filtervorgang nur zur Indizierungszeit ausgeführt wird, bzw. wenn ein Benutzer eine Spalte in der Basistabelle einfügt oder aktualisiert, während für den Volltextindex die automatische Änderungsnachverfolgung aktiviert ist. Weitere Informationen finden Sie unter Filter für die Volltextsuche.

So zeigen Sie Informationen zu einem Volltextindex an

Katalogsicht oder dynamische Verwaltungssicht

Beschreibung

sys.fulltext_index_catalog_usages (Transact-SQL)

Gibt eine Zeile für jeden Verweis zwischen Volltextkatalog und Volltextindex zurück.

sys.fulltext_index_columns (Transact-SQL)

Enthält eine Zeile für jede Spalte, die Teil eines Volltextindexes ist.

sys.fulltext_index_fragments (Transact-SQL)

Ein Volltextindex verwendet interne Tabellen, die als Volltextindexfragmente bezeichnet werden, um die umgekehrten Indexdaten zu speichern. Diese Sicht kann verwendet werden, um die Metadaten zu diesen Fragmenten abzufragen. Diese Sicht enthält eine Zeile für jedes Volltextindexfragment in jeder Tabelle, die einen Volltextindex enthält.

sys.fulltext_indexes (Transact-SQL)

Enthält eine Zeile pro Volltextindex eines Tabellenobjekts.

sys.dm_fts_index_keywords (Transact-SQL)

Gibt Informationen zum Inhalt eines Volltextindex für die angegebene Tabelle zurück.

sys.dm_fts_index_keywords_by_document (Transact-SQL)

Gibt Informationen zum Inhalt auf Dokumentebene eines Volltextindex für die angegebene Tabelle zurück. Ein Schlüsselwort kann in mehreren Dokumenten angezeigt werden.

sys.dm_fts_index_population (Transact-SQL)

Gibt Informationen zu den aktuell ausgeführten Volltextindexauffüllungen zurück.