Übersicht über Volltextprädikate und -funktionen

Volltextabfragen verwenden Volltextprädikate (CONTAINS und FREETEXT) und -funktionen (CONTAINSTABLE und FREETEXTTABLE). Diese unterstützen eine umfangreiche Transact-SQL-Syntax, die eine Vielzahl verschiedener Abfrageausdrücke gestattet. Zum Schreiben von Volltextabfragen müssen Sie wissen, wie diese Prädikate und Funktionen verwendet werden. In diesem Thema wird eine Übersicht der Prädikate und Funktionen gegeben, und es werden die Gemeinsamkeiten des CONTAINS-Prädikats und der CONTAINSTABLE-Funktion beschrieben.

Übersicht der Volltextprädikate (CONTAINS und FREETEXT)

CONTAINS und FREETEXT werden in der WHERE-Klausel oder der HAVING-Klausel einer SELECT-Anweisung angegeben. Sie können mit beliebigen anderen Transact-SQL-Prädikaten kombiniert werden, wie z. B. LIKE und BETWEEN.

Die Prädikate CONTAINS und FREETEXT geben den Wert TRUE oder FALSE zurück. Sie können nur verwendet werden, um Auswahlkriterien anzugeben, anhand ermittelt wird, ob eine angegebene Zeile mit der Volltextabfrage übereinstimmt. Übereinstimmende Zeilen werden im Resultset zurückgegeben.

Bei der Verwendung von CONTAINS oder FREETEXT können Sie entweder eine einzelne Spalte, eine Liste mit Spalten oder alle Spalten der Tabelle für die Suche auswählen. Optional können Sie die Sprache angeben, deren Ressourcen bei der Volltextabfrage für die Wörtertrennung, die Wortstammerkennung und Thesaurus-Suchen sowie die Entfernung von Füllwörtern verwendet werden.

CONTAINS und FREETEXT eignen sich jeweils für unterschiedliche Arten von Übereinstimmungen:

  • Verwenden Sie CONTAINS (oder CONTAINSTABLE) für genaue oder ungenaue (Fuzzy-)Übereinstimmungen mit einzelnen Wörtern und Satzteilen, für innerhalb einer bestimmten Entfernung angrenzende Wörter sowie für gewichtete Übereinstimmungen. Wenn Sie CONTAINS verwenden, müssen Sie mindestens eine Suchbedingung festlegen, die den zu suchenden Text und die Bedingungen für Übereinstimmungen angibt.

    Sie können logische Operation zwischen Suchbedingungen verwenden. Weitere Informationen finden Sie unter Verwenden von booleschen Operatoren – AND, OR, AND NOT (in CONTAINS und CONTAINSTABLE) weiter unten im vorliegenden Thema.

  • Verwenden Sie FREETEXT (oder FREETEXTTABLE), um nach der Bedeutung ohne exakte Übereinstimmungen des Wortlauts, nach angegebenen Wörtern, Ausdrücken oder Sätzen (sogenannten Freitextzeichenfolgen) zu suchen. Übereinstimmungen werden dann generiert, wenn ein Begriff oder eine Form eines Begriffs im Volltextindex einer angegebenen Spalte gefunden wird.

Um Abfragen auf Verbindungsservern auszuführen, können Sie vierteilige Namen in CONTAINS oder FREETEXT verwenden. Weitere Informationen finden Sie unter Abfragen von Verbindungsservern (Volltextsuche).

Weitere Informationen zur Syntax und zu den Argumenten dieser Prädikate finden Sie unter CONTAINS (Transact-SQL) und FREETEXT (Transact-SQL).

HinweisHinweis

Volltextprädikate sind in der OUTPUT-Klausel nicht zulässig, wenn der Kompatibilitätsgrad der Datenbank auf 100 festgelegt ist.

Beispiele

A. Verwenden von CONTAINS mit <simple_term>

Im folgenden Beispiel werden alle Produkte mit einem Preis von $80.99 gesucht, die das Wort "Mountain" enthalten.

USE AdventureWorks2008R2;
GO
SELECT Name, ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
   AND CONTAINS(Name, 'Mountain');
GO

B. Verwenden von FREETEXT, um nach Wörtern zu suchen, die bestimmte Zeichenwerte enthalten

Im folgenden Beispiel wird nach allen Dokumenten gesucht, die Wörter im Zusammenhang mit wichtigen Sicherheitskomponenten enthalten.

USE AdventureWorks2008R2;
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT (Document, 'vital safety components' );
GO

