使用全文搜尋查詢
適用於:SQL Server
Azure SQL 資料庫
Azure SQL 受控執行個體
使用述詞 CONTAINS 和 FREETEXT 以及資料列集值函式 CONTAINSTABLE 和 FREETEXTTABLE ,搭配 SELECT 陳述式撰寫全文查詢。 本文提供每個述詞和函式的範例,並協助您選擇最適合的來使用。
- 若要比對單字和片語,請使用 CONTAINS 和 CONTAINSTABLE。
- 若要比對意義,而不是確切的用字,請使用 FREETEXT 和 FREETEXTTABLE。
每個述詞和函式的範例
下列範例使用 AdventureWorks 範例資料庫。 如需 AdventureWorks 的最終版本,請參閱 SQL Server 2016 CTP3 的 AdventureWorks 資料庫與指令碼。 若要執行範例查詢,您也必須設定全文檢索搜尋。 如需詳細資訊,請參閱開始使用全文檢索搜尋。
範例 - CONTAINS
下列範例會尋找所有價格為 $80.99
,且包含 "Mountain"
這個詞的產品:
USE AdventureWorks2022
GO
SELECT Name, ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
AND CONTAINS(Name, 'Mountain')
GO
範例 - FREETEXT
下列範例會搜尋包含 vital safety components
相關單字的所有文件:
USE AdventureWorks2022
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT (Document, 'vital safety components')
GO
範例 - CONTAINSTABLE
下列範例會傳回 Description 資料行在 "light" 或 "lightweight" 單字附近包含 "aluminum" 單字之所有產品的描述識別碼和描述。只會傳回排名大於或等於 2 的資料列。
USE AdventureWorks2022
GO
SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL INNER JOIN
CONTAINSTABLE (Production.ProductDescription,
Description,
'(light NEAR aluminum) OR
(lightweight NEAR aluminum)'
) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEY_TBL.RANK DESC;
GO
範例 - FREETEXTTABLE
下列範例將擴充 FREETEXTTABLE 查詢,以便先傳回最高等級的資料列,並將每個資料列的等級加至選取清單。 若要撰寫類似查詢,您必須知道 ProductDescriptionID 是 ProductDescription 資料表的唯一索引鍵資料行。
USE AdventureWorks2022
GO
SELECT KEY_TBL.RANK, FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
INNER JOIN
FREETEXTTABLE(Production.ProductDescription, Description,
'perfect all-around bike') AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC
GO
下面是相同查詢的擴充,其只傳回排名大於或等於 10 的資料列:
USE AdventureWorks2022
GO
SELECT KEY_TBL.RANK, FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
INNER JOIN
FREETEXTTABLE(Production.ProductDescription, Description,
'perfect all-around bike') AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK >= 10
ORDER BY KEY_TBL.RANK DESC
GO
比對單字或比對意義
CONTAINS
/
CONTAINSTABLE
和 FREETEXT
/FREETEXTTABLE
適用於不同類型的比對。 下列資訊協助您選擇查詢的最佳述詞或函式:
CONTAINS/CONTAINSTABLE
- 使用精確或模糊(較不精確)的方式,比對單字和片語。
- 您也可以執行下列動作:
- 指定單字之間在特定距離內的接近程度。
- 傳回加權相符項目。
- 將搜尋條件與邏輯運算子結合起來。 如需詳細資訊,請參閱本文中後續的使用布林運算子 (AND、OR 和 NOT)。
FREETEXT/FREETEXTTABLE
- 比對指定之單字、片語或句子 (「Freetext 字串」) 的意義,而不是確切的用字。
- 當在指定資料行的全文檢索索引中找到詞彙或其任何形式時,就會產生匹配項目。
比較謂詞和函式
述詞 CONTAINS
/FREETEXT
與資料列集值函式 CONTAINSTABLE
/FREETEXTTABLE
的語法和選項不同。 下列資訊協助您選擇查詢的最佳述詞或函式:
謂詞 CONTAINS 和 FREETEXT
使用方式。 在 SELECT 陳述式的 WHERE 或 HAVING 子句中,使用全文檢索述詞 CONTAINS 和 FREETEXT。
結果。 CONTAINS 和 FREETEXT 述詞會傳回 TRUE 或 FALSE 值,指出給定資料列是否符合全文檢索查詢。 符合的資料列就會傳回結果集中。
其他選項。 您可以將述詞與任何其他 Transact-SQL 述詞合併使用,例如 LIKE 和 BETWEEN。
您可以指定要搜尋資料表中的單一資料行、資料行清單或所有資料行。
選擇性地,您可以針對斷詞和詞幹分析、同義字查閱及非搜尋字移除,指定全文檢索查詢使用其資源的語言。
您可以在 CONTAINS 或 FREETEXT 述詞中使用四段式名稱,以查詢連結伺服器上目標資料表的全文檢索索引欄位。 若要準備遠端伺服器來接收全文檢索查詢,請針對遠端伺服器上的目標資料表與資料行建立全文檢索索引,然後加入遠端伺服器成為連結的伺服器。
其他資訊。 如需這些述詞的語法和引數詳細資訊,請參閱 CONTAINS 和 FREETEXT。
資料列集值函數 CONTAINSTABLE 和 FREETEXTTABLE
使用方式。 使用全文檢索函數 CONTAINSTABLE 和 FREETEXTTABLE 函數,如同在 SELECT 語句的 FROM 子句中使用一般資料表名稱。
使用這兩個函式時,您必須指定要搜尋的基底資料表。 至於述詞,您可以指定要搜尋之資料表中的單一資料行、資料行清單或所有資料行,且可選擇性地指定全文檢索查詢使用其資源的語言。
一般而言,您必須聯結 CONTAINSTABLE 或 FREETEXTTABLE 的結果與基底資料表。 若要合併資料表,您必須知道唯一索引鍵資料行名稱。 此資料行出現在每個啟用全文檢索的資料表中,用於確保資料表中資料列的唯一性(unique**key column)。 如需鍵資料行的詳細資訊,請參閱建立及管理全文索引。
結果。 這些函式會傳回符合全文檢索查詢之零、一或多個資料列的資料表。 傳回的資料表僅包含基底資料表的資料列,而這些資料列符合函式之全文檢索搜尋條件中指定的選取準則。
查詢使用其中一個函式時,將會對每個傳回的資料列同時傳回相關性排名值(RANK)和全文索引鍵(KEY)。
- KEY 欄。 KEY 資料行會傳回所傳回之資料列的唯一值。 KEY 資料行可用來指定選取準則。
- RANK 欄。 RANK 資料行會傳回每個資料列的「等級值」(Rank Value),表示資料列與選取準則的符合程度。 資料列中文字或文件的等級值越高,該資料列與給定全文檢索查詢的關聯性就越大。 不同的資料列可能會以完全相同的方式排名。 您可以透過指定選擇性 top_n_by_rank 參數,限制要傳回的相符項目數。 如需詳細資訊,請參閱 限制 RANK 的搜尋結果。
其他資訊。 如需這些函式的語法和引數詳細資訊,請參閱CONTAINSTABLE 和 FREETEXTTABLE。
特定的搜尋類型
搜尋特定單字或片語 (簡單詞彙)
您可以使用 CONTAINS、CONTAINSTABLE、FREETEXT 或 FREETEXTTABLE 來搜尋資料表中的特定單字或片語。 例如,如果您要搜尋 資料庫中的 AdventureWorks2022
資料表,以尋找某產品具有 "learning curve" 片語的所有註解,可依照下列方式使用 CONTAINS 述詞:
USE AdventureWorks2022
GO
SELECT Comments
FROM Production.ProductReview
WHERE CONTAINS(Comments, '"learning curve"')
GO
搜尋條件 (在此範例中是 "learning curve") 有時候可能很複雜,且由一或多個詞彙組成。
簡單字詞搜尋的詳細資訊
在全文檢索中,「詞」(或「標記」)是一種字串,其邊界由適當的分詞工具依據指定語言的語言規則識別。 有效的「片語」是由多個單字所組成 (不論單字之間是否有標點符號)。
例如,"croissant" 是一個單字,而 "café au lait" 則是一個片語。 這類字詞與片語稱為簡單詞彙。
CONTAINS 和 CONTAINSTABLE 會尋找完全相符的片語。 FREETEXT 和 FREETEXTTABLE 會將片語分解成個別的字詞。
搜尋具有字首的單字 (字首詞彙)
您可以使用 CONTAINS 或 CONTAINSTABLE 來搜尋具有指定之前置詞的字詞或片語。 返回欄中所有以指定字首開頭的文字項目。 例如,若要搜尋包含 top
- 前綴的所有資料列,例如 top``ple
、 top``ping
和 top
。 查詢看起來會像下列範例:
USE AdventureWorks2022
GO
SELECT Description, ProductDescriptionID
FROM Production.ProductDescription
WHERE CONTAINS (Description, '"top*"' )
GO
傳回的項目是與星號 (*) 前指定之文字相符的所有文字。 如果文字及星號未以雙引號 (") 分隔,例如 CONTAINS (DESCRIPTION, 'top*')
,則全文檢索搜尋就不會將星號視為萬用字元。
若前置詞彙為片語,每個組成片語的 Token 都會被視為個別的前置項目。 將會傳回包含以特定前置詞語開頭單字的所有資料列。 例如,"light bread*" 這個前置詞彙找到的是包含 "light breaded"、"lightly breaded" 或 "light bread" 文字的資料列,而不會傳回如 "lightly toasted bread" 的資料列。
前置詞搜尋的詳細資訊
「前置詞彙」是指附加至單字前面以便產生衍生字或字形變化的字串。
對於單一前置詞彙而言,任何以指定之詞彙為開頭的單字都會成為結果集的一部分。 例如,"auto*" 可以匹配 "automatic"、"automobile" 等字詞。
對於片語而言,片語中的每個單字都會被視為前置詞彙。 例如,"auto tran*" 這個詞彙可以匹配 "automatic transmission" 和 "automobile transducer",但無法匹配 "automatic motor transmission"。
CONTAINS 和 CONTAINSTABLE支持前置詞搜尋。
搜尋特定單字的屈折變化形式(生成詞)
您可以使用 CONTAINS、CONTAINSTABLE、FREETEXT 或 FREETEXTTABLE 進行搜尋,以查找動詞的所有不同時態和變位形式,或名詞的單數和複數形式(即屈折搜尋),以及某個特定字詞的同義形式(即同義字搜尋)。
下列範例會在 Comments
資料庫中 ProductReview
資料表的 AdventureWorks
資料行內,搜尋任何形式的 "foot" ("foot"、"feet" 等):
USE AdventureWorks2022
GO
SELECT Comments, ReviewerName
FROM Production.ProductReview
WHERE CONTAINS (Comments, 'FORMSOF(INFLECTIONAL, "foot")')
GO
全文檢索會使用字幹分析器,這個工具可讓您搜尋動詞的不同時態和變化,以及名詞的單複數形式。 如需字幹分析器的詳細資訊,請參閱 設定及管理搜尋的文字分隔與字幹分析器。
更多關於生成詞語搜尋的資訊
「屈折形式」是指動詞的不同時態和變位,或是名詞的單數和複數形式。
例如,搜尋 "drive" 這個單字的詞形變化。如果資料表的不同資料列中包括 "drive"、"drives"、"drove"、"driving" 及 "driven" 等單字,因為這些單字全部都是由 "drive" 這個字詞形變化而來,所以都會出現在結果集中。
FREETEXT 和 FREETEXTTABLE 預設會尋找所有指定之單字的變化詞彙。
CONTAINS 和 CONTAINSTABLE 支援選擇性 INFLECTIONAL
引數。
搜尋特定單字的同義字
同義詞庫會為詞彙定義使用者指定的同義字。 如需同義字檔案的詳細資訊,請參閱設定及管理全文檢索搜尋的同義字檔案。
例如,如果 "{car, automobile, truck, van}" 項目新增至同義字,您可以搜尋 "car" 字組的同義字形式。查詢的資料表中所有包含 "automobile"、"truck"、"van" 或 "car" 字組的資料列都會出現在結果集中,因為這些字組都屬於包含 "car" 字組的同義字擴充集。
FREETEXT 和 FREETEXTTABLE 預設會使用同義詞庫。
CONTAINS 和 CONTAINSTABLE 支援選擇性 THESAURUS
引數。
搜尋與另一個單字相鄰的單字
「近接字詞」表示彼此相近的單字或片語。 您也可以指定分隔第一個和最後一個搜尋字詞之非搜尋字詞的數目上限。 此外,您可以依任何順序或是您所指定的順序來搜尋字詞或片語。
例如,您要尋找其中有 "ice" 單字接近 "hockey" 單字,或 "ice skating" 片語接近 "ice hockey" 片語的資料列。
如需鄰近搜尋的詳細資訊,請參閱使用 NEAR 搜尋靠近另一個單字的字詞。
使用加權值來搜尋單字或片語 (加權詞彙)
您可以使用 CONTAINSTABLE 來搜尋字詞或片語,並指定加權值。 加權值是介於 0.0 到 1.0 之間的數字,用來指示每個字詞與片語在一組字詞與片語中的重要程度。 最小的加權值是 0.0,最大則為 1.0。
下列範例顯示一個查詢,該查詢會在客戶地址清單中搜尋所有地址,並使用權重,找出任何以 "Bay" 開頭且包含 "Street" 或 "View" 的文字。結果中,包含指定字組越多的資料列會獲得較高的排名。
USE AdventureWorks2022
GO
SELECT AddressLine1, KEY_TBL.RANK
FROM Person.Address AS Address INNER JOIN
CONTAINSTABLE(Person.Address, AddressLine1, 'ISABOUT ("Bay*",
Street WEIGHT(0.9),
View WEIGHT(0.1)
) ' ) AS KEY_TBL
ON Address.AddressID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC
GO
加權詞彙可以搭配任何簡單詞彙、前綴詞彙、生成詞彙或鄰近詞彙一起使用。
加權字詞搜尋的詳細資訊
在加權字詞搜尋中,「加權值」是表示每個單字與片語在一組單字與片語中的重要程度。 最小的加權值是 0.0,最大則為 1.0。
例如,在搜尋多個詞彙的查詢中,您可以指派每個搜尋單字的加權值,以指出它與搜尋條件中之其他單字的相對重要性。 這類型之查詢的結果會根據您指派給搜尋單字的相對加權,先傳回最相關的資料列。 結果集包含具有任何指定之詞彙的文件或資料列 (或它們之間的內容)。不過,因為與不同搜尋詞彙相關聯的加權值具有變化,所以某些結果會被視為比其他結果更相關。
CONTAINSTABLE 支援加權字詞搜尋。
使用 AND、OR 和 NOT (布林運算子)
CONTAINS 述詞與 CONTAINSTABLE 函數會使用相同的搜尋條件。 這兩個項目都支援使用布林運算子 (AND、OR 和 NOT) 來結合許多搜尋字詞,以便執行邏輯作業。 例如,您可以使用 AND 來尋找同時包含 "latte" 和 "New York-style bagel" 的資料列。例如,您可以使用 AND NOT 來尋找包含 "bagel" 但不包含 "cream cheese" 的資料列。
相較之下,FREETEXT 和 FREETEXTTABLE 會將布林詞彙視為要搜尋的單字。
如需有關將 CONTAINS 與其他使用邏輯運算子 AND、OR 和 NOT 的述詞結合的詳細資訊,請參閱搜尋條件 (Transact-SQL)。
範例
下列範例使用 CONTAINS 謂詞來搜尋描述,其中描述識別碼不等於 5,並且描述中同時包含 "Aluminum" 與 "spindle" 這兩個字。搜尋條件使用 AND 布林運算子。 這個範例使用 AdventureWorks2022
資料庫的 ProductDescription 資料表。
USE AdventureWorks2022
GO
SELECT Description
FROM Production.ProductDescription
WHERE ProductDescriptionID <> 5 AND
CONTAINS(Description, 'aluminum AND spindle')
GO
大小寫、停用字詞、語言和同義字
當您撰寫全文檢索查詢時,也可以指定下列選項:
區分大小寫。 全文檢索是不分大小寫的。 但在日文中,有多種發音拼字法,它的拼音正規化概念就類似不區分大小寫 (例如,kana = insensitivity)。 這類字形規範化並未支援。
停用字詞。 定義全文檢索查詢時,全文檢索引擎會從搜索條件中捨棄停用字詞(也稱為噪音字)。 停用字詞是指 "a"、"and"、"is" 或 "the" 等字,這些字雖然經常出現,但通常對搜尋特定文字並無幫助。 停用字詞會列於停用字詞表中。 每個全文檢索索引都會與特定停用字詞表相關聯,以便判斷哪些停用字詞會在建立索引時,從查詢或索引中省略。 如需詳細資訊,請參閱 設定及管理全文檢索搜尋的停用字詞與停用字詞表。
[語言],含 LANGUAGE 選項。 許多查詢字詞在很大程度上依賴於斷詞工具的行為。 為確保貴單位使用正確的文字分隔器、字幹分析器及同義詞檔案,我們建議您指定語言選項。 如需詳細資訊,請參閱 選擇建立全文檢索索引時的語言。
詞典. FREETEXT 和 FREETEXTTABLE 查詢預設使用同義詞庫。 CONTAINS 和 CONTAINSTABLE 支援選擇性 THESAURUS 引數。 如需詳細資訊,請參閱 設定及管理全文檢索的同義字檔案。
檢查 Token 化結果
在查詢中使用指定的文字分隔器、同義詞庫和停用詞表組合之後,您就可以使用 sys.dm_fts_parser 動態管理檢視來查看全文搜索如何將結果標記化。 如需詳細資訊,請參閱 sys.dm_fts_parser (Transact-SQL)。
另請參閱
CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
FREETEXT (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
建立全文搜尋查詢 (Visual Database Tools)
改善全文檢索查詢的效能