SQL 全文檢索 搜尋準確度問題

目前工作上遇到使用全文搜尋後無法按照想要的結果出現

比如我對一個col使用contains( col , '"'一'"');

可能col內有很多有 一個 一切 一天 之類的文字

但是由於全文檢索的切割因此無法呈現,那怕是加上**也一樣

原因在於 全文檢索會先把你的字串切成某些字串組,因此搜尋速度加快,但是也導致搜尋無法像like一樣

如我用 select * from table where col like '%一%' 則可以找到一切、一個之類的文字串

而我想搜尋看看字串到底是如何切割的 因此使用

SELECT *

FROM sys.dm_fts_index_keywords

(DB_ID('DB_NAME'),OBJECT_ID('TABLE_NAME')

大致上出現這些選項,那可以得知 "一" 通常會被組成其他字串列。
因此單獨就一來搜尋是無法找到東西的

接著我就想說是否可以自訂搜尋的切割條件,參考這篇
上面介紹到可以透過修改tscht.xml來達到改變字串切割的方法
檔案預設位置通常在
C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2K8R2\MSSQL\FTData

打開後會看到這樣的XML檔案,紅框處是我修改的部分,我原本改<sub>一</sub>
重新搜尋之後還是找不到一,判斷可能是無法增加模糊。

不知道為何無法加入任何關鍵字,按照參考照做依舊無法找到園三結。

接著推測可能 第一個 會變切成 第一 和 個

因此可依照表中的 第一 找到關於第一的相關組成

可能之後用到這篇再來處理吧,現在感覺是還堪用,並且由於切成單字的不多,因此限定至少兩個字的搜尋(依靠全文檢索自動切?)

或者我想要使用

SELECT *

FROM sys.dm_fts_index_keywords

(DB_ID('DB_NAME'),OBJECT_ID('TABLE_NAME')

找出陣列之後一個一個去比對? 但是感覺效能會很差 可能再評估一下


參考

http://blog.sqlgrease.com/find-busiest-database-sys-dm_exec_query_stats/#:~:text=Adhoc%20SQL%20has%20its%20dbid%20set%20to%20NULL,As%20a%20result%20a%20dbid%20can%E2%80%99t%20be%20determined.

https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-fts-index-keywords-by-document-transact-sql?redirectedfrom=MSDN&view=sql-server-ver16

https://dotblogs.azurewebsites.net/ricochen/2014/05/10/145037

https://learn.microsoft.com/zh-tw/troubleshoot/sql/admin/improve-performance-full-text-queries

https://learn.microsoft.com/zh-tw/sql/relational-databases/search/improve-the-performance-of-full-text-indexes?view=sql-server-ver16

留言

這個網誌中的熱門文章

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

MongoDB 入門

javascript 更改屬性及創建標籤