SQL Server 全文索引的硬傷

2022-07-03 23:12:18 字數 2804 閱讀 6192

想象這樣乙個場景:在database_name.dbo.table_name中有乙個名為title(標題)和contents(內容)的字段,現在需要查詢在title或者contents中包括「qq」字元的所有記錄。

面對這樣的乙個場景,我們通常都會寫這樣乙個指令碼:select * from database_name.dbo.table_name where title like '%qq%' or contents like '%qq%'; 沒錯,這也是我第乙個想到的方法。

但是我們需要思考的是:隨著時間的推移,資料會越來越大,那個時候我們該如何提高我們的效能?客戶隨時都有可能要求加入對remark(備註)欄位的查詢,難道我們就應該不厭其煩地修改程式**?

現在回到我們上面提出的疑問上,大概這個時候大家都應該想到了資料庫的全文索引了。全文索引是一種特殊型別的基於標記的功能性索引,由 microsoft sql server 全文引擎 (msftesql) 服務建立和維護。建立全文索引的過程與建立其他型別的索引的過程差別很大。msftesql 不是基於某一特定行中儲存的值來構造 b 樹結構,而是基於要索引的文字中的各個標記來建立倒排、堆積且壓縮的索引結構。摘自msdn

講了那麼久,硬傷在**呢?可能大家都懷疑我是不是標題黨了,呵呵,馬上就講到,那就是這個全文索引能解決我們一開始提到的場景嗎?回答是否定。為什麼呢?因為sql server對字串「tqq.tencent.com」進行分詞和倒排索引後,我們是無法通過查詢條件『「*qq*」』來返回上面那條字串的記錄的,這樣的查詢條件只能查詢到類似「qqt.tencent.com」、「www.qq.com」這樣的字串。sql server的分詞應該是正向最大值的分詞方法,它沒有把字串進行反方向再進行一次分詞和索引,所以只能查詢到詞或短語的字首符合的記錄。這一點有可能會被大家所忽略掉。

就針對上面的說法,我們來進行測試一下:

--已經對錶test_fulltext_index的uri,uri_path建立了全文索引.--下面的查詢是為了說明contains與like的區別.selectid,uri,uri_path  fromtest_fulltext_index whereuri like'%qq%'andid notin(selectid fromtest_fulltext_index wherecontains(uri,'"qq*"'))

--下圖為執行結果

如何大家有什麼好的解決方案可以解決這樣的like查詢的話,可以拿出來大家**一下。

主題的內容講完了,下面附帶講一些建立全文索引的步驟和注意事項,懂的童鞋(同學)可以跳過。 

設定全文索引的步驟

1:對著資料庫點選右鍵-選擇屬性-選擇檔案,選中「使用全文索引」

2:對著表點選右鍵-全文索引-定義全文索引

4:選擇表列,選擇斷字元語言。

7:之後就可以設定自動填充、手動跟蹤更改,還有設定計畫了。

全文索引需要注意:

表中必須有乙個唯一性索引,當並不需要是主鍵。

乙個表中只能有乙個全文索引。

你需要告訴你的指令碼你想使用全文索引,如何告訴呢?那就是使用關鍵字:contains、fulltext、containstable、freetexttable。例如:select * from table_name where contains(fulltext_column,'"search contents*"');需要記住contains等在不同場景、需求下的用法。

如果定義了變數作為傳入值,那麼就要注意是否需要在set字元的時候的前面加入n標識。

要對錶設定全文索引,那就得先對資料庫設定了全文索引,這樣點選表右鍵的時候,「全文索引」選項才能用。

指令碼在查詢的時候是不區分大小寫的。解決辦法:select * from table_name where column_name='a' collate chinese_prc_cs_ai;或者select * from table_name where ascii(column_name) = ascii('a');

microsoft sql server 全文引擎 (msftesql) 不是基於某一特定行中儲存的值來構造 b 樹結構,而是基於要索引的文字中的各個標記來建立倒排、堆積且壓縮的索引結構。

全文索引並不一定能達到like這個謂詞的效果,如like '%qq%'。這正是本篇文章想要說明的。

關於搜尋結果的排序問題,全文索引並沒有這個功能,也就是匹配度排序或者說是相似度排序。

lucene中有乙個similarity類,lucene practical scoring function就包含了得分的計算公式,tf、idf。 

contains的幾種用法

contains 謂詞可以搜尋:

參考文獻

全文索引 

使用sql server 2000的全文檢索功能

contains (transact-sql)

freetext (transact-sql) 

sql 中contains的使用例子,引數詳解

contains全文索引與like模糊查詢的比較(雖然裡面用%來匹配是錯誤的)

SQL Server 全文索引

一 建立全文索引 1 使用ssms 2 使用t sql create fulltext index on production.productdescription description key index pk productdescription productdescriptionid on...

SQL Server 全文索引

一 建立全文索引 1 使用ssms 2 使用t sql create fulltext index on production.productdescription description key index pk productdescription productdescriptionid on...

SQL Server 全文索引

一 建立全文索引 1 使用ssms 2 使用t sql create fulltext index on production.productdescription description key index pk productdescription productdescriptionid on...