本系列開始學習Lucene。web
在咱們處理的數據當中,分爲三類數據:數據庫
結構化數據:具備固定格式或限定長度的數據,如咱們的數據庫中的數據app
非結構化數據:無固定格式、無固定長度的數據,如咱們web上的文本內容等oop
半結構數據:如Json、XML數據。性能
那麼咱們怎麼來處理這些不一樣類型的數據呢?
學習
對於數據庫中的結構化數據,使用SQL語句查詢spa
對於非結構數據,咱們順序掃描、全文檢索.orm
其中,順序掃描就是從數據的開頭的一條數據掃描到最後的一條數據。顯而易見的是,這對於時間、性能都是很大的浪費。索引
那什麼是全文檢索呢?hadoop
這就是Lucene要完成的事情了。下面咱們先看一張圖來描述它在整個系統中所起到的做用:
對lucen上層的應用部分,咱們能夠看到應用手機告終構化的、半結構化的、非結構化的數據,由lucene爲其創建索引文件;另外一種應用則是檢索,用戶經過輸入檢索條件的關鍵詞檢索咱們的索引庫,而後把結果返回給用戶。
那麼什麼是索引?
就像新華字典中的拼音檢索和部首索引用來查字同樣。
在lucene中也是同樣,全文檢索指的是某一個詞在哪些文檔中出現過。例如:
在上圖中,「lucene」這個關鍵詞在第1篇和第3篇文檔中出現過。「Solr」這個關鍵詞在第一、三、5篇文檔中出現過。「hadoop」這個關鍵詞在第三、五、七、八、9篇文檔中出現過。
這裏咱們把整個過程稱之爲「反向索引」。右邊的每一個關鍵詞的文檔鏈表咱們稱之爲倒排表。
什麼是反向索引?
反向索引:這種由字符串到文件的映射是文件到字符串映射的反向過程。其實描述的就是一種映射關係。
建立索引
好吧。那麼建立全文檢索的步驟是怎麼樣的呢?
這裏咱們將建立全文檢索分爲三個步驟或者說須要的三個東西:
須要檢索的數據(Document)
分詞技術(Analyzer)
索引建立(Indexer)
咱們舉個例子吧。
第一步,Document數據實例
個人博客空間
HappyBKs的Lucene文章
HappBKs的Hadoop文章
第二步,分詞技術。(咱們這裏採用標準分詞。)
我|的|博|客|空|間
happybks|的|lucene|文|章
happbks|的|hadoop|文|章
注意,這裏通過標準分詞以後,中文按字進行了切分,英文的大寫字符被轉換爲了小寫。
第三步,索引建立。
Term |
ID | Term | ID | Term | ID |
我 | 1 | happybks | 2 | happbks | 3 |
的 | 1 | 的 | 2 | 的 | 3 |
博 | 1 | lucene | 2 | hadoop | 3 |
客 | 1 | 文 | 2 | 文 | 3 |
空 | 1 | 章 | 2 | 章 | 3 |
間 | 1 | ||||
咱們對索引進行合併。
Term | ID | Term | ID | Term | ID |
我 | 1 | happybks | 2,3 | ||
的 | 1,2,3 | ||||
博 | 1 | lucene | 2 | hadoop | 3 |
客 | 1 | 文 | 2,3 | ||
空 | 1 | 章 | 2,3 | ||
間 | 1 | ||||
這張表就是咱們所說的索引。
如今,咱們來看看,如何利用索引來進行檢索。
索引檢索
分爲四個步驟:
搜索關鍵詞(keywords)
分詞技術(Analyzer)
檢索索引(Search)
返回結果
咱們仍是放到例子裏來梳理步驟。
第一步,得到用戶搜索的關鍵詞
lucene文章
第二步,採用分詞技術
lucene|文|章
第三步,檢索索引。
經過上面的圖咱們能夠看到,倒排表中,包含關鍵詞全部分詞單元的文檔是文檔2.
第四步,將結果——第2篇文檔返回。
本文主要闡述了全文檢索的通常原理和過程。至於lucene用怎樣的數學模型,如何實現全文索引,我會在本系列後面的文章中介紹。