首先,資料分兩種:結構化資料和非結構化資料
結構化資料如資料庫資料非結構化資料如郵件,word文件
非結構化資料的另一種叫法是全文資料
當然還有一種分類為半結構化資料:如html和xml資料;半結構化資料可以根據需要按照結構化資料來處理,也可以按照非結構化資料來處理
結構化資料本來就是按照一定的規則來組織的資料,不用多說;關鍵的問題就在於非結構化資料即全文資料的搜尋上。
全文資料的搜尋主要有兩種:1.順序掃瞄法 2.全文檢索法
1.順序掃瞄法在nt系統裡面就有體現,windows當中的搜尋功能就有搜尋檔案,或者搜尋檔案內容的選項;如果是按照搜尋檔案當中的內容時,那麼windows就會順序掃瞄計算機當中的每乙個檔案,去查詢包含指定內容的檔案。不用多說,會非常慢。
2.全文檢索接觸過資料庫之後,針對資料庫當中的結構化資料的搜尋速度是很快的,而將非結構化的資料轉換成結構化的資料,然後再進行搜尋,這就是全文檢索的基本思路了。
這也就是說,全文檢索分為兩步,首先將非結構化的資料整理成結構化的----建立索引的過程
然後對結構化的資料搜尋的過程------對索引進行搜尋的過程
總結:這種先建立索引,然後再對索引進行搜尋的過程叫做全文檢索
1.索引建立:
首先,索引裡面究竟存些什麼?
想這個問題的時候,想一下順序搜尋:非結構化資料中所儲存的是每個檔案都包含哪些字串,即已知檔案欲求字串相對容易,也即是檔案到字串的對映。而nt系統下的搜尋是已知字串,去搜尋檔案,即字串到檔案的對映。這就相對困難了。因為基礎是檔案到字串的對映,而搜尋的時候倒過來從字串去對映檔案。所以,如何在檔案到字串對映的基礎上,儲存檔案到字串的對映關係,那麼搜尋的時候就相對簡單了。
總結:由於檔案到字串的對映是字串到檔案的對映的反向過程,因此這種索引被稱作反向索引。
大致儲存結構如下:字串----文件列表
此處的字串稱為字典,文件列表稱為倒排表
term
term是搜尋的最小單位,它表示文件的乙個詞語,term由兩部分組成:它表示的詞語和這個詞語所出現的field。
tocken
tocken是term的一次出現,它包含trem文字和相應的起止偏移,以及乙個型別字串。一句話中可以出現多次相同的詞語,它們都用同乙個term表示,但是用不同的tocken,每個tocken標記該詞語出現的地方。
其次,如何建立索引?
1.首先是拿到文件 2.將文件傳給分詞元件(tokenizer) 分詞元件會做如下事情:
2.1將文件分成乙個乙個單獨的單詞
2.2去除標點符號
2.3去除停詞
3.將得到的單詞或者說是詞元傳給語言處理元件,對於英語,語言處理元件一般做以下幾點:
3.1變為小寫
3.2將單詞縮減為詞根形式,如cars到car等。這種操作稱為:stemming。
3.3將單詞轉變為詞根形式,如drove到drive等。這種操作稱為:lemmatization
兩者的異同:
相同之處:兩者都要使詞彙成為詞根形式。
不同之處: stemming採用的是縮減的方式:cars到car,driving到drive
lemmatization採用的是轉變的方式:drove到drive,driving到drive。
演算法不同: stemming主要是採取某種固定的演算法來做這種縮減,如去除s,去除ing加e,將ational變為ate,將tional變為tion
lemmatization主要是採用儲存某種字典的方式做這種轉變。比如字典中有driving道drive,drove到drive,am、is、are到be的對映,做轉變時,只要查字典就可以了。
總結: stemming和lemmatization不是互斥關係,是有交集的,有的詞利用這兩種方式都能達到相同的轉換。
4.將得到的詞傳給索引元件indexer
4.1利用得到的詞(term)建立乙個字典。
4.2對字典按字母順序進行排序
4.3合併相同的詞(term)成為文件倒排(posting list)鍊錶形成文件倒排鍊錶的過程中,有兩個定義:(注意這兩個定義)
文件頻次(df)(document frequency),表示總共有多少檔案包含此詞
詞頻率(tf)frequency,表示此檔案中包含了多少個此詞
總結:從理論上來講,拿到原始資料,然後傳給分詞元件,先將文件經過分詞元件的分析,然後經過語言處理元件,最後就到了分詞元件,最關鍵的應該是分詞元件部分。這一部分可以單獨研究一下
最後,如何對索引進行搜尋?
1.使用者輸入查詢語句
2.對查詢語句進行詞法分析,語法分析,語言處理。
詞法分析主要用來識別單詞和關鍵字;比如使用者輸入「lucene and lerned not hadoop」,
經過詞法分析得到的單詞有:lucene,learned,hadoop,關鍵字有and,not。
全文檢索引擎 Sphinx
sphinx是乙個基於sql的全文檢索引擎,可以結合mysql,postgresql做全文搜尋,它可以提供比資料庫本身更專業的搜尋功能,使得應用程式更容易實現專業化的全文檢索。sphinx特別為一些指令碼語言設計搜尋api介面,如php,python,perl,ruby等,同時為mysql也設計了乙...
全文檢索引擎 Sphinx
sphinx是乙個基於sql的全文檢索引擎,可以結合mysql,postgresql做全文搜尋,它可以提供比資料庫本身更專業的搜尋功能,使得應用程式更容易實現專業化的全文檢索。sphinx特別為一些指令碼語言設計搜尋api介面,如php,python,perl,ruby等,同時為mysql也設計了乙...
mysql ngram全文檢索引擎
中的內容視作乙個短語 整體 3.查詢 已經存在表 against select from articles where match title,body against 文言文 innatural language mode 不指定模式,預設使用自然語言模式 select from articles...