SQL Server 全文搜索/全文索引


概述

全文引擎使用全文索引中的信息來編譯可快速搜索表中的特定詞或詞組的全文查詢。全文索引將有關重要的詞及其位置的信息存儲在數據庫表的一列或多列中。全文索引是一種特殊類型的基於標記的功能性索引,它是由 SQL Server 全文引擎生成和維護的。生成全文索引的過程不同於生成其他類型的索引。全文引擎並非基於特定行中存儲的值來構造 B 樹結構,而是基於要編制索引的文本中的各個標記來生成倒排、堆積且壓縮的索引結構。

  • 全文索引是針對數據表,只能對表創建全文索引,不能對數據庫創建全文索引。
  • 每個數據庫可以不包含全文目錄或包含多個全文目錄,一個全文目錄可以包含多個全文索引,但一個全文索引只能用於構成一個全文目錄。
  • 一個數據表只能創建一個全文索引,一個全文索引可以包含多個字段。
  • 創建全文索引的表必須要有一個唯一的非空索引,並且這個唯一的非空的索引只能是一個字段,不能是組合字段。
  • 每個表只允許有一個全文索引。
  • 可以對以下類型的列創建全文索引:charvarcharncharnvarchartextntextimagexmlvarbinary 和 varbinary(max),從而可對這些列進行全文搜索。對數據類型為 varbinaryvarbinary(max)imagexml的列創建全文索引需要您指定類型列,類型列是用來存儲每行中文檔的文件擴展名(.doc、.pdf、xls 等)的表列。

注意:全文搜索是 SQL Server 數據庫引擎的一個可選組件, 如果你在安裝 SQL Server 時沒有選擇全文搜索,請再次運行 SQL Server 安裝程序來添加它。

如果已安裝了全文搜索組件,可在服務中查看對應的服務是否有運行:

 

 

可以使用以下查詢語句來查看對應的數據庫是否已開啟全文搜索:

SELECT DATABASEPROPERTY('{DatabaseName}', 'isfulltextenabled');

 

如果返回結果是 0,可以使用以下腳本進行啟用:

EXEC sp_fulltext_database 'enable'

 

全文搜索查詢與 LIKE 謂詞的對比

LIKE與全文搜索不同,LIKE僅對字符模式有效。另外,不能使用LIKE來查詢格式化的二進制數據。此外,對大量非結構化的文本數據執行LIKE查詢要比對相同數據執行同樣的全文查詢慢得多。對數百萬行文本數據進行的LIKE查詢可能需要幾分鍾的時間才能返回結果;而對於同樣的數據,全文查詢只需要幾秒甚至更少的時間,具體取決於返回的行數。

創建全文目錄

全文目錄用來存儲全文索引。可以直接使用以下腳本進行創建:

CREATE FULLTEXT CATALOG DefaultFullTextCatalog;

 

或者使用管理工具的圖形化界面進行創建:

 

 

為數據庫表創建全文索引

為數據庫表創建全文索引的時候需要指定對應的語言。因為不同的語言的分詞都有所差異,SQL Server將會使用對應語言的分詞器處理表中的數據。SQL Server的全文搜索支持大約 50 種不同語言,可通過查詢sys.fulltext_languages表來查看所有支持的語言。

下面我們對Shop表的ShopName和ShopAddress兩個字段添加簡體中文的全文索引:

CREATE FULLTEXT INDEX ON [dbo].[Shop]
(  
    [ShopName] LANGUAGE 2052,
	[ShopAddress] LANGUAGE 2052
)  
KEY INDEX [PK_Shop] ON DefaultFullTextCatalog
WITH CHANGE_TRACKING AUTO

  

同樣也可以使用管理工具的圖形化界面進行創建:

 

 

全文搜索謂詞/函數

全文查詢使用全文謂詞(CONTAINSFREETEXT)以及全文函數(CONTAINSTABLEFREETEXTTABLE)。它們支持復雜的 Transact-SQL 語法,這種語法支持各種形式的查詢詞。

CONTAINS

CONTAINS用於在 SQL Server 中搜索單個詞和短語的精確或模糊(不太精確的)匹配項、在一定差別范圍內的相近詞或加權匹配項。

例如,查詢商鋪名或者地址中有福田的商鋪:

SELECT * FROM dbo.Shop WHERE CONTAINS((ShopName, ShopAddress),N'福田')

 

CONTAINSTABLE

在查詢方式上與CONTAINS幾乎一樣。但CONTAINSTABLE返回的是符合查詢條件的表,在 SQL 語句中我們可以把它當作一個普通的表來使用,並且使用CONTAINSTABLE的查詢對每一行返回一個相關性排名值 (RANK) 和全文鍵 (KEY)。RANK用於表示相關性的匹配程度,它的值在0~1000之間,KEY就是主表的ID。

所以我們的查詢的時候可以使用RANK進行排序,將相關性高的排在前面:

SELECT T0.ShopID,
       T0.ShopName,
       T0.ShopAddress,
       T1.RANK
FROM dbo.Shop T0
    INNER JOIN CONTAINSTABLE
               (Shop, ShopAddress, N'福田') T1
        ON T0.ShopID = T1.[KEY]
ORDER BY T1.RANK DESC;

 

 

 

 

 

FREETEXT/FREETEXTTABLE

FREETEXT/FREETEXTTABLE的用法與 CONTAINS/CONTAINSTABLE一致。不同的在於FREETEXT/FREETEXTTABLE會先把要查詢的詞句先進行分詞然后再查詢匹配。

例如可以直接查詢:福田的郵局,查詢時SQL Server會自動拆分。

SELECT T0.ShopID,
       T0.ShopName,
       T0.ShopAddress,
       T1.RANK
FROM dbo.Shop T0
    INNER JOIN FREETEXTTABLE
               (Shop, (ShopName, ShopAddress), N'福田的郵局') T1
        ON T0.ShopID = T1.[KEY]
ORDER BY T1.RANK DESC;

 

 

 

另外,可以通過查詢sys.dm_fts_parser來查看分詞結果:

SELECT * FROM sys.dm_fts_parser ('"福田的郵局"', 2052, 0, 0);

 

 

 

更多

以上只列舉了SQL Server全文搜索的一些基本知識和簡單的用法,更詳細的內容可以查看微軟的官方文檔

原文地址:http://www.zkea.net/codesnippet/detail/sqlserver-fulltext-search.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM