安裝設定與基礎查詢請參考前兩篇。本文深入探討 CONTAINS、FREETEXT 及其資料表值函數變體的進階語法與實戰技巧。
-- AND: 同時包含
SELECT username FROM member WHERE CONTAINS(userinfo, '"作家" AND "木匠"');
-- OR: 包含任一
SELECT username FROM member WHERE CONTAINS(userinfo, '"作家" OR "木匠"');
-- AND NOT: 包含前者但不包含後者
SELECT username FROM member WHERE CONTAINS(userinfo, '"作家" AND NOT "木匠"');
找出兩詞距離較近的文件 (同段落/鄰近句子)。
SELECT Content FROM MicrosoftRecord
WHERE CONTAINS(Content, '"比爾·蓋茨" NEAR "保羅·艾倫"');
自動比對動詞時態、名詞單複數等 (英文有效,中文支援有限)。
SELECT ProductName FROM Products
WHERE CONTAINS(ProductName, 'FORMSOF (INFLECTIONAL, dry)');
-- 比對 dry, dried, drying, dries 等
SELECT ProductName FROM Products
WHERE CONTAINS(ProductName, '"dis*"');
-- 比對 disease, display, distance 等
權重 0.0~1.0,影響回傳順序。
SELECT CategoryName, Description FROM Categories
WHERE CONTAINS(Description,
'ISABOUT (spread WEIGHT (.8), sauces WEIGHT (.4), relishes WEIGHT (.2))');
SELECT FT_TBL.Title, KEY_TBL.RANK
FROM Docs AS FT_TBL
INNER JOIN CONTAINSTABLE(Docs, Content, '"SQL Server"') AS KEY_TBL
ON FT_TBL.DocID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
回傳欄位:[KEY] (唯一鍵值)、RANK (相關性分數 0-1000)。
自動斷詞、過濾停用詞、比對詞形變化 (類似 FORMSOF),中文支援有限。
SELECT CategoryName FROM Categories
WHERE FREETEXT(Description, 'sweetest candy bread and dry meat');
SELECT FT_TBL.CategoryName, KEY_TBL.RANK
FROM Categories AS FT_TBL
INNER JOIN FREETEXTTABLE(Categories, Description, 'sweet candy bread') AS KEY_TBL
ON FT_TBL.CategoryID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
CONTAINS,自然語言輸入用 FREETEXTCONTAINSTABLE/FREETEXTTABLE 配合 RANK