FREETEXT (Transact-SQL)

這是在 WHERE 子句中用來搜尋包含資料類型以字元為基礎之資料行的述詞,可搜尋意義與搜尋條件的文字符合但用字不完全相同的值。使用 FREETEXT 時,全文檢索查詢引擎內部會對 freetext_string 執行下列動作、為每個詞彙指派加權,然後找出相符項目。

  • 依據文字界限將字串分隔成單字 (斷詞)。

  • 產生字組的字形變化 (詞幹分析)。

  • 依據同義字中的相符項目識別詞彙的展開或取代清單。

主題連結圖示Transact-SQL 語法慣例

語法

FREETEXT ( { column_name | (column_list) | * } 
          , 'freetext_string' [ , LANGUAGE language_term ] )

引數

  • column_name
    這是在 FROM 子句中指定之資料表一個或多個全文檢索索引資料行的名稱。資料行的類型可以是 char、varchar、nchar、nvarchar、text、ntext、image、xml、varbinary 或 varbinary(max)。

  • column_list
    指出您可以指定多個資料行,各資料行用逗號分隔。column_list 必須括在括號中。除非您指定了 language_term,否則,column_list 所有資料行的語言必須相同。

  • *
    指定登錄了全文檢索搜尋的所有資料行,都應該用來搜尋給定的 freetext_string。如果 FROM 子句中有多個資料表,就必須用資料表名稱來限定 *。除非您指定了 language_term,否則,資料表所有資料行的語言必須相同。

  • freetext_string
    這是 column_name 中所要搜尋的文字。您可以輸入任何文字,其中包括單字、片語或句子。在全文檢索索引中找到任何詞彙或任何詞彙的各種形式,都會產生相符項目。

    在 CONTAINS 和 CONTAINSTABLE 搜尋條件中,AND 是關鍵字,但在 freetext_string 中,'and' 是個非搜尋字或停用字詞,將會被捨棄。

    這裡不允許使用 WEIGHT、FORMSOF、萬用字元、NEAR 和其他語法。freetext_string 利用同義字來斷詞、詞幹分析和判斷結果。如果用雙引號括住 freetext_string,就會改成比對片語;不會執行詞幹分析和同義字作業。

    freetext_string 是 nvarchar。當使用另一個字元資料類型當做輸入時,會發生隱含轉換。在下列範例中,定義為 varchar(30) 的 @SearchWord 變數會造成 FREETEXT 述詞中的隱含轉換。

    USE AdventureWorks;
    GO
    DECLARE @SearchWord varchar(30)
    SET @SearchWord ='performance'
    SELECT Description 
    FROM Production.ProductDescription 
    WHERE FREETEXT(Description, @SearchWord);
    

    由於「參數探測」不適用於轉換,所以請使用 nvarchar 來獲得更好的效能。在此範例中,請將 @SearchWord 宣告為 nvarchar(30)。

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

    當產生的並非最佳計畫時,也可以使用 OPTIMIZE FOR 查詢提示。

  • LANGUAGE language_term
    這是查詢利用其資源來斷詞、分析詞幹,以及移除同義字和停用字詞的語言。這個參數是選擇性的,可以指定成對應於語言地區設定識別碼 (LCID) 的字串、整數或十六進位值。如果指定了 language_term,就會將它代表的語言套用至搜尋條件的所有元素上。如果未指定任何值,就會使用資料行全文檢索語言。

    如果不同語言的文件當做二進位大型物件 (BLOB) 一起儲存在單一資料行中,給定文件的地區設定識別碼 (LCID) 會判斷要建立其內容索引所使用的語言。查詢這類資料行時,指定 LANGUAGElanguage_term 可以增加完全相符的機率。

    當指定為字串時,language_term 會對應到 sys.syslanguages (Transact-SQL) 相容性檢視中的 alias 資料行值。字串必須以單引號括住,如 'language_term'。當指定為整數時,language_term 是用於識別語言的實際 LCID。當指定為十六進位值時,language_term 是 0x,後面接著 LCID 的十六進位值。十六進位值不能超出 8 位數,開頭的零也包括在內。

    如果這個值是雙位元組字集 (DBCS) 格式,MicrosoftSQL Server 會將它轉換成 Unicode。

    如果指定的語言無效,或尚未安裝對應於這個語言的資源,MicrosoftSQL Server 就會傳回錯誤。若要使用中性語言資源,請在 language_term 中指定 0x0。

備註

全文檢索述詞與函數會在 FROM 述詞中隱含的單一資料表上處理。若要在多個資料表上進行搜尋,請使用 FROM 子句中聯結的資料表,在兩個或多個資料表之產品的結果集上進行搜尋。

使用 FREETEXT 來進行全文檢索查詢比使用 CONTAINS 來進行全文檢索查詢較為不精確。SQL Server 全文檢索搜尋引擎可找出重要的單字和片語。不給予任何保留關鍵字或萬用字元特殊意義,這些保留關鍵字或萬用字元在 CONTAINS 述詞的 <contains_search_condition> 參數中指定時,通常都具有意義。

如果相容性層級低於 70,就不會將 FREETEXT 視為關鍵字。如需詳細資訊,請參閱<sp_dbcmptlevel (Transact-SQL)>。

當資料庫相容性層級設定為 100 時,OUTPUT 子句中不允許全文檢索述詞。

範例

A. 使用 FREETEXT 搜尋含有指定字元值的單字

下列範例會搜尋包含 vital、safety 和 components 相關單字的所有文件。

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

B. 搭配變數來使用 FREETEXT

下列範例會利用變數來取代特定搜尋詞彙。

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