SQL Server 全文檢索(Full-Text Search)提供強大的非結構化文字查詢能力,遠超 LIKE '%keyword%' 的效能與功能。本文系統整理核心謂詞(CONTAINS、FREETEXT)、邏輯運算子、鄰近搜尋、字尾擴展、權重排序等語法,並附上中文環境適用性說明。
支援布林邏輯 AND、OR、AND NOT,語法:
SELECT username FROM member
WHERE CONTAINS(userinfo, N'"作家" AND "木匠"');
SELECT username FROM member
WHERE CONTAINS(userinfo, N'"作家" OR "木匠"');
SELECT username FROM member
WHERE CONTAINS(userinfo, N'"作家" AND NOT "木匠"');
注意:關鍵字需用雙引號包裹,中文查詢建議加 N 前綴避免編碼問題。
找出兩詞距離較近的文件(預設同一句或段落內):
SELECT Content FROM MicrosoftRecord
WHERE CONTAINS(Content, N'"比爾·蓋茨" NEAR "保羅·艾倫"');
適用於人名、專有名詞常共同出現的場景。
自動匹配動詞時態、名詞複數等:
SELECT ProductName FROM Products
WHERE CONTAINS(ProductName, 'FORMSOF (INFLECTIONAL, dry)');
-- 可匹配 dry, dried, drying 等
中文限制:中文無詞形變化,此功能對中文無效。
SELECT ProductName FROM Products
WHERE CONTAINS(ProductName, '"dis*"');
-- 匹配 dis*, 如 display, distance 等
同樣主要適用英文,中文分詞機制不同,前綴匹配效果有限。
指定各條件權重 (0.0~1.0),影響相關性排名:
SELECT CategoryName, Description FROM Categories
WHERE CONTAINS(Description,
'ISABOUT (spread WEIGHT (.8), sauces WEIGHT (.4), relishes WEIGHT (.2))');
權重越高,符合該條件的文件排名越前。
回傳 KEY、RANK 資料表,可進一步 JOIN 排序:
SELECT FT_TBL.*, KEY_TBL.RANK
FROM Categories AS FT_TBL
INNER JOIN CONTAINSTABLE(Categories, Description, 'ISABOUT (spread WEIGHT (.8), sauces WEIGHT (.4))') AS KEY_TBL
ON FT_TBL.CategoryID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
自動斷詞、移除停用詞、詞幹擴展,類似搜尋引擎體驗:
SELECT CategoryName FROM Categories
WHERE FREETEXT(Description, 'sweetest candy bread and dry meat');
中文限制:SQL Server 內建斷詞器對中文支援有限(早期版本幾乎無效),建議升級至 SQL Server 2012+ 並安裝中文斷詞器,或改用 Elasticsearch 等專業搜尋引擎。
CREATE FULLTEXT CATALOG → CREATE FULLTEXT INDEX 指定資料行、語言 (LCID 2052 為簡體、1028 為繁體)、變更追蹤模式(自動/手動/排程)。CONTAINS 精確邏輯;FREETEXT 僅作輔助。