SQL 建立全文檢索 優化全文檢索 fullText index

工作上需要做到全文檢索

當初想說用LIKE 就可以處理,當然,在做小型的搜尋(這邊講的小型並非是數量少,而是欄位大小小)的時候,發現用LIKE沒有太大的問題

但是當我在做一個內文檢索的時候(大小可能為NVARCHAR(2000))時間就被拉到快六秒

以上的搜尋都是從40萬筆資料內搜尋



搜尋內文中有 媽 這個字的搜尋

可以很明顯地看到,速度為 "6.983" 以及 "1.080"

大致上速度是維持這種比例,可能上下浮動10%左右的時間


而假如搜尋的是Title nvarchar(50)的話就不會差距很大,大約差一倍的時間而已(應該也算蠻大的吼)
時間約為2.4秒及1.2秒

因此採用全文檢索優化
而全文檢索有幾個問題需要克服

首先需要索引

這貌似是只要建立primary key就會生成 unique key索引

接著就可以建立全文索引目錄
並且有個問題,由於一個Table只能建立一個全文檢索,因此一次要建立兩個就有點麻煩。

因此這時候就會用到View
建立一個View後發現不能建立index

下列內容有說 好像是因為view的來源Table沒有建立index
不過我自己查看是有primary key 的 index 所以我也不懂什麼意思
推測可能是因為不是使用基底資料庫
參考:https://m.blueshop.com.tw/Thread.aspx?tbfumsubcde=BRD20041020105213V68

接著發現不能建立之後查找一下是因為 WITH SCHEMABINDING 基底資料庫
這條會讓你可以建立叢集式Index 就可以用於全文檢索了
並且這條建議是用在變動資料結構頻率少的資料庫
因為一但變動資料表 就會喪失索引
並且不能用Query下修改
但是貌似可以用SSMS直接修改 不太確定 但是還是會掉索引


--Info Brief
CREATE VIEW dbo.ViewInfo
WITH SCHEMABINDING
AS  
SELECT ID AS ID , Type AS Type ,Title AS Title , Brief AS Brief
FROM dbo.TestInfo
GO
--Create an index on the view.
CREATE UNIQUE CLUSTERED INDEX IDX_ViewInfo
ON  dbo.ViewInfo(ID);

GO

這邊有一個需要注意的點是在於
CREATE VIEW 這個關鍵字只能當code的第一段開始
而當GO關鍵字使用之後 就算是新的一個Query
因此 假如上述有任何東西 要以下列方式進行

..... content

GO 

--Info Brief
CREATE VIEW dbo.ViewInfo
WITH SCHEMABINDING
AS  
SELECT ID AS ID , Type AS Type ,Title AS Title , Brief AS Brief
FROM dbo.TestInfo
GO
--Create an index on the view.
CREATE UNIQUE CLUSTERED INDEX IDX_ViewInfo
ON  dbo.ViewInfo(ID);

GO

並且View中不能有SubQuery 也就是 SELECT * FROM (SELECT * FROM Table) 不能使用

接著在這篇文章中有詳細解釋關於View 相關事情

既然已經建立好View 跟 全文檢索了 那就可以搜尋了

SET @str = '"*' + @getstr +'*"'

SELECT *
FROM [dbo].[View]
WHERE CONTAINS(Title , @str)

參考
https://learn.microsoft.com/zh-tw/sql/t-sql/statements/create-fulltext-index-transact-sql?redirectedfrom=MSDN&view=sql-server-ver16
http://vito-note.blogspot.com/2013/06/blog-post_801.html
https://m.blueshop.com.tw/Thread.aspx?tbfumsubcde=BRD20041020105213V68
https://social.msdn.microsoft.com/Forums/silverlight/zh-TW/a26ed655-0386-4f3f-a8e8-10cd0e99d682/3553121839-view-2291420309243143203424341?forum=240
http://vito-note.blogspot.com/2013/05/views.html
https://www.fooish.com/sql/view.html
https://dotblogs.com.tw/rockchang/2016/04/26/100926
https://dotblogs.com.tw/ricochen/2009/10/04/10907

留言

這個網誌中的熱門文章

無法載入檔案或組件 'System.IO.Compression' 或其相依性的其中之一。

MongoDB 入門

javascript 更改屬性及創建標籤