首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 7.0 全文檢索架構深度解析:CONTAINS/FREETEXT、索引填充、噪音詞與管理實務

     編輯:關於SqlServer

全文檢索 vs 傳統 LIKE 查詢

特性LIKE '%關鍵字%'全文檢索
效能 全表掃描,大量資料不可用 倒排索引,毫秒級回應
語言感知 無 斷詞器、字幹擴展、同義詞、鄰近搜尋
排序 無關聯性排名 RANK 值 0-1000 依相關性排序
支援資料類型 CHAR/VARCHAR/TEXT CHAR/VARCHAR/VARBINARY/TEXT/IMAGE/XML

核心概念

  • 全文目錄:儲存全文索引的容器,對應檔案系統目錄
  • 全文索引:建立在單一資料表的單一/多欄位上,每張表最多一個
  • 噪音詞:常見無語意詞 (the, is, 的, 是) 依語言過濾,不建立索引
  • 斷詞器:依語言規則切分文字 (英文空格、中文雙字/詞典)
  • 字幹擴展:run → runs/running/ran
  • 同義詞庫:自定義同義詞對 (SQL Server → SQL Server 2000)

查詢語法:CONTAINS / FREETEXT

CONTAINS:精確語法控制

-- 簡單詞彙
SELECT * FROM docs WHERE CONTAINS(content, 'SQL Server');

-- 片語 (需雙引號)
SELECT * FROM docs WHERE CONTAINS(content, '"SQL Server"');

-- 近似/鄰近
SELECT * FROM docs WHERE CONTAINS(content, 'SQL NEAR Server');
SELECT * FROM docs WHERE CONTAINS(content, 'SQL NEAR(Server, 5)'); -- 距離 5 詞內

-- 前綴/字幹
SELECT * FROM docs WHERE CONTAINS(content, 'comput*'); -- computer, computing...

-- 邏輯組合
SELECT * FROM docs WHERE CONTAINS(content, 'SQL AND (Server OR Database)');
SELECT * FROM docs WHERE CONTAINS(content, 'SQL AND NOT Oracle');

-- 加權排序
SELECT TOP 10 *, RANK FROM 
    FREETEXTTABLE(docs, content, 'SQL Server performance tuning')
ORDER BY RANK DESC;

FREETEXT:自然語言查詢

-- 相當於將輸入拆解為關鍵字、字幹、同義詞自動 OR 組合
SELECT * FROM docs WHERE FREETEXT(content, '如何調教 SQL Server 效能');

整合關聯式查詢:無縫結合

SELECT 
    d.DocTitle, d.DocAuthor, d.Size,
    w.Citizenship
FROM doc_collection d
JOIN writers w ON d.DocAuthor = w.writer_name
WHERE CONTAINS(d.DocText, '"SQL Server" NEAR text');

單一查詢同時具備結構化篩選 (JOIN、WHERE) 與非結構化全文搜尋。

架構組件

組件角色進程
SQL Server 引擎 解析 CONTAINS/FREETEXT、產生查詢計畫、回傳結果 sqlservr.exe
全文引擎 索引建立、斷詞、噪音詞過濾、查詢轉換 msftesql.exe (SQL 7.0/2000)
篩選器 解析 Office/PDF/HTML/XML 等格式提取純文字 IFilter COM 介面
斷詞器/字幹器 語言特定切詞與還原 DLL (如 chsbrkr.dll 簡體中文)

管理操作:預存程序 vs 企業管理器

啟用全文檢索 (資料庫層級)

EXEC sp_fulltext_database 'enable';

建立全文目錄

EXEC sp_fulltext_catalog 'ft_catalog', 'create';

建立全文索引


EXEC sp_fulltext_table 'docs', 'create', 'ft_catalog', 'PK_docs';
EXEC sp_fulltext_column 'docs', 'DocText', 'add';
EXEC sp_fulltext_column 'docs', 'DocTitle', 'add';
EXEC sp_fulltext_table 'docs', 'activate';

填充策略

  • 完整填充:重建整個索引,資料量大時耗時
  • 增量填充:僅處理變更列 (需 timestamp 欄位)
  • 自動填充:即時/背景追蹤變更 (SQL 2000+)

EXEC sp_fulltext_catalog 'ft_catalog', 'start_full';
EXEC sp_fulltext_catalog 'ft_catalog', 'start_incremental';

進階調優建議

  1. 選擇性建立索引:僅對真正需要全文搜尋的欄位建立
  2. 噪音詞自訂:編輯 noiseENG.txt (或對應語言檔) 移除業務關鍵字
  3. 同義詞庫維護:定期審視業務術語同義詞
  4. 索引碎片整理:sp_fulltext_catalog 'catalog', 'rebuild'
  5. 硬體隔離:全文目錄放置於獨立磁碟/SSD,減少與資料檔 IO 爭用
  6. 記憶體配置:sp_configure 'full-text search memory', 最大值

現代演進:SQL Server 2008+ 全文檢索整合

  • 全文引擎整合進 sqlservr.exe,不再獨立進程
  • 支援 FILESTREAM/FileTable 檔案流全文索引
  • 語意搜尋:關鍵片語提取、文件相似度
  • 語言支援擴展至 100+,含繁體中文斷詞器
  • 管理介面統合至 SSMS / T-SQL (CREATE FULLTEXT INDEX)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved