欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SQL?Server實現全文搜索查詢詳解

 更新時間:2023年04月03日 11:31:35   作者:Lion?Long  
這篇文章介紹了SQL?Server的全文搜索功能,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、概述

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

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

二、全文搜索查詢

將列添加到全文索引后,用戶和應用程序可以對列中的文本運行全文查詢。這些查詢可以搜索以下任何內容:

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

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

全文查詢使用一小組 Transact-SQL 謂詞 ( and ) 和函數 ( and ) 。但是,給定業(yè)務方案的搜索目標會影響全文查詢的結構。例如: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) 創(chuàng)建,它們在 FDHOST 啟動器服務帳戶的安全憑據下運行。因此,FDHOST 啟動器服務必須運行才能使全文索引和全文查詢正常工作。

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

4.1、SQL Server 進程

SQL Server 進程使用以下組件進行全文搜索:

  • 用戶表。這些表包含要進行全文索引的數據。
  • 全文收集器。全文收集器使用全文爬網線程。它負責計劃和驅動全文索引的填充,還負責監(jiān)視全文目錄。
  • 同義詞庫文件。這些文件包含搜索詞的同義詞。有關詳細信息,請參閱配置和管理全文搜索的同義詞庫文件。
  • 非索引字表對象。非索引字表對象包含對搜索無用的常用詞的列表。有關詳細信息,請參閱配置和管理全文搜索的非索引字和非索引字表。
  • SQL Server 查詢處理器。查詢處理器編譯并執(zhí)行 SQL 查詢。如果 SQL 查詢包含全文搜索查詢,則在編譯和執(zhí)行期間,該查詢將發(fā)送到全文引擎。查詢結果與全文索引匹配。
  • 全文引擎。SQL Server 中的全文引擎與查詢處理器完全集成。全文引擎編譯并執(zhí)行全文查詢。作為查詢執(zhí)行的一部分,全文引擎可能會從同義詞庫和非索引字表接收輸入。
  • 索引編寫器(索引器)。索引編寫器生成用于存儲索引令牌的結構。
  • 篩選器守護程序管理器。篩選器守護程序管理器負責監(jiān)視全文引擎篩選器守護程序主機的狀態(tài)。

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

篩選器守護程序主機是由全文引擎啟動的進程。它運行以下全文搜索組件,這些組件負責訪問、篩選和分詞表數據,以及分詞和對查詢輸入進行詞干提取。

篩選器守護程序主機的組件如下所示:

  • 協(xié)議處理程序。此組件從內存中提取數據以進行進一步處理,并從指定數據庫中的用戶表中訪問數據。它的職責之一是從全文索引的列中收集數據,并將其傳遞給篩選器守護程序主機,該主機將根據需要應用篩選和分詞系統(tǒng)。
  • 過濾器。某些數據類型需要篩選,然后才能對文檔中的數據進行全文索引,包括變量、變量二元(最大值)、圖像或 xml 列中的數據。用于給定文檔的篩選器取決于其文檔類型。例如,不同的篩選器用于 Microsoft Word (.doc) 文檔、Microsoft Excel (.xls) 文檔和 XML (.xml) 文檔。然后,篩選器從文檔中提取文本塊,刪除嵌入的格式并保留文本,并可能保留有關文本位置的信息。結果是文本信息流。有關詳細信息,請參閱配置和管理搜索篩選器。
  • 分詞系統(tǒng)和詞干分析器。分詞系統(tǒng)是特定于語言的組件,它根據給定語言的詞法規(guī)則(斷詞)查找單詞邊界。每個分詞系統(tǒng)都與特定于語言的詞干分析器組件相關聯,該組件共軛動詞并執(zhí)行屈折擴展。在編制索引時,篩選器守護程序宿主使用分詞系統(tǒng)和詞干分析器對給定表列中的文本數據執(zhí)行語言分析。與全文索引中的表列關聯的語言確定用于為列編制索引的分詞系統(tǒng)和詞干分析器。

五、全文搜索處理

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

5.1、全文索引過程

啟動全文填充(也稱為爬網)時,全文引擎會將大量數據推送到內存中,并通知篩選器守護程序主機。主機過濾和單詞分解數據,并將轉換后的數據轉換為倒置單詞列表。然后,全文搜索從單詞列表中提取轉換后的數據,處理數據以刪除非索引字,并將批處理的單詞列表保存到一個或多個倒排索引中。