Übersicht über die Volltextfunktionen (CONTAINSTABLE und FREETEXTTABLE)

Auf die Funktionen CONTAINSTABLE und FREETEXTTABLE wird wie auf einen herkömmlichen Tabellennamen in der FROM-Klausel einer SELECT-Anweisung verwiesen. Sie geben eine Tabelle mit null, einer oder mehreren Zeilen zurück, die die Volltextabfrage erfüllen. Die zurückgegebene Tabelle enthält nur Zeilen der Basistabelle, die die angegebenen Auswahlkriterien in der Volltextsuchbedingung der Funktion erfüllen.

Abfragen, die eine dieser Funktionen verwenden, geben einen Relevanzrangfolgenwert (RANK) und einen Volltextschlüssel für jede Zeile Zurück, wie im Folgenden dargestellt:

  • KEY-Spalte

    Die KEY-Spalte gibt eindeutige Werte der zurückgegebenen Zeilen zurück. Die KEY-Spalte kann verwendet werden, um Auswahlkriterien anzugeben.

  • RANK-Spalte

    Die RANK-Spalte gibt einen Rangwert für jede Zeile zurück, der angibt, wie gut die Zeilen mit den Auswahlkriterien übereinstimmen. Je höher der Rangwert des Textes oder Dokuments in einer Zeile ist, desto relevanter ist die Zeile für die betreffende Volltextabfrage. Beachten Sie, dass unterschiedliche Zeilen denselben Rang haben können. Sie können die Anzahl der zurückgegebenen Übereinstimmungen mit dem optionalen top_n_by_rank-Parameter einschränken. Weitere Informationen finden Sie unter Begrenzen von Resultsets mit Rang (Volltextsuche) und Berechnung des Rangs bei Suchabfrageergebnissen (Volltextsuche).

Beim Verwenden dieser Funktionen müssen Sie die Basistabelle angeben, in der die Volltextsuche durchgeführt werden soll. Wie bei den Prädikaten können Sie eine einzelne Spalte, eine Liste mit Spalten oder alle Spalten in der Tabelle für die Suche auswählen. Außerdem kann optional die Sprache angegeben werden, deren Ressourcen bei der Volltextabfrage verwendet werden sollen.

CONTAINSTABLE ist für dieselben Arten von Übereinstimmungen geeignet wie CONTAINS, FREETEXTTABLE eignet sich entsprechend für dieselben Übereinstimmungen wie FREETEXT. Weitere Informationen finden Sie unter Übersicht der Volltextprädikate (CONTAINS und FREETEXT) weiter oben in diesem Thema. Beim Ausführen von Abfragen, die die CONTAINSTABLE-Funktion oder die FREETEXTTABLE-Funktion verwenden, müssen Sie explizit Zeilen verknüpfen, die zusammen mit den Zeilen der SQL Server-Basistabelle zurückgegeben werden sollen.

Weitere Informationen zur Syntax und zu den Argumenten dieser Funktionen finden Sie unter CONTAINSTABLE (Transact-SQL) und FREETEXTTABLE (Transact-SQL).

Beispiele

A. Verwenden von CONTAINSTABLE

Im folgenden Beispiel werden die Beschreibung und der Kategoriename aller Essenskategorien zurückgegeben, in denen in der Description-Spalte die Wörter "sweet and savory" in der Nähe eines der Wörter "sauces" oder "candies" vorhanden sind. Alle Zeilen mit dem Kategorienamen "Seafood" werden ignoriert. Ausschließlich Zeilen mit einem Rangwert von mindestens 2 werden zurückgegeben.

USE Northwind;
GO
SELECT FT_TBL.Description, 
   FT_TBL.CategoryName, 
   KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
   CONTAINSTABLE (Categories, Description, 
      '("sweet and savory" NEAR sauces) OR
      ("sweet and savory" NEAR candies)'
   ) AS KEY_TBL
   ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
   AND FT_TBL.CategoryName <> 'Seafood'
ORDER BY KEY_TBL.RANK DESC;
GO

B. Verwenden von FREETEXTTABLE

Das folgende Beispiel erweitert eine FREETEXTTABLE-Abfrage so, dass die Zeilen mit dem höchsten Rangfolgenwert zuerst zurückgegeben werden und die Rangfolge jeder Zeile zur Auswahlliste hinzugefügt wird. Um die Abfrage anzugeben, müssen Sie wissen, dass CategoryID die Spalte für den eindeutigen Schlüssel der Categories-Tabelle ist.

USE Northwind;
GO
SELECT KEY_TBL.RANK, FT_TBL.Description
FROM Categories AS FT_TBL 
     INNER JOIN
     FREETEXTTABLE(Categories, Description,
                    'How can I make my own beers and ales?') AS KEY_TBL
     ON FT_TBL.CategoryID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

Im Folgenden finden Sie eine Erweiterung derselben Abfrage, die nur Zeilen mit einem Rangfolgenwert von 10 oder höher zurückgibt:

USE Northwind;
GO
SELECT KEY_TBL.RANK, FT_TBL.Description
FROM Categories FT_TBL 
     INNER JOIN
     FREETEXTTABLE (Categories, Description,
                    'How can I make my own beers and ales?') AS KEY_TBL
     ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK >= 10
ORDER BY KEY_TBL.RANK DESC;
GO

Verwenden von booleschen Operatoren – AND, OR, AND NOT (in CONTAINS und CONTAINSTABLE)

Das CONTAINS-Prädikat und die CONTAINSTABLE-Funktion verwenden dieselben Suchbedingungen. Beide unterstützen das Kombinieren mehrerer Suchbegriffe mit booleschen Operatoren – AND, OR, AND NOT –, um logische Operationen auszuführen. Mit AND können Sie z. B. Zeilen suchen, die sowohl "latte" als auch "Croissants" enthalten. Mit AND NOT können Sie z. B. Zeilen suchen, die zwar "Croissants", aber nicht "rustikal" enthalten.

HinweisHinweis

Im Gegensatz dazu behandeln FREETEXT und FREETEXTTABLE die booleschen Begriffe als Wörter, nach denen gesucht werden soll.

Informationen zum Kombinieren von CONTAINS mit anderen Prädikaten, die die logischen Operatoren AND, OR und NOT unterstützen, finden Sie unter Suchbedingung (Transact-SQL).

Beispiel

Im folgenden Beispiel wird die ProductDescription-Tabelle der AdventureWorks2008R2-Datenbank verwendet. In der Abfrage wird das CONTAINS-Prädikat für die Suche nach Beschreibungen verwendet, deren Beschreibungs-ID ungleich 5 ist und die das Wort "Aluminum" und das Wort "spindle" enthalten. In der Suchbedingung wird der boolesche AND-Operator verwendet.

USE AdventureWorks2008R2;
GO
SELECT Description
FROM Production.ProductDescription
WHERE ProductDescriptionID <> 5 AND
   CONTAINS(Description, ' Aluminum AND spindle');
GO

Weitere Überlegungen

Jede volltextfähige Tabelle beinhaltet eine Spalte, über die die Eindeutigkeit aller Tabellenzeilen erzwungen wird (die eindeutigeSchlüsselspalte). Beim Schreiben von Volltextabfragen mit CONTAINSTABLE oder FREETEXTTABLE benötigen Sie den Namen der Spalte für den eindeutigen Schlüssel. Weitere Informationen finden Sie unter Vorgehensweise: Abfragen der Volltextschlüsselspalte (Transact-SQL).

Viele Abfrageausdrücke hängen sehr vom Verhalten bei Wörtertrennungen ab. Um sicherzustellen, dass Sie die richtige Wörtertrennung (und Wortstammerkennung) sowie die richtige Thesaurusdatei verwenden, wird empfohlen, das LANGUAGE-Argument anzugeben. Weitere Informationen finden Sie unter Bewährte Methoden für das Auswählen einer Sprache beim Erstellen eines Volltextindex.

Wenn Sie eine Volltextabfrage definieren, ignoriert das Volltextmodul Stoppwörter (auch als Füllwörter bezeichnet) in den Suchkriterien. Stoppwörter sind Wörter wie Artikel ("ein" oder "der"), Konjunktionen ("und") oder Hilfsverben ("ist"), die häufig vorkommen können, jedoch bei der Suche nach bestimmtem Text nicht hilfreich sind. Stoppwörter werden in einer Stoppliste aufgelistet. Jedem Volltextindex ist eine bestimmte Stoppliste zugeordnet, die festlegt, welche Stoppwörter bei Abfragen oder im Index während der Indizierung ignoriert werden. Weitere Informationen finden Sie unter Stoppwörter und Stopplisten.

Der Thesaurusvergleich erfolgt nur für CONTAINS- und CONTAINSTABLE-Transact-SQL-Abfragen, in denen die FORMSOF THESAURUS-Klausel angegeben ist, sowie standardmäßig für FREETEXT- und FREETEXTABLE-Abfragen.