共用方式為


全文檢索函數與全文檢索述詞的比較

CONTAINSTABLE 與 FREETEXTTABLE 函數可用來指定傳回每個資料列相關等級的全文檢索查詢。這些函數相當類似,但與全文檢索述詞 CONTAINS 與 FREETEXT 的用法不同。

雖然全文檢索述詞與全文檢索函數兩者皆可用於進行全文檢索查詢,且在述詞與函數中用來指定全文檢索搜尋條件的語法也都一樣,但是它們的用法還是有重大的差異。下列列出一些相似度及差異的要點:

  • CONTAINS 與 FREETEXT 都會傳回 TRUE 或 FALSE 值,而且都是在 SELECT 陳述式的 WHERE 或 HAVING 子句中指定。
  • CONTAINSTABLE 與 FREETEXTTABLE 都會傳回零列、一列或多列資料表,所以必須在 FROM 子句中加以指定。
  • CONTAINS 與 FREETEXT 只可以用來指定選取條件,讓 Microsoft SQL Server 用來決定結果集的成員資格。
  • CONTAINSTABLE 與 FREETEXTTABLE 也是用來指定選取條件。傳回的資料表具有稱為 KEY (其中包含全文檢索索引鍵值) 的資料行。每個全文檢索的註冊資料表都有一個資料行的數值保證是唯一的。CONTAINSTABLE 或 FREETEXTTABLE 的 KEY 資料行中,由全文檢索的註冊資料表內傳回之數值,是符合全文檢索搜尋條件之選取條件的資料列唯一的值。

此外,CONTAINSTABLE 與 FREETEXTTABLE 產生的資料表會有一個 RANK 資料行,其中包含從 0 到 1000 的值。該值越低表示關聯性越低。這些值的用途,在根據資料列符合選取條件的程度予以分級。

ms142494.note(zh-tw,SQL.90).gif附註:
等級值僅表示結果集中的資料列關聯次序。實際的值並不重要,而且每次執行查詢後該值可能會不一樣。如需有關等級的詳細資訊,請參閱<瞭解等級>。

CONTAINS 與 FREETEXT 查詢不會傳回任何等級值。

當執行使用 CONTAINSTABLE 與 FREETEXTTABLE 函數的查詢時,傳回的合格資料列必須明確地與原始 SQL Server 資料表中的資料列聯結。

以下的範例將傳回所有食物種類的描述與類別名稱,其中 Description 資料行包含 "sweet and savory" 的單字,近似於 "sauces" 或 "candies"。所有類別目錄名稱是 "Seafood" 的資料列都會被略過。只會傳回等級值大於或等於 2 的資料列。

ms142494.note(zh-tw,SQL.90).gif附註:
若要執行此主題中的某些範例,您必須安裝 Northwind 資料庫。如需有關如何安裝 Northwind 資料庫的資訊,請參閱<下載 Northwind 和 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 與 CONTAINS 的比較

CONTAINSTABLE 函數與 CONTAINS 述詞使用類似的搜尋條件。

不過,在 CONTAINSTABLE 中您可指定欲進行全文檢索搜尋的資料表、欲搜尋資料表內的資料行 (或所有資料行) 和搜尋條件。有一個選擇性參數,可讓使用者指定在傳回相符項目時,只傳回所指定的最大數量。如需詳細資訊,請參閱此主題的<限制結果集>一節。

CONTAINSTABLE 將傳回包含 RANK 資料行的資料表。此 RANK 資料行包含每個資料列的數值,它指出了資料列與選取條件的符合程度。資料列的等級值越高,該資料列與指定全文檢索查詢的關聯性就越大。

CONTAINSTABLE 與 CONTAINS 的比較

下列查詢將擴充 FREETEXTTABLE 查詢,以便先傳回最高等級的資料列,並將每個資料列的等級加至選取清單。若要指定查詢,您必須知道 CategoryIDCategories 資料表的唯一索引鍵資料行。

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

以下為相同查詢的擴充,它只傳回等級值大於或等於 10 的資料列:

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

識別唯一索引鍵資料行名稱

當編寫使用資料列集值函數的查詢時,必須先知道唯一索引鍵資料行的名稱。每個啟用全文檢索功能的資料表都具有 TableFulltextKeyColumn 屬性,其中會包含資料行識別碼,以選擇這個資料行來強制資料表中資料列的唯一性。此範例說明如何以程式方式取得索引鍵資料行的名稱。

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

限制結果集以傳回最相關的結果

在許多全文檢索查詢中,符合搜尋條件的項目數會非常大。為避免查詢傳回太多符合項,可在 CONTAINSTABLE 與 FREETEXTTABLE 中使用選擇性的 top_n_by_rank 引數,以根據要傳回的等級指定符合項個數。

ms142494.note(zh-tw,SQL.90).gif附註:
使用 top_n_by_rank 引數會傳回滿足全文檢索查詢的資料列子集。如果結合 top_n_by_rank 與其他述詞,則查詢所傳回的資料列數會少於實際相符所有述詞的資料列數。

透過此資訊,Microsoft?SQL Server 將依照等級來排序符合項目,並且最多只傳回指定的個數。此選項可能大幅地增加效能。例如,通常從一百萬個資料列中傳回 100,000 列的查詢,如果只要求前 100 個資料列的話,就會處理得更為快速。

如果希望先前使用 CONTAINSTABLE 的範例只傳回前 3 個符合項,則查詢的寫法如下:

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

結果集如下:

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     

下列範例將傳回前 10 個食物種類的描述與類別,其中 Description 資料行包含了 "sweet and savory" 單字,近似於 "sauces" 或 "candies"。

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

請參閱

其他資源

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

說明及資訊

取得 SQL Server 2005 協助