(4.15)全文索引的使用
阿新 • • 發佈:2018-08-30
soft 想要 所有 sso ble www. eas mil 區分大小寫
如果不存在帶有Full-text字樣的服務的,確認是否安裝了sqlserverFullTextSearch
建立好全文索引後就可以使用SQL語句來查詢了,主要用帶三個關鍵字 CONTAINS、FREETEXT、CONTAINSTABLE和FREETEXTTABLE
詳細查看:http://msdn.microsoft.com/zh-cn/library/ms187787.aspx
全文索引的概念:搜索引擎如何工作?
總結就是一句話:直接看倒排索引圖。
總結:
詞組包含所有存在行的唯一標識。
信息檢索已經發展的非常成熟了,應該所有人都不陌生。我有幸這幾年接觸過並且實際做過一些搜索引擎開發的工作,特此總結並分享給大家。實際上,一個成熟的搜索引擎是想當復雜的,比如百度的,就分nginx,vui,us,as,bs,da.....等等這些模塊,當然這些簡寫的字母大家也不必了解,只要知道它確實復雜就可以。
今天我所講的是一個簡化版的搜索引擎,簡化到只涉及到倒排建立和拉取。雖然簡單,但是它是整個搜索引擎的最核心組件。一個最簡單的搜索引擎如下圖所示:
- merger: 接收查詢請求,分詞後請求下遊Indexer分別獲取各個indexer的局部TopK文檔,歸攏後排序返回全局相似度最高的TopK文檔。
- indexer:負責倒排拉取,並利用夾角余弦算法計算相似度,返回TopK結果。夾角余弦可以在 http://www.cnblogs.com/haolujun/p/8011776.html 中了解。
- index:倒排索引。
一、檢查服務裏面帶有Full-text字樣的服務是否存在並開啟
如果不存在帶有Full-text字樣的服務的,確認是否安裝了sqlserverFullTextSearch
--檢查數據庫PS2是否支持全文索引,如果不支持
--則使用sp_fulltext_database 打開該功能
if(select databaseproperty(‘PS2‘,‘isfulltextenabled‘))=0 execute sp_fulltext_database ‘enable‘
二、新建全文目錄
全文目錄是用來存儲全文索引的三、為表定義全文索引
四、點擊下一步,按提示選擇
1.確認下一步
2.選擇唯一索引,通常是主鍵
3.選擇要建立的全文索引列,對於斷字符的選擇如果列存的是中文就選擇chinese,如果是英文就選擇English
4.選擇索引更新方式,可以先自動更新,以後數據量大了可以設置添加全文索引的計劃
5.選擇全文目錄
五、全文索引的SQL查詢關鍵字
1. CONTAINS
搜索單個詞和短語的精確或模糊的匹配項,要搜索的內容必須是個有意義的詞語,比如說“蘋果”、“建設廳”,不能是一些沒意義的詞語,比如“阿迪撒啊是”,“兒兒的”這樣的詞語即使 LIKE是能查詢出來,但全文索引對這樣沒意義的詞語可能沒有建立索引,查不出來- SELECT *
- FROM dbo.Business
- WHERE CONTAINS(Address,‘旅遊‘)
詳細查看:http://msdn.microsoft.com/zh-cn/library/ms187787.aspx
2. FREETEXT
和CONTAINS類似,不同的是它會先把要查詢的詞語先進性分詞然後在查詢匹配項- 01.select *
- 02.from dbo.Business
- 03.where freetext(Address,‘帶嬰兒旅遊‘)
3.CONTAINSTABLE
在查詢方式上與 CONTAINS 幾乎一樣。但CONTAINSTABLE 返回的是符合查詢條件的表,在 SQL 語句中我們可以把它當作一個普通的表來使用,並且使用 CONTAINSTABLE 的查詢對每一行返回一個相關性排名值 (RANK) 和全文鍵 (KEY)。- SELECT *
- FROM Business AS FT_TBL
- INNER JOIN CONTAINSTABLE(Business, *, ‘ISABOUT (嬰兒 WEIGHT (.8),赤水 WEIGHT (.4) )‘)
- AS KEY_TBL ON FT_TBL.BusinessId = KEY_TBL.[KEY]
- ORDER BY KEY_TBL.RANK DESC
4. FREETEXTTABLE
在查詢方式上與 FREETEXT 幾乎一樣。但 FREETEXTTABLE 返回的是符合查詢條件的表,在 SQL 語句中我們可以把它當作一個普通的表來使用,並且使用 FREETEXT 的查詢對每一行返回一個相關性排名值 (RANK) 和全文鍵 (KEY)。- SELECT * ,
- BusinessID ,
- Address
- FROM Business AS FT_TBL
- INNER JOIN FREETEXTTABLE(Business, Address, ‘ISABOUT (帶嬰兒旅遊 WEIGHT (.8),赤水 WEIGHT (.4) )‘)
- AS KEY_TBL ON FT_TBL.BusinessId = KEY_TBL.[KEY]
- ORDER BY KEY_TBL.RANK DESC
--activate,是激活表的全文檢索能力,也就是在全文目錄中註冊該表
execute sp_fulltext_table ‘ProSearch‘,‘activate‘
--填充全文索引目錄
execute sp_fulltext_catalog ‘ProSearchCatalog‘,‘start_full‘
--查詢全文索引是否建立完畢(0:完畢;1:正在建立)
select fulltextcatalogproperty(‘ProSearchCatalog‘,‘populateStatus‘)
三、介紹一下全文索引的一些相關操作
查看全文檢索的配置情況:
sp_help_fulltext_catalogs -- 檢查數據庫有哪些全文目錄 sp_help_fulltext_tables ProSearchCatalog -- 查看哪些表把全文索引建立在T_testData下 sp_help_fulltext_columns ProSearch -- 查看test表哪些字段配置了全文索引
drop fulltext index on test -- 撤銷test上的全文檢索 drop fulltext catalog FT_testData -- 撤銷全文目錄FT_testData詳細介紹請查看全文:https://cnblogs.com/qianzf/ 原文博客的鏈接地址:https://cnblogs.com/qzf/
全文索引需要註意:
- 表中必須有一個唯一性索引,當並不需要是主鍵。
- 一個表中只能有一個全文索引。
- 你需要告訴你的腳本你想使用全文索引,如何告訴呢?那就是使用關鍵字: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%‘。這正是本篇文章想要說明的。
- 如果數據庫是在移動盤符上,好像就無法設置:數據庫-屬性-文件-“使用全文索引”了,這個時候chckbox是不可用的。(這個大家可以求證一下)
- 關於搜索結果的排序問題,全文索引並沒有這個功能,也就是匹配度排序或者說是相似度排序。
- Lucene中有一個Similarity類,Lucene Practical Scoring Function就包含了得分的計算公式,tf、idf。
(4.15)全文索引的使用