想象這樣乙個場景:在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...