FREETEXT (Transact-SQL)
Ein Prädikat, das in einer WHERE-Klausel verwendet wird, mit dem Spalten eines zeichenbasierten Datentyps nach Werten durchsucht werden können, die der Bedeutung der Suchbedingung entsprechen und nicht genau mit dem Wortlaut der Suchbedingung übereinstimmen. Bei Verwendung von FREETEXT führt das Volltextabfragemodul intern die folgenden Aktionen für freetext_string aus, weist jedem Begriff eine Gewichtung zu und sucht dann nach Übereinstimmungen.
Trennt die Zeichenfolge in einzelne Wörter auf der Basis von Wortgrenzen (Wörtertrennung).
Generiert Flexionen der Wörter (Wortstammerkennung).
Legt eine Liste mit Erweiterungen oder Ersetzungen für die Begriffe auf der Basis von Übereinstimmungen im Thesaurus fest.
Syntax
FREETEXT ( { column_name | (column_list) | * }
, 'freetext_string' [ , LANGUAGE language_term ] )
Argumente
column_name
Der Name einer oder mehrerer volltextindizierten Spalten der in der FROM-Klausel angegebenen Tabelle. Die Spalten können vom Datentyp char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary oder varbinary(max) sein.column_list
Gibt an, dass verschiedene durch Kommas getrennte Spalten festgelegt werden können. column_list muss in Klammern eingeschlossen werden. Sofern language_term nicht angegeben ist, muss die Sprache aller Spalten von column_list identisch sein.*
Gibt an, dass alle für die Volltextsuche registrierten Spalten nach dem angegebenen freetext_string-Wert durchsucht werden. Wenn mehr als eine Tabelle in der FROM-Klausel vorhanden ist, muss das *-Argument durch den Tabellennamen gekennzeichnet werden. Sofern language_term nicht angegeben ist, muss die Sprache aller Spalten in der Tabelle identisch sein.freetext_string
Der Text, nach dem in column_name gesucht werden soll. Es kann hierbei ein beliebiger Text aus Wörtern, Ausdrücken und Sätzen eingegeben werden. Übereinstimmungen werden dann generiert, wenn ein Begriff oder Formen eines Begriffs im Volltextindex gefunden werden.Im Gegensatz zur CONTAINS- und CONTAINSTABLE-Suchbedingung, in der AND ein Schlüsselwort ist, wird das Wort 'and' in freetext_string als Füllwort oder als Stoppwort eingestuft und verworfen.
Die Verwendung von WEIGHT, FORMSOF, Platzhaltern, NEAR und sonstiger Syntax ist nicht zulässig. Für freetext_string werden die Wörtertrennung und die Wortstammerkennung ausgeführt sowie der Thesaurus angewendet. Wenn freetext_string in doppelten Anführungszeichen eingeschlossen ist, wird nach der Übereinstimmung eines Ausdrucks gesucht. Die Wortstammerkennung wird nicht ausgeführt und der Thesaurus wird nicht angewendet.
freetext_string ist vom Datentyp nvarchar. Wird ein anderer Zeichendatentyp als Eingabe verwendet, findet eine implizite Konvertierung statt. Im folgenden Beispiel verursacht die @SearchWord-Variable, die als varchar(30) definiert ist, eine implizite Konvertierung im FREETEXT-Prädikat.
USE AdventureWorks; GO DECLARE @SearchWord varchar(30) SET @SearchWord ='performance' SELECT Description FROM Production.ProductDescription WHERE FREETEXT(Description, @SearchWord);
Da das "Parametersniffing" zusammen mit der Konvertierung nicht funktionsfähig ist, sollten Sie aus Leistungsgründen nvarchar verwenden. Im Beispiel sollten Sie somit @SearchWord als nvarchar(30) deklarieren.
USE AdventureWorks; GO DECLARE @SearchWord nvarchar(30) SET @SearchWord = N'performance' SELECT Description FROM Production.ProductDescription WHERE FREETEXT(Description, @SearchWord);
In Fällen, in denen ein nicht optimaler Plan generiert wird, können Sie auch den OPTIMIZE FOR-Abfragehinweis verwenden.
LANGUAGE language_term
Die Sprache, deren Ressourcen für die Wörtertrennung, die Wortstammerkennung und den Thesaurus sowie die Entfernung von Stoppwörtern in der Abfrage verwendet werden. Dieser Parameter ist optional und kann als Zeichenfolge, ganze Zahl oder Hexadezimalwert entsprechend dem Gebietsschemabezeichner (Locale Identifier, LCID) einer Sprache angegeben werden. Wird language_term angegeben, wird die entsprechende Sprache auf alle Elemente der Suchbedingung angewendet. Wird kein Wert angegeben, wird die Volltextsprache der Spalte verwendet.Wenn Dokumente anderer Sprachen zusammen als BLOBs (Binary Large Objects) in einer einzelnen Spalte gespeichert werden, bestimmt der Gebietsschemabezeichner (LCID) eines bestimmten Dokuments die zur Indizierung seines Inhalts zu verwendende Sprache. Beim Abfragen einer solchen Spalte kann die Angabe von LANGUAGElanguage_term die Wahrscheinlichkeit einer hohen Übereinstimmung erhöhen.
Wenn language_term als Zeichenfolge angegeben wird, entspricht diese dem Wert der alias-Spalte in der sys.syslanguages (Transact-SQL)-Kompatibilitätssicht. Die Zeichenfolge muss in einfache Anführungszeichen eingeschlossen werden, wie z. B. 'language_term'. In Form einer ganzen Zahl ist language_term der eigentliche Gebietsschemabezeichner, der die Sprache identifiziert. In Form eines Hexadezimalwerts ist language_term gleich 0x, gefolgt vom Hexadezimalwert des Gebietsschemabezeichners. Der Hexadezimalwert darf acht Ziffern nicht überschreiten, einschließlich führender Nullen.
Wird der Wert im Format Doppelbyte-Zeichensatz (Double-Byte Character Set, DBCS) angegeben, wird er von MicrosoftSQL Server in Unicode konvertiert.
Wenn die angegebene Sprache ungültig ist oder keine Ressourcen installiert sind, die dieser Sprache entsprechen, gibt MicrosoftSQL Server einen Fehler zurück. Geben Sie 0x0 als language_term an, um neutrale Sprachressourcen zu verwenden.
Hinweise
Volltextprädikate und -funktionen gelten für eine einzelne Tabelle, die im FROM-Prädikat enthalten ist. Um eine Suche in mehreren Tabellen auszuführen, können Sie eine verknüpfte Tabelle in der FROM-Klausel verwenden, um in einem Resultset zu suchen, das aus zwei oder mehr Tabellen erstellt wird.
Die Volltextsuche mit FREETEXT ist nicht so genau wie die Volltextsuche mit CONTAINS. Das SQL Server-Volltextsuchmodul identifiziert wichtige Wörter und Ausdrücke. Reservierten Schlüsselwörtern und Platzhalterzeichen, die dann eine Bedeutung besitzen, wenn sie im <contains_search_condition>-Parameter des CONTAINS-Prädikats angegeben werden, wird keine spezielle Bedeutung zugewiesen.
FREETEXT wird nicht als Schlüsselwort erkannt, wenn der Kompatibilitätsgrad kleiner als 70 ist. Weitere Informationen finden Sie unter sp_dbcmptlevel (Transact-SQL).
Volltextprädikate sind in der OUTPUT-Klausel nicht zulässig, wenn der Kompatibilitätsgrad der Datenbank auf 100 festgelegt ist.
Beispiele
A. 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 AdventureWorks;
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT (Document, 'vital safety components' );
GO
B. Verwenden von FREETEXT mit Variablen
Im folgenden Beispiel wird kein bestimmter Suchausdruck, sondern eine Variable verwendet.
USE AdventureWorks;
GO
DECLARE @SearchWord nvarchar(30);
SET @SearchWord = N'high-performance';
SELECT Description
FROM Production.ProductDescription
WHERE FREETEXT(Description, @SearchWord);
GO
Siehe auch