首頁 > 軟體

SQL Server實現全文搜尋查詢詳解

2023-04-04 06:01:36

一、概述

全文索引在表中包括一個或多個基於字元的列。這些列可以具有以下任何資料型別:char、varchar、nchar、nvarchar、text、ntext、image、xml 或 varbinary(max) 和 FILESTREAM。每個全文索引為表中的一列或多列編制索引,並且每列可以使用特定的語言。

全文查詢通過基於特定語言(如英語或中文)的規則對單詞和短語進行操作,對全文索引中的文字資料執行語言搜尋。全文查詢可以包括簡單的字詞和短語,也可以包括字詞或短語的多種形式。全文查詢返回至少包含一個匹配項(也稱為匹配項)的任何檔案。當目標檔案包含全文查詢中指定的所有術語,並滿足任何其他搜尋條件(如匹配術語之間的距離)時,將發生匹配。

二、全文搜尋查詢

將列新增到全文索引後,使用者和應用程式可以對列中的文字執行全文查詢。這些查詢可以搜尋以下任何內容:

  • 一個或多個特定單詞或短語(簡單術語)。
  • 單詞或短語,其中單詞以指定文字(字首術語)開頭)。
  • 特定單詞的屈折形式(世代術語))。
  • 接近另一個單詞或短語的單詞或短語(鄰近術語))。
  • 特定單詞的同義詞形式(同義詞庫)。
  • 使用加權值的字詞或短語(加權術語)。

全文查詢不區分大小寫。例如,搜尋"Aluminum" 或 "aluminum"將返回相同的結果。

全文查詢使用一小組 Transact-SQL 謂詞 ( and ) 和函數 ( and ) 。但是,給定業務方案的搜尋目標會影響全文查詢的結構。例如:CONTAINS FREETEXT CONTAINSTABLE FREETEXTTABLE

(1)電子商務-在網站上搜尋產品:

SELECT product_id FROM products   
WHERE CONTAINS(product_description, '"Snap Happy 100EZ"' OR FORMSOF(THESAURUS,'"Snap Happy"') OR '100EZ')   
AND product_cost < 200 ;

(2)招聘方案 - 搜尋具有使用 SQL Server 經驗的求職者:

SELECT candidate_name,SSN FROM candidates   
WHERE CONTAINS(candidate_resume, '"SQL Server"') AND candidate_division = 'DBA';

三、將全文搜尋查詢與 LIKE 謂詞進行比較

與全文搜尋相比,LIKE Transact-SQL 謂詞僅適用於字元模式。此外,不能使用 LIKE 謂詞查詢格式化的二進位制資料。此外,針對大量非結構化文字資料的 LIKE 查詢比針對相同資料的等效全文查詢慢得多。針對數百萬行文字資料的 LIKE 查詢可能需要幾分鐘才能返回;而全文查詢對相同資料可能只需要幾秒鐘或更短的時間,具體取決於返回的行數。

四、全文搜尋體系結構

全文搜尋體系結構由以下過程組成:

  • SQL Server 程序 (sqlservr.exe)。
  • 篩選器守護程式主機程序 (fdhost.exe)。

出於安全原因,過濾器由稱為過濾器守護程式主機的單獨程序載入。fdhost.exe程序由 FDHOST 啟動器服務 (MSSQLFDLauncher) 建立,它們在 FDHOST 啟動器服務帳戶的安全憑據下執行。因此,FDHOST 啟動器服務必須執行才能使全文索引和全文查詢正常工作。

這兩個過程包含全文搜尋體系結構的元件。下圖總結了這些元件及其關係。這些元件在圖示後進行了描述。

4.1、SQL Server 程序

SQL Server 程序使用以下元件進行全文搜尋:

  • 使用者表。這些表包含要進行全文索引的資料。
  • 全文收集器。全文收集器使用全文爬網執行緒。它負責計劃和驅動全文索引的填充,還負責監視全文目錄。
  • 同義詞庫檔案。這些檔案包含搜尋詞的同義詞。有關詳細資訊,請參閱設定和管理全文搜尋的同義詞庫檔案。
  • 非索引字表物件。非索引字表物件包含對搜尋無用的常用詞的列表。有關詳細資訊,請參閱設定和管理全文搜尋的非索引字和非索引字表。
  • SQL Server 查詢處理器。查詢處理器編譯並執行 SQL 查詢。如果 SQL 查詢包含全文搜尋查詢,則在編譯和執行期間,該查詢將傳送到全文引擎。查詢結果與全文索引匹配。
  • 全文引擎。SQL Server 中的全文引擎與查詢處理器完全整合。全文引擎編譯並執行全文查詢。作為查詢執行的一部分,全文引擎可能會從同義詞庫和非索引字表接收輸入。
  • 索引編寫器(索引器)。索引編寫器生成用於儲存索引令牌的結構。
  • 篩選器守護程式管理器。篩選器守護程式管理器負責監視全文引擎篩選器守護程式主機的狀態。

