1. 程式人生 > >(4.15)全文索引的使用

(4.15)全文索引的使用

soft 想要 所有 sso ble www. eas mil 區分大小寫

全文索引的概念:搜索引擎如何工作?

總結就是一句話:直接看倒排索引圖。

總結:

  詞組包含所有存在行的唯一標識。

信息檢索已經發展的非常成熟了,應該所有人都不陌生。我有幸這幾年接觸過並且實際做過一些搜索引擎開發的工作,特此總結並分享給大家。實際上,一個成熟的搜索引擎是想當復雜的,比如百度的,就分nginx,vui,us,as,bs,da.....等等這些模塊,當然這些簡寫的字母大家也不必了解,只要知道它確實復雜就可以。

今天我所講的是一個簡化版的搜索引擎,簡化到只涉及到倒排建立和拉取。雖然簡單,但是它是整個搜索引擎的最核心組件。一個最簡單的搜索引擎如下圖所示:

技術分享圖片

  • merger: 接收查詢請求,分詞後請求下遊Indexer分別獲取各個indexer的局部TopK文檔,歸攏後排序返回全局相似度最高的TopK文檔。
  • indexer:負責倒排拉取,並利用夾角余弦算法計算相似度,返回TopK結果。夾角余弦可以在 http://www.cnblogs.com/haolujun/p/8011776.html 中了解。
  • index:倒排索引。
sqlserver如何添加全文索引 在SQL Server 中提供了一種名為全文索引的技術,可以大大提高從長字符串裏搜索數 據的速度,不用在用LIKE這樣低效率的模糊查詢了。 下面簡明的介紹如何使用Sql2008 全文索引

一、檢查服務裏面帶有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查詢關鍵字

建立好全文索引後就可以使用SQL語句來查詢了,主要用帶三個關鍵字 CONTAINS、FREETEXT、CONTAINSTABLE和FREETEXTTABLE

1. CONTAINS

搜索單個詞和短語的精確或模糊的匹配項,要搜索的內容必須是個有意義的詞語,比如說“蘋果”、“建設廳”,不能是一些沒意義的詞語,比如“阿迪撒啊是”,“兒兒的”這樣的詞語即使 LIKE是能查詢出來,但全文索引對這樣沒意義的詞語可能沒有建立索引,查不出來
  1. SELECT *
  2. FROM dbo.Business
  3. WHERE CONTAINS(Address,‘旅遊‘)
實現功能:查詢Business表中Address列包含“旅遊”的行 技術分享圖片
詳細查看:http://msdn.microsoft.com/zh-cn/library/ms187787.aspx

2. FREETEXT

和CONTAINS類似,不同的是它會先把要查詢的詞語先進性分詞然後在查詢匹配項
  1. 01.select *
  2. 02.from dbo.Business
  3. 03.where freetext(Address,‘帶嬰兒旅遊‘)
技術分享圖片 詳細查看:http://msdn.microsoft.com/zh-cn/library/ms176078.aspx

3.CONTAINSTABLE

在查詢方式上與 CONTAINS 幾乎一樣。但CONTAINSTABLE 返回的是符合查詢條件的表,在 SQL 語句中我們可以把它當作一個普通的表來使用,並且使用 CONTAINSTABLE 的查詢對每一行返回一個相關性排名值 (RANK) 和全文鍵 (KEY)。
  1. SELECT *
  2. FROM Business AS FT_TBL
  3. INNER JOIN CONTAINSTABLE(Business, *, ‘ISABOUT (嬰兒 WEIGHT (.8),赤水 WEIGHT (.4) )‘)
  4. AS KEY_TBL ON FT_TBL.BusinessId = KEY_TBL.[KEY]
  5. ORDER BY KEY_TBL.RANK DESC
技術分享圖片 ISABOUT 是這種查詢的關鍵字,weight 指定了一個介於 0~1之間的數,類似系數。表示不同條件有不同的側重。 CONTAINSTABLE 返回的表包含有特殊的兩列:KEY,RANK。 被全文索引的表必須有唯一索引。這個唯一的索引列在返回的表中就成為 KEY。我們通常把它作為表連接的條件。 在某些網站搜索時,結果中會出現表示匹配程度的數字,RANK 與此類似。它的值在0~1000之間,標識每一行與查詢條件的匹配程度,程度越高,RANK 的值大,通常情況下,按照 RANK 的降序排列。 詳細查看:http://msdn.microsoft.com/zh-cn/library/ms189760.aspx

4. FREETEXTTABLE

在查詢方式上與 FREETEXT 幾乎一樣。但 FREETEXTTABLE 返回的是符合查詢條件的表,在 SQL 語句中我們可以把它當作一個普通的表來使用,並且使用 FREETEXT 的查詢對每一行返回一個相關性排名值 (RANK) 和全文鍵 (KEY)。
  1. SELECT * ,
  2. BusinessID ,
  3. Address
  4. FROM Business AS FT_TBL
  5. INNER JOIN FREETEXTTABLE(Business, Address, ‘ISABOUT (帶嬰兒旅遊 WEIGHT (.8),赤水 WEIGHT (.4) )‘)
  6. AS KEY_TBL ON FT_TBL.BusinessId = KEY_TBL.[KEY]
  7. ORDER BY KEY_TBL.RANK DESC
技術分享圖片 詳細查看:http://msdn.microsoft.com/zh-cn/library/ms177652.aspx

--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/

全文索引需要註意:

  1. 表中必須有一個唯一性索引,當並不需要是主鍵。
  2. 一個表中只能有一個全文索引。
  3. 你需要告訴你的腳本你想使用全文索引,如何告訴呢?那就是使用關鍵字:CONTAINS、FULLTEXT、CONTAINSTABLE、FREETEXTTABLE。例如:SELECT * FROM table_name WHERE CONTAINS(fullText_column,‘"search contents*"‘);需要記住CONTAINS等在不同場景、需求下的用法。
  4. 如果定義了變量作為傳入值,那麽就要註意是否需要在set字符的時候的前面加入N標識。
  5. 要對表設置全文索引,那就得先對數據庫設置了全文索引,這樣點擊表右鍵的時候,“全文索引”選項才能用。
  6. 腳本在查找的時候是不區分大小寫的。解決辦法:SELECT * FROM Table_name WHERE Column_name=‘A‘ COLLATE Chinese_PRC_CS_AI;或者SELECT * FROM Table_name WHERE ASCII(Column_name) = ASCII(‘A‘);
  7. Microsoft SQL Server 全文引擎 (MSFTESQL) 不是基於某一特定行中存儲的值來構造 B 樹結構,而是基於要索引的文本中的各個標記來創建倒排、堆積且壓縮的索引結構。
  8. 全文索引並不一定能達到like這個謂詞的效果,如LIKE ‘%qq%‘。這正是本篇文章想要說明的。
  9. 如果數據庫是在移動盤符上,好像就無法設置:數據庫-屬性-文件-“使用全文索引”了,這個時候chckbox是不可用的。(這個大家可以求證一下)
  10. 關於搜索結果的排序問題,全文索引並沒有這個功能,也就是匹配度排序或者說是相似度排序。
  11. Lucene中有一個Similarity類,Lucene Practical Scoring Function就包含了得分的計算公式,tf、idf。
參考轉載: 1.全文索引的使用:https://www.cnblogs.com/qianzf/p/7131741.html 2.全文索引中的小坑:https://www.cnblogs.com/liwei225/p/5101716.html (核心意思就是一般不能絕對實現%%的功能,會出現許多不) 3.倒序排序的概念/全文索引的原理:https://www.cnblogs.com/gered/p/9561710.html

(4.15)全文索引的使用