SQL Server 全文搜索/全文索引

来源:https://www.cnblogs.com/seriawei/archive/2020/07/13/sql-fulltext-search.html
-Advertisement-
Play Games

全文引擎使用全文索引中的信息來編譯可快速搜索表中的特定詞或片語的全文查詢。全文索引將有關重要的詞及其位置的信息存儲在資料庫表的一列或多列中。全文索引是一種特殊類型的基於標記的功能性索引,它是由 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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 理解XAML XAML(extensible application markup language)發音為“zammel”,是用於實例化.net對象的標記語言。 XAML扮演的角色 對於WPF應用XAML不是必須的,編程人員可以在後端直接編寫代碼構建界面 基於XAML可以單獨實現在前臺編寫UI的功 ...
  • 之前實現了NetCore實現自定義IOC容器註入,在Controller使用事物的過程中思考是否能夠像Spring一樣通過自定義註解實現事物管理,思路圖如下 事物的動作拆分只需要根據當前執行線程劃分Connection對象並開啟事物即可,重點是在Emit代碼織入過程中對異常捕捉的處理 處理過程中主要 ...
  • 在 Linux 中,有非常多的命令可以讓我們用來執行各種各樣的任務。當我們想要像使用文件瀏覽器一樣列出一個目錄下的內容時,大家第一時間想到的是 ls 命令。但只有 ls 命令能實現這個目的嗎?顯然不是。 下麵,良許就給大家介紹Linux下列出目錄內容的一些命令,一起來看看吧。 ls Linux 中最 ...
  • 一 Nginx靜態資源概述 1.1 靜態資源類型 Nginx作為靜態資源Web伺服器部署配置, 傳輸非常高效, 常常用於靜態資源處理,請求以及動靜分離。通常非伺服器動態運行生成的文件屬於靜態資源。 類型 種類 瀏覽器端渲染 HTML、CSS、JS 圖片 JPEG、GIF、PNG 視頻 FLV、MP4 ...
  • 報這個錯,我們可以去查看錯誤日誌,進入如下目錄 錯誤信息如下: 解決辦法,在/data/下創建 wwwlogs目錄,重啟nginx即可 systemctl restart nginx 成功啟動!!! ...
  • 容器是一種清理級、可移植、自包含的軟體打包技術,使應用程式可以在幾乎任何地方以相同的方式運行。 ...
  • #一、實驗目標 理解數據挖掘的基本概念,掌握基於Weka工具的基本數據挖掘(分類、回歸、聚類、關聯規則分析)過程。 #二、實驗內容 下載並安裝Java環境(JDK 7.0 64位)。 下載並安裝Weka 3.7版。 基於Weka的數據分類。 基於Weka的數據回歸。 基於Weka的數據聚類。 基於W ...
  • kafka在windows下的安裝與配置 By: 授客 QQ:1033553122 1.測試環境...................................................................................................... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...