全文索引,分詞概述

2021-05-22 13:01:08 字數 2756 閱讀 6162

在乙個產品介紹**中查詢產品時,由於產品的介紹性文字可能會很長,如果使用對產品介紹字段使用like進行模糊查詢,效能肯定會是問題。那麼如何解決這個問題呢?第乙個想法就是使用全文索引。那麼全文索引是什麼、應該如何應用、在應用的過程中又應該注意哪些事情呢?這個post作為學習全文檢索的筆記。

1、是什麼

[摘錄自sql server2000聯機從書]

全文索引為在字串資料中進行複雜的詞搜尋提供有效支援。全文索引儲存關於重要詞和這些詞在特定列中的位置的資訊。全文查詢利用這些資訊,可快速搜尋包含具體某個詞或一組詞的行。

全文索引包含在全文目錄中。每個資料庫可以包含乙個或多個全文目錄。乙個目錄不能屬於多個資料庫,而每個目錄可以包含乙個或多個表的全文索引。乙個表只能有乙個全文索引,因此每個有全文索引的表只屬於乙個全文目錄。

全文目錄和索引不儲存在它們所屬的資料庫中。目錄和索引由 microsoft 搜尋服務分開管理。

全文索引必須在基表上定義,而不能在檢視、系統表或臨時表上定義。

依據上面的描述,可以做這樣乙個比喻。大家大概都見過檔案櫃,檔案櫃是將各種檔案按照分類登記在檔案索引卡上,這個檔案櫃中的就象建立的全文索引,通過這些檔案索引卡可以迅速定位你要查詢的卷宗所在的位置。如果不建立這些索引卡,如果卷宗數量不多還好,一旦檔案數量很多的時候顯然很難找到期望的卷宗,這就類似使用like的情形。

全文索引和普通索引的區別: 

普通sql 索引全文索引

儲存時受定義它們所在的資料庫的控制

儲存在檔案系統中,但通過資料庫管理

每個表允許有若干個普通索引

每個表只允許有乙個全文索引

當對作為其基礎的資料進行插入、更新或刪除時,它們會自動更新

將資料新增到全文索引稱為填充,全文索引可通過排程或特定請求來請求,也可以在新增新資料時自動發生

不分組在同乙個資料庫內分組為乙個或多個全文目錄

使用sql server企業管理器、嚮導或transact-sql語句建立和除去

使用sql server企業管理器、嚮導或儲存過程建立、管理和除去

2、怎麼用 

例子:參見使用sql server2000的全文索引服務

上面這篇文章已經說的比較清楚了,這裡只是把典型的幾種sql列出: 

(詳細描述可以在sql server2000聯機從書中查詢contains)

返回包含字串 "sea" 或 "bread" 的所有分類描述。

use northwind

select * from categories

where contains( description, ' "sea*" or "bread*" ')

(詳細描述可以在sql server2000聯機從書中查詢freetext)

搜尋產品描述中含有與 bread、candy、dry 和 meat 相關的詞語的所有產品類別,如 breads、candies、dried 和 meats 等。

use northwind

go select categoryname

from categories

where freetext (description, 'sweetest candy bread and dry meat' )

go 3、建議

a、仔細考慮維護全文索引的方式

[摘錄自sql server2000聯機從書]

維護全文索引有三種方式:

所使用的方法取決於許多因素,如 cpu 和可用的記憶體、資料更改的數量和速度、可用磁碟空間的大小,以及當前全文索引的重要性等。以下建議可作為選擇維護方式時的參考。

不過即使選擇好作業型別後,也應該給排程全文索引的時機進行恰當的規劃。由於表中資料的改變會影響全文索引內容,所以頻繁的更新資料的表不太適合進行全文索引。同時可以把排程填充全文索引的時間放在系統比較空閒的時候,而且應該考慮到進行填充可能的時間。比如你可以把填充的時間定在每天晚上0:00,這個時候應該相對空閒一些(這個想法有些想當然的嫌疑

另外應該模擬客戶處可能的資料量做個填充實驗,以便對填充索引的時間長度有所估計。 

啊~~全文檢索所涉及的面實在是太廣了。先整理這些吧~! 

全文索引技術是目前搜尋引擎的關鍵技術。

試想在1m大小的檔案中搜尋乙個詞,可能需要幾秒,在100m的檔案中可能需要幾十秒,如果在更大的檔案中搜尋那麼就需要更大的系統開銷,這樣的開銷是不現實的。

所以在這樣的矛盾下出現了全文索引技術,有時候有人叫倒排文件技術。

原理是先定義乙個詞庫,然後在文章中查詢每個詞條(term)出現的頻率和位置,把這樣的頻率和位置資訊按照詞庫的順序歸納,這樣就相當於對檔案建立了乙個以詞庫為目錄的索引,這樣查詢某個詞的時候就能很快的定位到該詞出現的位置。

問題在處理英文文件的時候顯然這樣的方式是非常好的,因為英文自然的被空格分成若干詞,只要我們有足夠大的詞彙庫就能很好的處理。但是亞洲文字因為沒有空格作為斷詞標誌,所以就很難判斷乙個詞,而且人們使用的詞彙在不斷的變化,而維護乙個可擴充套件的詞彙庫的成本是很高的,所以問題出現了。

解決出現這樣的問題使「分詞」成為全文索引的關鍵技術。目前有兩中基本的方法:

二元法 它把所有有可能的每兩兩漢字的組合看為乙個片語,這樣就沒有維護詞庫的開銷。

詞庫法 它使使用詞庫中的詞作為切分的標準,這樣也出現了詞庫跟不上詞彙發展的問題,除非你維護詞庫。

實際上現在很多著名的搜尋引擎都使用了多種分詞的辦法,比如「正向最大匹配」+「逆向最大匹配」,基於統計學的新詞識別,自動維護詞庫等技術,但是顯然這樣的技術還沒有作到完美。

目前全文索引技術正走向人工智慧化,也是發展的方向。

全文索引(三)lucene 分詞 Analyzer

分詞 將reader通過閱讀物件analyzer字處理,得到tokenstream處理流程被稱為分割。該解釋可能是太晦澀。檢視示例,這個東西是什麼感性的認識。樣品 一段文字 this is jack s house 經過分詞器處理之後得到可能為jack house。這個過程中 this is 稱之為...

MySQL 使用中文分詞的全文索引

向新增title和text欄位的全文索引 alter table content add fulltext index text index title,text with parser ngram 1.按自然語言搜尋模式查詢 預設 select from content where match t...

mysql全文索引的坑 MySQL全文索引問題

我有乙個包含以下資料的 文章 mysql select from articles id title body 1 mysql tutorial dbms stands for database 2 how to use mysql well after you went through a 3 o...