4.2、過濾器守護程式主機程序

篩選器守護程式主機是由全文引擎啟動的程序。它執行以下全文搜尋元件,這些元件負責存取、篩選和分詞表資料,以及分詞和對查詢輸入進行詞幹提取。

篩選器守護程式主機的元件如下所示:

  • 協定處理程式。此元件從記憶體中提取資料以進行進一步處理,並從指定資料庫中的使用者表中存取資料。它的職責之一是從全文索引的列中收集資料,並將其傳遞給篩選器守護程式主機,該主機將根據需要應用篩選和分詞系統。
  • 過濾器。某些資料型別需要篩選,然後才能對檔案中的資料進行全文索引,包括變數、變數二元(最大值)、影象或 xml 列中的資料。用於給定檔案的篩選器取決於其檔案型別。例如,不同的篩選器用於 Microsoft Word (.doc) 檔案、Microsoft Excel (.xls) 檔案和 XML (.xml) 檔案。然後,篩選器從檔案中提取文字塊,刪除嵌入的格式並保留文字,並可能保留有關文字位置的資訊。結果是文字資訊流。有關詳細資訊,請參閱設定和管理搜尋篩選器。
  • 分詞系統和詞幹分析器。分詞系統是特定於語言的元件,它根據給定語言的詞法規則(斷詞)查詢單詞邊界。每個分詞系統都與特定於語言的詞幹分析器元件相關聯,該元件共軛動詞並執行屈折擴充套件。在編制索引時,篩選器守護程式宿主使用分詞系統和詞幹分析器對給定表列中的文字資料執行語言分析。與全文索引中的表列關聯的語言確定用於為列編制索引的分詞系統和詞幹分析器。

五、全文搜尋處理

全文搜尋由全文引擎提供支援。全文引擎有兩個角色:索引支援和查詢支援。

5.1、全文索引過程

啟動全文填充(也稱為爬網)時,全文引擎會將大量資料推播到記憶體中,並通知篩選器守護程式主機。主機過濾和單詞分解資料,並將轉換後的資料轉換為倒置單詞列表。然後,全文搜尋從單詞列表中提取轉換後的資料,處理資料以刪除非索引字,並將批次處理的單詞列表儲存到一個或多個倒排索引中。

對儲存在 varbinary(max) 或影象列中的資料編制索引時,實現 IFilter 介面的篩選器會根據該資料的指定檔案格式(例如 Microsoft Word)提取文字。在某些情況下,過濾器元件需要將變數(max)或影象資料寫出到filterdata資料夾,而不是推播到記憶體中。

作為處理的一部分,收集的文字資料通過分詞系統傳遞,以將文字分隔為單獨的標記或關鍵字。用於標記化的語言在列級別指定,也可以通過過濾器元件在 varbinary(max)、影象或 xml 資料中標識。

可以執行其他處理以刪除非索引字,並在標記儲存在全文索引或索引片段中之前對其進行規範化。

填充完成後,將觸發最終合併過程,將索引片段合併到一個主全文索引中。這提高了查詢效能,因為只需要查詢主索引而不是多個索引片段,並且可以使用更好的評分統計資訊進行相關性排名。

5.2、全文查詢流程

查詢處理器將查詢的全文部分傳遞給全文引擎進行處理。全文引擎執行斷詞和(可選)同義詞庫擴充套件、詞幹提取和非索引字(干擾詞)處理。然後,查詢的全文部分以 SQL 運運算元的形式表示,主要表示為流式表值函數 (STVF)。在查詢執行期間,這些 STVF 存取倒排索引以檢索正確的結果。此時,結果要麼返回到使用者端,要麼在返回到使用者端之前進一步處理。

六、全文索引體系結構

