Abfragen mit Volltextsuche

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Schreiben Sie Volltextabfragen mit den Prädikaten CONTAINS und FREETEXT sowie den zeilenwertigen Funktionen CONTAINSTABLE und FREETEXTTABLE mit einer SELECT Anweisung. Dieser Artikel enthält Beispiele für jedes Prädikat und jede Funktion und hilft Ihnen dabei, das beste Prädikat bzw. die beste Funktion auszuwählen.

  • Verwenden Sie zum Abgleichen von Wörtern und Phrasen CONTAINS und CONTAINSTABLE.
  • Verwenden Sie FREETEXT und FREETEXTTABLE, um die Bedeutung, aber nicht die genaue Formulierung, wiederzugeben.

Beispiele für alle Prädikate und Funktionen

Die Codebeispiele in diesem Artikel verwenden die AdventureWorks2025- oder AdventureWorksDW2025 Beispieldatenbank, die Sie von der Microsoft SQL Server Samples and Community Projects Homepage herunterladen können.

Sie müssen zusätzlich die Volltextsuche einrichten, um die Beispielabfragen auszuführen. Weitere Informationen finden Sie unter Starten mit Full-Text Suche.

Beispiel: CONTAINS

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

USE AdventureWorks2025;
GO

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

Beispiel: FREITEXT

Im folgenden Beispiel wird nach allen Dokumenten gesucht, die Wörter im Zusammenhang mit vital safety components enthalten:

USE AdventureWorks2025;
GO

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

Beispiel: CONTAINSTABLE

Das folgende Beispiel liefert die Beschreibungs-ID und die Beschreibung aller Produkte, für die die Spalte Description das Wort aluminum in der Nähe entweder des Wortes light oder des Wortes lightweightenthält. Nur Reihen mit einem höheren Rang als 2 werden zurückgegeben.

USE AdventureWorks2025;
GO

SELECT FT_TBL.ProductDescriptionID,
       FT_TBL.Description,
       KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL
     INNER JOIN CONTAINSTABLE (Production.ProductDescription, Description, '(light NEAR aluminum) OR
      (lightweight NEAR aluminum)') AS KEY_TBL
     ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEY_TBL.RANK DESC;
GO

Beispiel: FREETEXTTABLE

Das folgende Beispiel erweitert eine FREETEXTTABLE Abfrage so, dass zuerst die höchstplatzierten Zeilen zurückgegeben und die Rangfolge jeder Zeile zur Auswahlliste hinzugefügt wird. Um eine ähnliche Abfrage zu schreiben, muss man wissen, dass ProductDescriptionID die eindeutige Schlüsselspalte für die ProductDescription Tabelle ist.

USE AdventureWorks2025;
GO

SELECT KEY_TBL.RANK,
       FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
     INNER JOIN FREETEXTTABLE (Production.ProductDescription, Description, 'perfect all-around bike') AS KEY_TBL
         ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

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

USE AdventureWorks2025;
GO

SELECT KEY_TBL.RANK,
       FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
     INNER JOIN FREETEXTTABLE (Production.ProductDescription, Description, 'perfect all-around bike') AS KEY_TBL
         ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK >= 10
ORDER BY KEY_TBL.RANK DESC;
GO

Übereinstimmung von Wörtern oder Bedeutungen

CONTAINS und CONTAINSTABLE oder FREETEXT und FREETEXTTABLE eignen sich für verschiedene Arten des Abgleichs. Die folgenden Informationen helfen Ihnen, das beste Prädikat oder die beste Funktion für Ihre Abfrage auszuwählen:

CONTAINS und CONTAINSTABLE

  • Suchen Sie nach einzelnen Wörtern und Ausdrücken mit genauen oder (ungenauen) Fuzzy-Matches.
  • Sie haben außerdem folgende Möglichkeiten:
    • Geben Sie den Abstand von Wörtern in einer bestimmten Entfernung voneinander an.
    • Geben Sie gewichtete Übereinstimmungen zurück.
    • Kombinieren Sie Suchbedingungen mit logischen Operatoren. Weitere Informationen finden Sie später in diesem Artikel unter Use Boolean operators (AND, OR und NOT).

FREETEXT und FREETEXTTABLE

  • Sucht nach der Bedeutung, nicht nach dem genauen Wortlaut der angegebenen Wörter, Ausdrücke oder Sätze (Freitextzeichenfolgen).
  • Übereinstimmungen werden dann generiert, wenn ein Begriff oder eine Form eines Begriffs im Volltextindex einer angegebenen Spalte gefunden wird.

Vergleichen Sie Prädikate und Funktionen

Die CONTAINS- oder FREETEXT-Prädikate und die CONTAINSTABLE- oder FREETEXTTABLE-Zeilenwertfunktionen haben unterschiedliche Syntax und Optionen. Die folgenden Informationen helfen Ihnen, das beste Prädikat oder die beste Funktion für Ihre Abfrage auszuwählen:

Die Prädikate CONTAINS und FREETEXT

Verwendung. Verwenden Sie die CONTAINS und FREETEXT Volltext-Prädikate in der WHERE- oder HAVING-Klausel einer SELECT-Anweisung.

Ergebnisse. Die Prädikate CONTAINS und FREETEXT geben einen Wert vom Typ TRUE oder FALSE zurück, der angibt, ob eine gegebene Zeile mit der Volltextabfrage übereinstimmt. Übereinstimmende Zeilen werden im Resultset zurückgegeben.

Weitere Optionen. Man kann die Prädikate mit jedem der anderen Transact-SQL Prädikate kombinieren, wie zum Beispiel LIKE und BETWEEN.

Sie können 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.

Sie können einen vierteiligen Namen im CONTAINS- oder FREETEXT-Prädikat verwenden, um volltextindizierte Spalten der Zieltabellen eines verknüpften Servers abzufragen. Erstellen Sie zum Vorbereiten eines Remoteservers für den Empfang von Volltextabfragen einen Volltextindex für die Zieltabellen und -spalten auf dem Remoteserver, und fügen Sie anschließend den Remoteserver als Verbindungsserver hinzu.

Weitere Informationen zur Syntax und Argumente dieser Prädikate finden Sie unter CONTAINS und FREETEXT.

Rowsetwertfunktionen CONTAINSTABLE und FREETEXTTABLE

Verwendung. Verwenden Sie die Volltextfunktionen CONTAINSTABLE und FREETEXTTABLE wie einen normalen Tabellennamen in der FROM-Klausel einer SELECT-Anweisung.

Sie müssen die Basistabelle festlegen, um zu suchen, wenn Sie eine dieser Funktionen verwenden. 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 können Sie optional die Sprache angeben, deren Ressourcen bei der Volltextabfrage verwendet werden sollen.

Typischerweise müssen Sie die Ergebnisse von CONTAINSTABLE oder FREETEXTTABLE mit der Basistabelle verknüpfen. Um die Tabellen zusammenzufügen, müssen Sie den eindeutigen Namen der Schlüsselspalte kennen. Diese Spalte, die in jeder Volltext-aktivierten Tabelle vorkommt, wird verwendet, um eindeutige Zeilen für die Tabelle (die eindeutige Schlüsselspalte) zu erzwingen. Weitere Informationen zur Schlüsselspalte finden Sie unter Erstellen und Verwalten von Volltextindizes.

Ergebnisse. Diese Funktionen geben eine Tabelle mit null, einer oder mehreren Zeilen zurück, die mit der Volltextabfrage übereinstimmen. Die zurückgegebene Tabelle enthält nur Zeilen aus der Basistabelle, die die angegebenen Auswahlkriterien in der Volltextsuchbedingung der Funktion erfüllen.

Abfragen, die eine dieser Funktionen verwenden, geben für jede zurückgegebene Zeile ebenfalls einen Relevanzrangwert (RANK) und einen Volltextschlüssel (KEY) zurück, wie folgt:

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

  • RANK Spalte. Die Spalte RANK liefert für jede Zeile einen Rangwert, der angibt, wie gut die Zeile den Auswahlkriterien entsprach. Je höher der Rangwert des Textes oder Dokuments in einer Zeile ist, desto relevanter ist die Zeile für die betreffende Volltextabfrage. Unterschiedliche Zeilen können denselben Rang haben. Sie können die Anzahl der Übereinstimmungen, die zurückgegeben werden, begrenzen, indem Sie den optionalen Parameter top_n_by_rank angeben. Weitere Informationen finden Sie unter Suchergebnisse mit Rang begrenzen.

Für weitere Informationen zur Syntax und den Argumenten dieser Funktionen siehe CONTAINSTABLE und FREETEXTTABLE.

Bestimmte Suchvorgangsarten

Suche nach einem bestimmten Wort oder Satz (einfacher Begriff)

Sie können CONTAINS, CONTAINSTABLE, FREETEXT oder FREETEXTTABLE verwenden, um eine Tabelle nach einem bestimmten Wort oder Ausdruck zu durchsuchen. Wenn Sie zum Beispiel die ProductReview Tabelle in der AdventureWorks2025 Datenbank durchsuchen möchten, um alle Kommentare zu einem Produkt mit der Phrase learning curvezu finden, könnten Sie das CONTAINS Prädikat wie folgt verwenden:

USE AdventureWorks2025;
GO

SELECT Comments
FROM Production.ProductReview
WHERE CONTAINS ((Comments), '"learning curve"');
GO

Die Suchbedingung kann in diesem Fall learning curvekomplex sein und aus einem oder mehreren Begriffen bestehen.

Weitere Informationen zu einfachen Begriffssuchen

Bei der Volltextsuche handelt es sich bei einem Wort (oder einem Token) um eine Zeichenfolge, deren Grenzen gemäß den linguistischen Regeln der angegebenen Sprache von entsprechenden Wörtertrennungen identifiziert werden. Ein gültiger Ausdruck besteht aus mehreren Wörtern mit oder ohne Satzzeichen dazwischen.

Zum Beispiel ist croissant ein Wort, und café au lait ist eine Phrase. Solche Wörter und Ausdrücke werden als einfache Begriffe bezeichnet.

CONTAINS und CONTAINSTABLE suchen nach einer exakten Übereinstimmung für den Ausdruck. FREETEXT und FREETEXTTABLE zerlegen die Phrase in einzelne Wörter.

Suchen Sie nach einem Wort mit einem Präfix (Präfixbegriff)

Sie können CONTAINS oder CONTAINSTABLE verwenden, um nach Wörtern oder Ausdrücken mit einem bestimmten Präfix zu suchen. Alle Einträge in der Spalte, die Text enthalten und mit dem angegebenen Präfix beginnen, werden zurückgegeben. Zum Beispiel sieht die Abfrage, um nach allen Zeilen zu suchen, die das Präfix top-enthalten, wie in topple, topping, , und top, wie folgt aus:

USE AdventureWorks2025;
GO

SELECT Description,
       ProductDescriptionID
FROM Production.ProductDescription
WHERE CONTAINS ((Description), '"top*"');
GO

Es werden alle Textstellen zurückgegeben, die mit dem Text vor dem Sternchen (*) übereinstimmen. Wenn Text und Sternchen nicht durch doppelte Anführungszeichen abgegrenzt sind, wie in CONTAINS (DESCRIPTION, 'top*'), betrachtet die Volltextsuche das Sternchen nicht als Joker.

Ist der Präfixbegriff ein Ausdruck, wird jedes Token, das Teil des Ausdrucks ist, als gesonderter Präfixbegriff behandelt. Alle Zeilen, die Wörter haben, die mit den Präfixbegriffen beginnen, werden zurückgegeben. Zum Beispiel findet der Präfixterm light bread* Zeilen mit Text von light breaded, lightly breaded, oder light bread, aber er gibt nicht zurück.lightly toasted bread

Weitere Informationen zu Präfix-Suchen

Ein Präfixbegriff ist eine Zeichenfolge, die einem Wort vorangestellt ist, um ein abgeleitetes Wort oder eine Flexionsform zu erhalten.

  • Für einen einzelnen Präfixterm ist jedes Wort, das mit dem angegebenen Begriff beginnt, Teil der Ergebnismenge. Zum Beispiel stimmt der Begriff auto* mit automatic, automobile, und so weiter.

  • Im Falle eines Ausdrucks wird jedes Wort innerhalb des Ausdrucks als Präfixbegriff interpretiert. Zum Beispiel entspricht der Begriff auto tran*automatic transmission und automobile transducer, aber nicht automatic motor transmission.

Präfixsuchen werden von CONTAINS und CONTAINSTABLEunterstützt.

Suche nach Flexionsformen eines bestimmten Wortes (Erzeugungsbegriff)

Sie können CONTAINS, CONTAINSTABLE, FREETEXT oder FREETEXTTABLE verwenden, um nach allen verschiedenen Zeitformen und Konjugationen eines Verbs, nach den Singular- und Pluralformen eines Substantivs (eine Flexionssuche) oder nach synonymen Formen eines bestimmten Wortes (eine Thesaurussuche) zu suchen.

Das folgende Beispiel sucht nach jeder Form von foot (foot, feet, und so weiter) in der Comments Spalte der ProductReview Tabelle in der AdventureWorks2025 Datenbank:

USE AdventureWorks2025;
GO

SELECT Comments,
       ReviewerName
FROM Production.ProductReview
WHERE CONTAINS ((Comments), 'FORMSOF(INFLECTIONAL, "foot")');
GO

Die Volltextsuche verwendet Wortstammerkennungen, über die Sie die unterschiedlichen Zeiten und Konjugationen eines Verbs suchen oder sowohl die Singular- als auch die Pluralform eines Substantivs suchen können. Für weitere Informationen zu den Stemmern siehe Konfigurieren und Verwalten von Worttrennern und Stemmern.

Weitere Informationen zu Suchen nach Generierungsbegriffen

Bei den Flexionsformen handelt es sich um die verschiedenen Tempora und Konjugationen eines Verbs oder die Singular- und Pluralformen eines Substantivs.

Suchen Sie zum Beispiel nach der Flexionsform des Wortes drive. Wenn verschiedene Zeilen in der Tabelle die Wörter drive, drives, drove, driving und driven enthalten, würden alle zur Ergebnismenge gehören, da jede dieser Formen durch Flexion aus dem Wort drive gebildet werden kann.

FREETEXT und FREETEXTTABLE suchen standardmäßig nach Flexionsformen aller angegebenen Wörter. CONTAINS und CONTAINSTABLE ein optionales INFLECTIONAL Argument unterstützen.

Suche nach Synonymen eines bestimmten Worts

Ein Thesaurus definiert vom Benutzer angegebene Synonyme für Ausdrücke. Für weitere Informationen zu Thesaurus-Dateien siehe Thesaurus-Dateien konfigurieren und verwalten für Full-Text Suche.

Wenn zum Beispiel ein Eintrag , {car, automobile, truck, van}, einem Thesaurus hinzugefügt wird, kann man nach der Thesaurusform des Wortes carsuchen. Alle Zeilen in der abfragenden Tabelle, die die Wörter automobile, truck, , vanoder car enthalten, erscheinen in der Ergebnismenge, weil jedes dieser Wörter zur Synonymerweiterungsmenge gehört, die das Wort carenthält.

FREETEXT und FREETEXTTABLE verwenden standardmäßig den Thesaurus. CONTAINS und CONTAINSTABLE ein optionales THESAURUS Argument unterstützen.

Suche nach einem Wort in der Nähe eines anderen Wortes

Ein Näherungsbegriff bezeichnet Wörter oder Ausdrücke, die sich in Nähe zueinander befinden. Sie können auch die maximale Anzahl von nicht als Suchkriterium festgelegten Begriffen angeben, die zwischen dem ersten und dem letzten Suchbegriff liegen. Außerdem können Sie in einer beliebigen Reihenfolge oder in der angegebenen Reihenfolge nach Wörtern oder Ausdrücken suchen.

Zum Beispiel möchten Sie die Zeilen finden, in denen das Wort ice in der Nähe des Wortes hockey liegt oder in denen die Phrase ice skating nahe der Phrase ice hockeyliegt.

Weitere Informationen zu Nähe-Suchen finden Sie unter Wörter mit NEAR in der Nähe eines anderen Wortes suchen.

Suche nach Wörtern oder Phrasen mit gewichteten Werten (gewichteter Begriff)

Sie können es verwenden CONTAINSTABLE , um nach Wörtern oder Phrasen zu suchen und einen Gewichtungswert anzugeben. Die Gewichtung, gemessen als eine Zahl von 0,0 bis 1,0, gibt die Bedeutung für jedes Wort und jeden Ausdruck in einer Gruppe von Wörtern und Ausdrücken an. Der Gewichtungswert 0.0 ist der niedrigste, und 1.0 ist der höchste mögliche Wert.

Das folgende Beispiel zeigt eine Abfrage, die nach allen Kundenadressen sucht, wobei Gewichte verwendet werden, wobei jeder Text, der mit der Zeichenkette Bay beginnt, entweder Street oder Viewenthält. Die Ergebnisse geben den Zeilen, die mehr der angegebenen Wörter enthalten, einen höheren Rang.

USE AdventureWorks2025;
GO

SELECT AddressLine1,
       KEY_TBL.RANK
FROM Person.Address AS Address
     INNER JOIN CONTAINSTABLE (Person.Address, AddressLine1, 'ISABOUT ("Bay*",
         Street WEIGHT(0.9),
         View WEIGHT(0.1)
         ) ') AS KEY_TBL
     ON Address.AddressID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

Ein gewichteter Begriff kann in Kombination mit jedem einfachen Begriff, Präfixbegriff, Generierungsbegriff oder Näherungsbegriff verwendet werden.

Weitere Informationen zu gewichteten Begriffssuchen

In einer Suche nach einem gewichteten Begriff gibt der Gewichtungswert für jedes Wort und jeden Ausdruck in einer Gruppe von Wörtern und Ausdrücken den Grad der Wichtigkeit an. Der Gewichtungswert 0,0 ist der niedrigste, und 1,0 ist der höchste mögliche Wert.

Sie können beispielsweise in einer Abfrage, in der nach mehreren Begriffen gesucht wird, jedem Suchwort einen Gewichtungswert zuweisen, der dessen Bedeutung im Vergleich zu den anderen Wörtern in der Suchbedingung angibt. In den Ergebnissen für diesen Abfragetyp werden die relevantesten Zeilen zuerst zurückgegeben, entsprechend der relativen Gewichtung, die Sie den Suchwörtern zugewiesen haben. Die Ergebnismengen enthalten Dokumente oder Zeilen, die einen der angegebenen Begriffe (oder Inhalte zwischen ihnen) enthalten; Einige Ergebnisse gelten jedoch als relevanter als andere, da die gewichteten Werte mit verschiedenen gesuchten Begriffen variieren.

Gewichtete Begriffssuchen werden von CONTAINSTABLEunterstützt.

Verwenden der booleschen Operatoren AND, OR und NOT

Das CONTAINS Prädikat und die CONTAINSTABLE Funktion verwenden dieselben Suchbedingungen. Beide unterstützen die Kombination mehrerer Suchbegriffe durch die Verwendung von Boolesche Operatoren (AND, OR, und NOT) zur Durchführung logischer Operationen. Sie können AND beispielsweise verwenden, um Zeilen zu finden, die sowohl latte als auch New York-style bagel enthalten. Sie können zum Beispiel verwenden AND NOT, um die Zeilen zu finden, die enthalten bagel , aber nicht cream cheeseenthalten.

Im Gegensatz dazu behandeln FREETEXT und FREETEXTTABLE boolesche Begriffe als zu suchende Wörter.

Für Informationen über die Kombination CONTAINS mit anderen Prädikaten, die die logischen Operatoren AND, ORNOTund verwenden, siehe Suchbedingung.

Beispiel

Das folgende Beispiel verwendet das CONTAINS Prädikat, um nach Beschreibungen zu suchen, bei denen die Beschreibungs-ID nicht gleich 5 ist und die Beschreibung sowohl das Wort Aluminum als auch das Wort spindleenthält. Die Suchbedingung verwendet den AND Booleschen Operator. Dieses Beispiel verwendet die ProductDescription Tabelle der AdventureWorks2025 Datenbank.

USE AdventureWorks2025;
GO

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

Groß-/Kleinschreibung, Stoppwörter, Sprache und Thesaurus

Beim Schreiben von Volltextabfragen können Sie auch die folgenden Optionen angeben:

  • Unterscheidung nach Groß-/Kleinschreibung. Bei Volltextabfragen wird nicht nach Groß- und Kleinschreibung unterschieden. Im Japanischen gibt es allerdings mehrere phonetische Orthografien, bei denen das Konzept der orthografischen Normalisierung ähnlich der Nichtunterscheidung nach Groß-/Kleinschreibung ist (z. B. kana = keine Unterscheidung). Diese Art der orthographischen Normalisierung wird nicht unterstützt.

  • Stoppwörter. Wenn Sie eine Volltextanfrage definieren, verwirft die Full-Text Engine Stopwords (auch Rauschwörter genannt) aus den Suchkriterien. Stopwörter sind Wörter wie a, and, , isoder the, die häufig vorkommen können, aber bei der Suche nach bestimmten Texten in der Regel nicht helfen. Stoppwörter sind in einer Stoppwortliste aufgeführt. 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 konfigurieren und verwalten für Full-Text Suche.

  • Sprache mit der LANGUAGE Option. Viele Abfrageausdrücke hängen sehr vom Verhalten bei Wörtertrennungen ab. Um sicherzustellen, dass Sie den richtigen Wortbrecher (und Stemmer) sowie die richtige Thesaurusdatei verwenden, sollten Sie die Option LANGUAGE angeben. Weitere Informationen finden Sie unter Choose a Language bei der Erstellung eines Volltext-Indexes.

  • Thesaurus. FREETEXT und FREETEXTTABLE Abfragen verwenden standardmäßig das Thesaurus. CONTAINS und CONTAINSTABLE ein optionales THESAURUS Argument unterstützen. Weitere Informationen finden Sie unter Konfigurieren und Verwalten von Thesaurusdateien für die Volltextsuche.

Überprüfen Sie die Ergebnisse der Tokenisierung

Nachdem Sie in einer Abfrage eine bestimmte Kombination aus Worttrennungskomponente, Thesaurus und Stoppliste verwendet haben, können Sie mithilfe der dynamischen Verwaltungssicht sys.dm_fts_parser sehen, wie die Volltextsuche die Ergebnisse tokenisiert. Für weitere Informationen siehe sys.dm_fts_parser.