對存儲在 varbinary(max) 或圖像列中的數據編制索引時,實現 IFilter 接口的篩選器會根據該數據的指定文件格式(例如 Microsoft Word)提取文本。在某些情況下,過濾器組件需要將變量(max)或圖像數據寫出到filterdata文件夾,而不是推送到內存中。

作為處理的一部分,收集的文本數據通過分詞系統(tǒng)傳遞,以將文本分隔為單獨的標記或關鍵字。用于標記化的語言在列級別指定,也可以通過過濾器組件在 varbinary(max)、圖像或 xml 數據中標識。

可以執(zhí)行其他處理以刪除非索引字,并在標記存儲在全文索引或索引片段中之前對其進行規(guī)范化。

填充完成后,將觸發(fā)最終合并過程,將索引片段合并到一個主全文索引中。這提高了查詢性能,因為只需要查詢主索引而不是多個索引片段,并且可以使用更好的評分統(tǒng)計信息進行相關性排名。

5.2、全文查詢流程

查詢處理器將查詢的全文部分傳遞給全文引擎進行處理。全文引擎執(zhí)行斷詞和(可選)同義詞庫擴展、詞干提取和非索引字(干擾詞)處理。然后,查詢的全文部分以 SQL 運算符的形式表示,主要表示為流式表值函數 (STVF)。在查詢執(zhí)行期間,這些 STVF 訪問倒排索引以檢索正確的結果。此時,結果要么返回到客戶端,要么在返回到客戶端之前進一步處理。

六、全文索引體系結構

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

從 SQL Server 2008 (10.0.x) 開始,全文索引與數據庫引擎集成,而不是像以前版本的 SQL Server 那樣駐留在文件系統(tǒng)中。對于新數據庫,全文目錄現在是不屬于任何文件組的虛擬對象;它只是一個邏輯概念,指的是一組全文索引。

每個表只允許有一個全文索引。若要在表上創(chuàng)建全文索引,該表必須具有單個唯一的非空列??梢栽?char、varchar、nchar、nvarchar、nvarchar、text、ntext、image、xml、varbinary 和 varbinary(max) 類型的列上構建全文索引,以便為全文搜索編制索引。 在數據類型為變量、變量二進制(max)、圖像或 xml 的列上創(chuàng)建全文索引需要指定類型列。類型列是表格列,您可以在其中將文檔的文件擴展名(.doc、.pdf、.xls等)存儲在每行中。

6.1、全文索引結構

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

標識標題
1曲柄臂和輪胎保養(yǎng)
2前反射器支架和反射器組件 3
3前反射器支架安裝

下表顯示了片段 1,描述了在“文檔”表的“標題”列上創(chuàng)建的全文索引的內容。全文索引包含的信息比此表中顯示的信息要多。該表是全文索引的邏輯表示形式,僅用于演示目的。這些行以壓縮格式存儲,以優(yōu)化磁盤使用情況。

請注意,數據已從原始文檔反轉。發(fā)生反轉是因為關鍵字映射到文檔 ID。因此,全文索引通常稱為倒排索引。

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

片段一:

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

6.2、全文索引片段

邏輯全文索引通常拆分為多個內部表。每個內部表稱為全文索引片段。其中一些片段可能包含比其他片段更新的數據。例如,如果用戶更新 標識為 3 的以下行,并且表是自動更改跟蹤的,則會創(chuàng)建一個新片段。

文檔標識標題
3后反射器

一下的片段 2,與片段 3 相比,片段包含有關 標識 1 的更新數據。因此,當用戶查詢“后反射器”時,片段 2 中的數據將用于 標識3。每個片段都標有創(chuàng)建時間戳,可以使用sys.fulltext_index_fragments目錄視圖查詢該時間戳。

片段 2:

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

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

重新組織后,示例索引將包含以下行:

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

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

總結

SQL Server的全文引擎駐留在 SQL Server 進程中,而不是駐留在單獨的服務中。將全文引擎集成到數據庫引擎中提高了全文可管理性、混合查詢的優(yōu)化和整體性能。

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

到此這篇關于SQL Server實現全文搜索查詢詳解的文章就介紹到這了,更多相關SQL Server全文搜索內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論