Erstellen und Verwalten von Volltextindizes
Die Informationen in Volltextindizes werden von der Volltext-Engine verwendet, um Volltextabfragen zu kompilieren, die eine Tabelle schnell nach bestimmten Wörtern oder Wortkombination durchsuchen können. In einem Volltextindex werden Informationen zu signifikanten Wörtern und ihre Position innerhalb einer oder mehreren Spalte einer Datenbanktabelle gespeichert. Ein Volltextindex ist besonderer Typ eines tokenbasierten funktionellen Index, der durch die Volltext-Engine für SQL Server erstellt und verwaltet wird. Der Vorgang der Erstellung eines Volltextindexes unterscheidet sich vom Erstellen anderer Indextypen. Statt eine B-Struktur basierend auf einem Wert in einer bestimmten Zeile aufzubauen, erstellt die Volltextsuch-Engine eine invertierte, gestapelte, komprimierte Indexstruktur basierend auf einzelnen Token aus dem zu indizierenden Text. Die Größe des Volltextindexes wird nur durch den verfügbaren Speicherplatz des Computers eingeschränkt, auf dem die Instanz von SQL Server ausgeführt wird.
Beginnend mit SQL Server 2008 sind Volltextindizes in die Datenbank-Engine integriert und befinden sich nicht mehr im Dateisystem, wie dies in früheren Versionen von SQL Server der Fall war. Bei einer neuen Datenbank ist ein Volltextkatalog jetzt ein virtuelles Objekt, das keiner Dateigruppe angehört. Es ist lediglich ein logisches Konzept, das für eine Gruppe von Volltextindizes steht. Beachten Sie jedoch, dass während des Upgrades einer SQL Server 2005-Datenbank in jedem Volltextkatalog, der Datendateien enthält, eine neue Dateigruppe erstellt wird. Weitere Informationen finden Sie unter Upgrade Full-Text Search.
Hinweis
In SQL Server 2008 und höheren Versionen befindet sich die Volltext-Engine im SQL Server-Prozess, anstatt in einem separaten Dienst. Durch die Integration der Volltext-Engine in die Datenbank-Engine konnte die Verwaltbarkeit verbessert und die Leistung bei gemischten Abfragen sowie die Leistung insgesamt optimiert werden.
Nur ein Volltextindex pro Tabelle ist zulässig. Damit ein Volltextindex für eine Tabelle erstellt werden kann, muss die Tabelle eine einzelne eindeutige Spalte aufweisen, die keine NULL-Werte enthält. Sie können einen Volltextindex für die Volltextsuche für alle Spalten vom Typ char
, varchar
, nchar
, nvarchar
, text
, ntext
, image
, xml
, varbinary
und varbinary(max)
erstellen. Zum Erstellen eines Volltextindexes für eine Spalte, deren Datentyp , varbinary(max)
, image
oder xml
istvarbinary
, müssen Sie eine Typspalte angeben. Eine Typspalte ist eine Tabellenspalte, in der die Dateierweiterung (DOC, PDF, XLS usw.) für das Dokument in der betreffenden Zeile gespeichert wird.
Der Vorgang, bei dem ein Volltextindex erstellt und verwaltet wird, wird als Auffüllung (oder Durchforstung) bezeichnet. Es gibt drei Auffüllungstypen für Volltextindizes: vollständige Auffüllungen, Auffüllungen mithilfe der Änderungsnachverfolgung sowie inkrementelle, auf Timestamps basierende Auffüllungen. Weitere Informationen finden Sie unter Auffüllen von Volltextindizes.
Allgemeine Aufgaben
So erstellen Sie einen Volltextindex
So ändern Sie einen Volltextindex
So löschen Sie einen Volltextindex
Struktur der Volltextindizes
Die Kenntnis der Struktur eines Volltextindex hilft Ihnen dabei, die Funktionsweise der Volltext-Engine zu verstehen. In diesem Thema wird der folgende Auszug der Tabelle Dokument in Adventure Works als Beispieltabelle verwendet. Der Auszug enthält nur zwei Spalten, DocumentID und Title , und drei Zeilen der Tabelle.
Für dieses Beispiel wird davon ausgegangen, dass ein Volltextindex für die Title -Spalte erstellt wurde.
DocumentID | Titel |
---|---|
1 | Crank Arm and Tire Maintenance |
2 | Front Reflector Bracket and Reflector Assembly 3 |
3 | Front Reflector Bracket Installation |
Die folgende Tabelle, in der Fragment 1 enthalten ist, zeigt den Inhalt des Volltextindex, der für die Title -Spalte der Document -Tabelle erstellt wurde. Volltextindizes enthalten mehr Informationen als die in dieser Tabelle dargestellten. Die Tabelle ist eine logische Darstellung eines Volltextindex und wird nur zu Demonstrationszwecken bereitgestellt. Die Zeilen werden in einem komprimierten Format gespeichert, um die Datenträgernutzung zu optimieren.
Beachten Sie, dass die Daten gegenüber den Originaldokumenten umgekehrt wurden. Die Umkehrung tritt auf, da die Schlüsselwörter den Dokument-IDs zugeordnet sind. Aus diesem Grund wird ein Volltextindex häufig als invertierter Index bezeichnet.
Beachten Sie auch, dass das Schlüsselwort "and" aus dem Volltextindex entfernt wurde. Dies ist der Fall, weil "and" ein Stoppwort ist und das Entfernen von Stoppwörtern aus einem Volltextindex zu beträchtlichen Einsparungen beim Datenträgerspeicher führen kann, wodurch die Abfrageleistung verbessert wird. Weitere Informationen finden sie unter Konfigurieren und Verwalten von Stoppwörtern und Stopplisten für Volltextsuche.
Fragment 1
Schlüsselwort | ColId | DocId | Vorkommen |
---|---|---|---|
Crank | 1 | 1 | 1 |
Arm | 1 | 1 | 2 |
Tire | 1 | 1 | 4 |
Wartung | 1 | 1 | 5 |
Front | 1 | 2 | 1 |
Front | 1 | 3 | 1 |
Reflector | 1 | 2 | 2 |
Reflector | 1 | 2 | 5 |
Reflector | 1 | 3 | 2 |
Bracket | 1 | 2 | 3 |
Bracket | 1 | 3 | 3 |
Assembly | 1 | 2 | 6 |
3 | 1 | 2 | 7 |
Installation | 1 | 3 | 4 |
Die Keyword -Spalte enthält eine Darstellung eines einzelnen Tokens, das zum Zeitpunkt der Indizierung extrahiert wurde. Woraus ein Token besteht, wird durch die Wörtertrennung bestimmt.
Die ColId -Spalte enthält einen Wert, der einer bestimmten volltextindizierten Spalte entspricht.
Die DocId
Spalte enthält Werte für eine acht-Byte-Ganzzahl, die einem bestimmten Volltextschlüsselwert in einer volltextindizierten Tabelle zugeordnet ist. Diese Zuordnung ist notwendig, wenn der Volltextschlüssel kein ganzzahliger Datentyp ist. In solchen Fällen werden Zuordnungen zwischen Volltextschlüsselwerten und DocId
-werten in einer separaten Tabelle verwaltet, die als DocId-Zuordnungstabelle bezeichnet wird. Um diese Zuordnungen abzufragen, verwenden Sie die gespeicherte Systemprozedur sp_fulltext_keymappings . Um eine Suchbedingung zu erfüllen, müssen DocId-Werte aus der obigen Tabelle mit der DocId-Zuordnungstabelle verknüpft werden, um Zeilen aus der abgefragten Basistabelle abzurufen. Wenn der Volltextschlüsselwert der Basistabelle ein ganzzahliger Typ ist, wird der Wert direkt als DocID verwendet, und es ist keine Zuordnung erforderlich. Die Verwendung von ganzzahligen Volltextschlüsselwerten kann also zur Optimierung von Volltextabfragen beitragen.
Die Spalte Vorkommen enthält einen ganzzahligen Wert. Für jeden DocId-Wert ist eine Liste von Vorkommenwerten vorhanden, die den relativen Wortoffsets des betreffenden Schlüsselworts innerhalb dieser DocId entsprechen. Die Vorkommenwerte sind zum Ermitteln von Ausdrucks- oder NEAR-Übereinstimmungen hilfreich, da z. B. Ausdrücke numerisch aufeinander folgende Vorkommenwerte besitzen. Zum Berechnen von Relevanzbewertungen erfüllen sie ebenfalls eine hilfreiche Funktion. So kann z. B. die Anzahl der Vorkommen eines Schlüsselworts in einer DocId zur Rangfolgenberechnung verwendet werden.
Volltextindexfragmente
Der logische Volltextindex wird normalerweise auf mehrere interne Tabellen aufgeteilt. Jede interne Tabelle wird als Volltextindexfragment bezeichnet. Einige dieser Fragmente enthalten ggf. aktuellere Daten als andere. Wenn Benutzer z. B. die folgende Zeile aktualisieren, deren DocId den Wert 3 hat, und für die Tabelle die automatische Änderungsnachverfolgung verwendet wird, wird ein neues Fragment erstellt.
DocumentID | Titel |
---|---|
3 | Rear Reflector |
Im folgenden Beispiel, das Fragment 2 zeigt, enthält das Fragment im Vergleich zu Fragment 1 für DocId 3 aktuellere Daten. Wenn Benutzer eine Abfrage für "Rear Reflector" ausführen, werden daher für DocId 3 die Daten aus Fragment 2 verwendet. Jedes Fragment ist mit einem Erstellungszeitstempel gekennzeichnet, der abgefragt werden kann, indem die Katalogsicht sys.fulltext_index_fragments verwendet wird.
Fragment 2
Schlüsselwort | ColId | DocId | Occ |
---|---|---|---|
Rear | 1 | 3 | 1 |
Reflector | 1 | 3 | 2 |
Wie Sie in Fragment 2 sehen, müssen Volltextabfragen jedes Fragment intern abfragen und ältere Einträge verwerfen. Daher können zu viele Volltextindexfragmente im Volltextindex zu einer beträchtlichen Verringerung der Abfrageleistung führen. Um die Anzahl der Fragmente zu reduzieren, organisieren Sie den Volltextkatalog neu, indem Sie die Option REORGANIZE der Alter FULLTEXT CATALOGTransact-SQL-Anweisung verwenden. Diese Anweisung führt eine Hauptzusammenführungaus, sodass die Fragmente zu einem einzigen größeren Fragment zusammengeführt werden, und entfernt alle veralteten Einträge aus dem Volltextindex.
Nach dem erneuten Organisieren würde der Beispielindex die folgenden Zeilen enthalten:
Schlüsselwort | ColId | DocId | Occ |
---|---|---|---|
Crank | 1 | 1 | 1 |
Arm | 1 | 1 | 2 |
Tire | 1 | 1 | 4 |
Wartung | 1 | 1 | 5 |
Front | 1 | 2 | 1 |
Rear | 1 | 3 | 1 |
Reflector | 1 | 2 | 2 |
Reflector | 1 | 2 | 5 |
Reflector | 1 | 3 | 2 |
Bracket | 1 | 2 | 3 |
Assembly | 1 | 2 | 6 |
3 | 1 | 2 | 7 |