Freigeben über


Vergleich zwischen Volltextfunktionen und Volltextprädikaten

Die Funktionen CONTAINSTABLE und FREETEXTTABLE werden zur Angabe von Volltextabfragen verwendet, die Relevanzrangfolgen für die einzelnen Zeilen zurückgeben. Diese Funktionen sind den Volltextprädikaten CONTAINS und FREETEXT sehr ähnlich, werden jedoch auf andere Art verwendet.

Obwohl sowohl die Volltextprädikate als auch die Volltextfunktionen für Volltextabfragen verwendet werden und die Syntax zum Angeben der Volltextsuchbedingung in den Prädikaten und den Funktionen dieselbe ist, gibt es wesentliche Unterschiede hinsichtlich der Verwendung. Im Folgenden werden einige wichtige Punkte zu Ähnlichkeiten und Unterschieden aufgeführt:

  • CONTAINS und FREETEXT geben den Wert TRUE oder FALSE zurück und werden in der WHERE- oder der HAVING-Klausel einer SELECT-Anweisung angegeben.
  • CONTAINSTABLE und FREETEXTTABLE geben eine Tabelle mit keiner, einer oder mehreren Zeilen zurück, sie müssen also immer in der FROM-Klausel angegeben werden.
  • CONTAINS und FREETEXT können nur verwendet werden, um Auswahlkriterien anzugeben, die Microsoft SQL Server zum Bestimmen der Mitgliedschaft des Resultsets verwendet.
  • CONTAINSTABLE und FREETEXTTABLE werden ebenfalls zum Angeben von Auswahlkriterien verwendet. Die zurückgegebene Tabelle besitzt eine Spalte namens KEY, die Volltextschlüsselwerte enthält. Jede registrierte Volltexttabelle verfügt über eine Spalte mit Werten, deren Eindeutigkeit sichergestellt ist. Die in der KEY-Spalte von CONTAINSTABLE oder FREETEXTTABLE zurückgegebenen Werte sind die eindeutigen Werte aus der registrierten Volltexttabelle aus den Zeilen, die die in der Volltextsuchbedingung angegebenen Suchkriterien erfüllen.

Außerdem besitzt die durch CONTAINSTABLE und FREETEXTTABLE erzeugte Tabelle eine Spalte namens RANK, die Werte von 0 bis 1000 enthält. Ein niedrigerer Wert gibt eine geringere Relevanz an. Diese Werte werden verwendet, um die Rangfolge der zurückgegebenen Zeilen gemäß ihrer Übereinstimmung mit den Auswahlkriterien festzulegen.

ms142494.note(de-de,SQL.90).gifHinweis:
Der Rangwert gibt lediglich eine relative Relevanzreihenfolge der Zeilen im Resultset an. Der tatsächliche Wert hat keine Bedeutung und kann bei jeder Ausführung der Abfrage anders ausfallen. Weitere Informationen zur Rangfolge finden Sie unter Grundlegendes zur Rangfolge.

CONTAINS- und FREETEXT-Abfragen geben keine Rangwerte zurück.

Bei der Ausführung von Abfragen, die die Funktionen CONTAINSTABLE und FREETEXTTABLE verwenden, müssen die zurückgegebenen gefundenen Zeilen explizit mit den Zeilen in der ursprünglichen SQL Server-Tabelle verknüpft werden.

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.

ms142494.note(de-de,SQL.90).gifHinweis:
Wenn Sie Beispiele aus diesem Thema ausführen möchten, müssen Sie die Northwind-Datenbank installieren. Weitere Informationen zum Installieren der Northwind-Datenbank finden Sie unter Downloaden der Beispieldatenbanken Northwind und pubs.
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

CONTAINSTABLE und CONTAINS im Vergleich

Die CONTAINSTABLE-Funktion und das CONTAINS-Prädikat verwenden ähnliche Suchbedingungen.

In CONTAINSTABLE geben Sie jedoch die Tabelle, in der eine Volltextsuche ausgeführt wird, die Spalte (oder alle Spalten) in der zu durchsuchenden Tabelle und die Suchbedingung an. In einem optionalen Parameter kann der Benutzer angeben, dass nur die angegebene Anzahl von Übereinstimmungen mit den höchsten Rangwerten zurückgegeben werden soll. Weitere Informationen finden Sie im Abschnitt "Beschränken von Resultsets auf die relevantesten Ergebnisse" in diesem Thema.

