-- 1. 資料庫層級啟用 (SQL 2005 需執行,2008+ 預設啟用)
EXEC sp_fulltext_database 'enable';
GO
-- 2. 建立目錄 (屬於資料庫,非檔案組)
CREATE FULLTEXT CATALOG FTCatalog AS DEFAULT;
GO
-- 或指定路徑 (需服務帳號寫入權限)
CREATE FULLTEXT CATALOG FTCatalog
ON FILEGROUP [PRIMARY]
IN PATH 'D:\FTData\FTCatalog';
GO
-- 3. 前提:基礎表必須有「單一、唯一、非空」的索引 (通常是 PK)
-- 假設表 t_commodity 有 PK_Commodity (id INT PRIMARY KEY)
CREATE FULLTEXT INDEX ON dbo.t_commodity
(
Description LANGUAGE 1028, -- 繁體中文 LCID
Specifications LANGUAGE 1028,
Keywords LANGUAGE 1028
)
KEY INDEX PK_Commodity
ON FTCatalog
WITH CHANGE_TRACKING AUTO; -- 自動追蹤變更
GO
關鍵點:
-- 簡單詞彙
SELECT * FROM t_commodity WHERE CONTAINS(Description, '筆記型電腦');
-- 邏輯運算 (AND / OR / AND NOT)
SELECT * FROM t_commodity WHERE CONTAINS(Description, '筆記型 AND 電腦');
SELECT * FROM t_commodity WHERE CONTAINS(Description, '筆記型 OR 平板');
SELECT * FROM t_commodity WHERE CONTAINS(Description, '筆記型 AND NOT 二手');
-- 前綴搜尋 (* 代表任意字尾)
SELECT * FROM t_commodity WHERE CONTAINS(Description, '"筆記*"'); -- 筆記型、筆記本、筆記...
-- 鄰近搜尋 (NEAR / ~)
SELECT * FROM t_commodity WHERE CONTAINS(Description, '筆記 NEAR 電腦');
SELECT * FROM t_commodity WHERE CONTAINS(Description, '筆記 ~ 電腦');
-- 權重搜尋 (ISABOUT / WEIGHT)
SELECT *, RANK = FREETEXTTABLE(t_commodity, Description, 'ISABOUT (筆記 WEIGHT(0.8), 電腦 WEIGHT(0.5))')
FROM t_commodity
WHERE CONTAINS(Description, 'ISABOUT (筆記 WEIGHT(0.8), 電腦 WEIGHT(0.5))')
ORDER BY RANK DESC;
-- 自動斷詞、同義詞擴展、語幹分析
SELECT * FROM t_commodity WHERE FREETEXT(Description, '我想買一台好用的筆電');
-- 等效於搜尋:筆記型、電腦、筆電、Notebook、Laptop 等相關詞
-- 關聯排名表,可用於分頁、排序
SELECT t.*, ft.TblRank
FROM t_commodity t
INNER JOIN CONTAINSTABLE(t_commodity, Description, '筆記型 電腦') ft
ON t.id = ft.[KEY]
ORDER BY ft.TblRank DESC;
-- 完整填滿 (重建)
ALTER FULLTEXT INDEX ON t_commodity START FULL POPULATION;
-- 增量填滿 (手動追蹤模式)
ALTER FULLTEXT INDEX ON t_commodity START INCREMENTAL POPULATION;
-- 更新統計 (優化查詢計畫)
ALTER FULLTEXT INDEX ON t_commodity START UPDATE POPULATION;
SELECT * FROM sys.fulltext_indexes WHERE object_id = OBJECT_ID('t_commodity');
-- 或
SELECT * FROM sys.dm_fts_index_population WHERE database_id = DB_ID();
DROP FULLTEXT INDEX ON t_commodity;
DROP FULLTEXT CATALOG FTCatalog;
| 現象 | 原因 | 解決 |
|---|---|---|
| 查詢無結果 / 結果不準 | 斷詞器語言不匹配、停用字過濾、未填滿完成 | 確認 LANGUAGE、檢查 `sys.fulltext_indexes` 狀態、手動填滿 |
| 填滿極慢 / 卡住 | 大量資料、磁碟 I/O 瓶頸、斷詞器死循環 | 分批填滿、獨立磁碟、更新斷詞器 |
| CONTAINS 語法錯誤 | 保留字未轉義、雙引號缺失 | 關鍵字用雙引號包裹:`CONTAINS(col, '"word*"')` |