全文引擎使用全文索引中的資訊來編譯全文查詢,這些查詢可以快速在表中搜尋特定單詞或單詞組合。全文索引儲存有關重要單詞及其在資料庫表的一列或多列中的位置的資訊。全文索引是一種特殊型別的基於令牌的功能索引,由 SQL Server 全文引擎生成和維護。構建全文索引的過程不同於構建其他型別的索引。全文引擎不是基於儲存在特定行中的值構造 B 樹結構,而是基於要編制索引的文字中的單個標記構建倒置、堆疊、壓縮的索引結構。全文索引的大小僅受執行 SQL Server 範例的計算機的可用記憶體資源的限制。

從 SQL Server 2008 (10.0.x) 開始,全文索引與資料庫引擎整合,而不是像以前版本的 SQL Server 那樣駐留在檔案系統中。對於新資料庫,全文目錄現在是不屬於任何檔案組的虛擬物件;它只是一個邏輯概念,指的是一組全文索引。

每個表只允許有一個全文索引。若要在表上建立全文索引,該表必須具有單個唯一的非空列。可以在 char、varchar、nchar、nvarchar、nvarchar、text、ntext、image、xml、varbinary 和 varbinary(max) 型別的列上構建全文索引,以便為全文搜尋編制索引。 在資料型別為變數、變數二進位制(max)、影象或 xml 的列上建立全文索引需要指定型別列。型別列是表格列,您可以在其中將檔案的副檔名(.doc、.pdf、.xls等)儲存在每行中。

6.1、全文索引結構

充分了解全文索引的結構將有助於您瞭解全文引擎的工作原理。例如:

標識標題
1曲柄臂和輪胎保養
2前反射器支架和反射器元件 3
3前反射器支架安裝

下表顯示了片段 1,描述了在“檔案”表的“標題”列上建立的全文索引的內容。全文索引包含的資訊比此表中顯示的資訊要多。該表是全文索引的邏輯表示形式,僅用於演示目的。這些行以壓縮格式儲存,以優化磁碟使用情況。

請注意,資料已從原始檔案反轉。發生反轉是因為關鍵字對映到檔案 ID。因此,全文索引通常稱為倒排索引。

另請注意,關鍵字“and”已從全文索引中刪除。這樣做是因為“and”是非索引字,從全文索引中刪除非索引字可以節省大量磁碟空間,從而提高查詢效能。

片段一:

“關鍵字”列包含在編制索引時提取的單個標記的表示形式。分詞系統確定令牌的組成。

6.2、全文索引片段

邏輯全文索引通常拆分為多個內部表。每個內部表稱為全文索引片段。其中一些片段可能包含比其他片段更新的資料。例如,如果使用者更新 標識為 3 的以下行,並且表是自動更改跟蹤的,則會建立一個新片段。

檔案標識標題
3後反射器

一下的片段 2,與片段 3 相比,片段包含有關 標識 1 的更新資料。因此,當用戶查詢“後反射器”時,片段 2 中的資料將用於 標識3。每個片段都標有建立時間戳,可以使用sys.fulltext_index_fragments目錄檢視查詢該時間戳。

片段 2:

關鍵詞結腸標識交流
131
反射鏡132

從片段 2 可以看出,全文查詢需要在內部查詢每個片段並丟棄較舊的條目。因此,全文索引中的全文索引片段過多可能會導致查詢效能大幅下降。若要減少片段數,請使用“更改全文目錄 Transact-SQL”語句的“重新組織”選項重新組織全文目錄。此語句執行主合併,這會將片段合併為一個較大的片段,並從全文索引中刪除所有過時的條目。

重新組織後,範例索引將包含以下行:

6.3、全文索引和常規 SQL Server 索引之間的差異

全文索引常規 SQL Server 索引
每個表只允許有一個全文索引。每個表允許多個常規索引。
可以通過計劃或特定請求向全文索引新增資料(稱為填充),也可以通過新增新資料自動進行。在插入、更新或刪除它們所基於的資料時自動更新。
在同一資料庫中分組到一個或多個全文目錄中。未分組。

總結

SQL Server的全文引擎駐留在 SQL Server 程序中,而不是駐留在單獨的服務中。將全文引擎整合到資料庫引擎中提高了全文可管理性、混合查詢的優化和整體效能。

全文搜尋支援近 50 種不同的語言,例如英語、西班牙語、中文、日語、阿拉伯語、孟加拉語和印地語。

到此這篇關於SQL Server實現全文搜尋查詢詳解的文章就介紹到這了,更多相關SQL Server全文搜尋內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com