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.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

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 Trennzeichen getrennte Spalten angegeben werden können. column_list muss in Klammern eingeschlossen werden. Sofern nicht language_term 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.

    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 AdventureWorks2008R2;
    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 AdventureWorks2008R2;
    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, legt der Gebietsschemabezeichner (LCID) eines bestimmten Dokuments die zur Indizierung seines Inhalts zu verwendende Sprache fest. 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, 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 Microsoft SQL Server in Unicode konvertiert.

    Wenn die angegebene Sprache ungültig ist oder keine Ressourcen installiert sind, die dieser Sprache entsprechen, gibt Microsoft SQL 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 mindestens zwei Tabellen erstellt wird.

Volltextabfragen mit FREETEXT sind nicht so genau wie Volltextabfragen 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.

Vergleich zwischen LIKE und der Volltextsuche

Im Gegensatz zur Volltextsuche verarbeitet das LIKE-Transact-SQL-Prädikat ausschließlich Zeichenmuster. Darüber hinaus können Sie mit dem LIKE-Prädikat keine formatierten Binärdaten abfragen. Eine LIKE-Abfrage in umfangreichen unstrukturierten Textdaten ist sehr viel langsamer als eine entsprechende Volltextabfrage in denselben Daten. Eine LIKE-Abfrage für Millionen von Zeilen von Textdaten kann Minuten in Anspruch nehmen; eine Volltextabfrage kann dagegen in Sekunden oder weniger für dieselben Daten ein Ergebnis liefern, je nach Anzahl der zurückgegebenen Zeilen.

Beispiel

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 AdventureWorks2008R2;
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 Suchbegriff, sondern eine Variable verwendet.

USE AdventureWorks2008R2;
GO
DECLARE @SearchWord nvarchar(30);
SET @SearchWord = N'high-performance';
SELECT Description 
FROM Production.ProductDescription 
WHERE FREETEXT(Description, @SearchWord);
GO