FREETEXT (Transact-SQL)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體
這是在 Transact-SQL SELECT 陳述式的 Transact-SQL WHERE 子句中使用的述詞,可在包含字元型資料類型的全文檢索索引資料行上執行 SQL Server 全文檢索搜尋。 這個述詞會搜尋意義與搜尋條件的文字符合但用字不完全相同的值。 使用 FREETEXT 時,全文檢索查詢引擎會在內部對 freetext_string 執行下列動作、為每個詞彙指派加權,然後找出相符項目:
依據文字界限將字串分隔成單字 (斷詞)。
產生字組的字形變化 (詞幹分析)。
依據同義字中的相符項目識別詞彙的展開或取代清單。
注意
如需有關 SQL Server 所支援全文檢索搜尋形式的資訊,請參閱使用全文檢索搜尋進行查詢。
適用於:SQL Server (SQL Server 2008 (10.0.x) 到最新版本)。
語法
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 是 nvarchar。 當使用另一個字元資料類型當做輸入時,會發生隱含轉換。 不能使用大型字串資料類型 nvarchar(max) 和 varchar(max)。 在下列範例中,定義為 @SearchWord
的 varchar(30)
變數會造成 FREETEXT
述詞中的隱含轉換。
USE AdventureWorks2022;
GO
DECLARE @SearchWord VARCHAR(30)
SET @SearchWord ='performance'
SELECT Description
FROM Production.ProductDescription
WHERE FREETEXT(Description, @SearchWord);
由於「參數探測」不適用於轉換,因此請使用 nvarchar 來獲得更好的效能。 在此範例中,請將 @SearchWord
宣告為 nvarchar(30)
。
USE AdventureWorks2022;
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) 會判斷要建立其內容索引所使用的語言。 查詢此種資料行時,指定 LANGUAGE language_term 可以增加完全相符的機率。
當指定為字串時,language_term 會對應到 sys.syslanguages (Transact-SQL) 相容性檢視表中的 alias 資料行值。 字串必須以單引號括住,如 'language_term'。 當指定為整數時,language_term 是用於識別語言的實際 LCID。 當指定為十六進位值時,language_term 是 0x,後面接著 LCID 的十六進位值。 十六進位值不能超出 8 位數,開頭的零也包括在內。
如果這個值是雙位元組字集 (DBCS) 格式,Microsoft SQL Server 會將其轉換成 Unicode。
如果指定的語言無效,或尚未安裝對應於這個語言的資源,Microsoft SQL Server 就會傳回錯誤。 若要使用中性語言資源,請將 0x0 指定為 language_term。
一般備註
全文檢索述詞與函數會在 FROM 述詞中隱含的單一資料表上處理。 若要在多個資料表上進行搜尋,請使用 FROM 子句中聯結的資料表,在兩個或多個資料表之產品的結果集上進行搜尋。
使用 FREETEXT 來進行全文檢索查詢比使用 CONTAINS 來進行全文檢索查詢較為不精確。 SQL Server 全文檢索搜尋引擎可找出重要的單字和片語。 針對在 CONTAINS 述詞的 <contains_search_condition> 參數中指定時通常已具有意義的任何保留關鍵字或萬用字元,不會賦予任何特殊意義。
當資料庫相容性層級設定為 100 時,OUTPUT 子句 中不允許使用全文檢索述詞。
注意
FREETEXTTABLE 函數適用的比對種類與 FREETEXT 述詞相同。 您可以在 SELECT 陳述式的 FROM 子句中參考此函數,就像它是一般資料表名稱一樣。 如需詳細資訊,請參閱 FREETEXTTABLE (Transact-SQL)。
查詢遠端伺服器
您可以在 CONTAINS 或 FREETEXT 述詞中使用四部分名稱,以查詢所連結伺服器上目標資料表的全文檢索索引資料行。 若要準備遠端伺服器來接收全文檢索查詢,請針對遠端伺服器上的目標資料表與資料行建立全文檢索索引,然後加入遠端伺服器成為連結的伺服器。
LIKE 與全文檢索搜尋的比較
相較於全文檢索搜尋,LIKE Transact-SQL 述詞只能針對字元模式運作。 您也無法使用 LIKE 述詞來查詢格式化的二進位資料。 此外,針對大量非結構化文字資料執行 LIKE 查詢的速度會比針對相同資料執行對等全文檢索查詢的速度要慢很多。 對於數百萬列的資料,使用 LIKE 查詢時可能要好幾分鐘才能傳回搜尋結果,但是使用全文檢索查詢時可能只要幾秒鐘的時間 (視傳回的資料列數目而定)。
範例
A. 使用 FREETEXT 搜尋含有所指定字元值的單字
下列範例會搜尋包含 vital、safety 和 components 相關單字的所有文件。
USE AdventureWorks2022;
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT (Document, 'vital safety components' );
GO
B. 搭配變數來使用 FREETEXT
下列範例會利用變數來取代特定搜尋詞彙。
USE AdventureWorks2022;
GO
DECLARE @SearchWord NVARCHAR(30);
SET @SearchWord = N'high-performance';
SELECT Description
FROM Production.ProductDescription
WHERE FREETEXT(Description, @SearchWord);
GO
另請參閱
全文檢索搜尋使用者入門
建立及管理全文檢索目錄
CREATE FULLTEXT CATALOG (Transact-SQL)
CREATE FULLTEXT INDEX (Transact-SQL)
建立及管理全文檢索索引
使用全文檢索搜尋查詢
建立全文檢索搜尋查詢 (Visual Database Tools)
CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
資料類型 (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
WHERE (Transact-SQL)