Die von CONTAINSTABLE zurückgegebene Tabelle enthält eine Spalte namens RANK. Die RANK-Spalte enthält für jede Zeile einen Wert, der angibt, wie gut die Zeilen mit den Auswahlkriterien übereinstimmen. Je höher der Rangwert einer Zeile ist, desto relevanter ist die Zeile für die betreffende Volltextabfrage.

FREETEXTTABLE und FREETEXT im Vergleich

Die folgende Abfrage 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

Erkennen des Namens der Spalte für den eindeutigen Schlüssel

Beim Schreiben von Abfragen mit Rowsetwertfunktionen müssen Sie den Namen der Spalte für den eindeutigen Schlüssel kennen. Jede volltextfähige Tabelle besitzt die TableFulltextKeyColumn-Eigenschaft, die die Spalten-ID der Spalte enthält, die zum Erzwingen eindeutiger Zeilen für die Tabelle ausgewählt wurde. Das folgende Beispiel zeigt, wie der Name der Schlüsselspalte programmgesteuert ermittelt werden kann.

USE AdventureWorks;
GO
DECLARE @key_column sysname
SET @key_column = Col_Name(Object_Id('Production.Document'),
ObjectProperty(Object_id('Production.Document'),
'TableFulltextKeyColumn') 
)
SELECT @key_column AS 'Unique Key Column';
GO

Beschränken von Resultsets auf die relevantesten Ergebnisse

Bei vielen Volltextsuchen ist die Anzahl der Elemente, die die Suchbedingung erfüllen, sehr umfangreich. Wenn Sie verhindern möchten, dass Abfragen zu viele Übereinstimmungen zurückgeben, können Sie mit dem optionalen Argument top_n_by_rank in CONTAINSTABLE und FREETEXTTABLE die Anzahl der Übereinstimmungen angeben, die gemäß Rangfolge zurückgegeben werden sollen.

ms142494.note(de-de,SQL.90).gifHinweis:
Bei Verwendung des top_n_by_rank-Arguments wird eine Teilmenge von Zeilen bei der Ausführung der Volltextabfrage zurückgegeben. Wenn top_n_by_rank mit anderen Prädikaten kombiniert wird, werden von der Abfrage möglicherweise weniger Zeilen zurückgegeben als die Anzahl Zeilen, die mit allen Prädikaten übereinstimmen.

Mit diesen Informationen sortiert Microsoft SQL Server die Übereinstimmungen nach dem Rang und gibt sie nur bis zur angegebenen Anzahl zurück. Diese Einschränkung kann zu einer deutlichen Leistungssteigerung führen. So wird z. B. eine Abfrage, die normalerweise 100.000 Zeilen aus einer Tabelle mit 1 Million Zeilen zurückgeben würde, bedeutend schneller verarbeitet, wenn nur die obersten 100 Zeilen angefordert werden.

Sollen nur die obersten 3 Übereinstimmungen aus einem vorhergehenden Beispiel mit CONTAINSTABLE zurückgegeben werden, sieht die Abfrage folgendermaßen aus:

USE Northwind;
GO
SELECT   K.RANK, CompanyName, ContactName, Address
FROM      Customers AS C
         INNER JOIN
         CONTAINSTABLE(Customers,Address, 'ISABOUT ("des*",
            Rue WEIGHT(0.5),
            Bouchers WEIGHT(0.9))', 3) AS K
         ON C.CustomerID = K.[KEY];
GO

Im Folgenden wird das Resultset aufgeführt:

RANK CompanyName          ContactName       address            
---- ------------         -----------       -------            
123  Bon app'             Laurence Lebihan  12, rue des Bouchers 
65   Du monde entier      Janine Labrune    67, rue des Cinquante Otages 
15   France restauration  Carine Schmitt    54, rue Royale     

Im folgenden Beispiel werden die Beschreibung und der Kategoriename der obersten zehn 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.

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)'
      , 10
   ) AS KEY_TBL
   ON FT_TBL.CategoryID = KEY_TBL.[KEY];
GO

Siehe auch

Andere Ressourcen

CONTAINSTABLE (Transact-SQL)
FREETEXTTABLE (Transact-SQL)

Hilfe und Informationen

Informationsquellen für SQL Server 2005