溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SQL?Server如何實現全文搜索查詢

發布時間:2023-04-03 14:23:17 來源:億速云 閱讀:174 作者:iii 欄目:開發技術

本篇內容介紹了“SQL Server如何實現全文搜索查詢”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    一、概述

    全文索引在表中包括一個或多個基于字符的列。這些列可以具有以下任何數據類型: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 啟動器服務必須運行才能使全文索引和全文查詢正常工作。

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

    SQL?Server如何實現全文搜索查詢

    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”是非索引字,從全文索引中刪除非索引字可以節省大量磁盤空間,從而提高查詢性能。

    片段一:

    SQL?Server如何實現全文搜索查詢

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

    6.2、全文索引片段

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

    文檔標識標題
    3后反射器

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

    片段 2:

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

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

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

    SQL?Server如何實現全文搜索查詢

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

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

    “SQL Server如何實現全文搜索查詢”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女