1. 1 倒排索引java
將數據加入到索引庫(你能夠理解成另一個數據庫)時,會先提取數據中的詞彙(分詞),將詞彙加入到文檔域,文檔域中記錄了詞彙以及詞彙在哪條數據記錄中出現過的數據下標。用戶在搜索數據時,先將用戶搜索的數據進行詞彙提取,而後把對應詞彙拿到索引域中進行匹配查找,查找後會找到對應的下標ID,再根據對應下標ID到文檔域中找真實數據.數據庫
1.2 應用場景 :apache
一、 單機軟件的搜索(word中的搜索)api
二、 站內搜索 (baidu貼吧、論壇、 京東、 taobao)架構
三、 垂直領域的搜索 (818工做網)eclipse
四、 專業搜索引擎公司 (google、baidu)工具
2.1 什麼是Lucene優化
Lucene是apache軟件基金會 Jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。搜索引擎
2.2 Lucene與搜索引擎的區別google
全文檢索系統是按照全文檢索理論創建起來的用於提供全文檢索服務的軟件系統,包括創建索引、處理查詢返回結果集、增長索引、優化索引結構等功能。例如:百度搜索、eclipse幫助搜索、淘寶網商品搜索等。
搜索引擎是全文檢索技術最主要的一個應用,例如百度。搜索引擎起源於傳統的信息全文檢索理論,即計算機程序經過掃描每一篇文章中的每個詞,創建以詞爲單位的倒排文件,檢索程序根據檢索詞在每一篇文章中出現的頻率和每個檢索詞在一篇文章中出現的機率,對包含這些檢索詞的文章進行排序,最後輸出排序的結果。全文檢索技術是搜索引擎的核心支撐技術。
Lucene和搜索引擎不一樣,Lucene是一套用java或其它語言寫的全文檢索的工具包,爲應用程序提供了不少個api接口去調用,能夠簡單理解爲是一套實現全文檢索的類庫,搜索引擎是一個全文檢索系統,它是一個單獨運行的軟件系統。
3.1 Lucene入門
實現這麼一個案例,經過Java代碼調用Lucene API實現對索引庫的增刪改查,索引庫數據來源於數據庫,因此增長操做須要先從數據庫將數據查詢出來,再調用Lucene API將數據加入到索引庫中。
3.2 Lucene實現全文檢索思路
全文檢索的流程分爲兩大部分:索引流程、搜索流程。
4.1 經常使用api介紹及分詞
IndexSearcher搜索方法以下:
4.2
5.1 Field屬性
Field是文檔中的域,包括Field名和Field值兩部分,一個文檔能夠包括多個Field,Document只是Field的一個承載體,Field值即爲要索引的內容,也是要搜索的內容。
Field中三個很是重要的屬性:
l 是否分詞(tokenized)
是,將field的內容分紅一個一個單詞。分詞的目的:分詞目的爲了索引
例如:商品的名稱。
否,不分詞,將內容做爲一個總體存儲。
例如:商品ID 身份證號,圖片路徑
l 是否索引(indexed)
是,將field的值創建索引,索引的目的:索引的目的爲了搜索。
例如:商品的名稱
否,不創建索引
例如:圖片路徑、文件路徑等
l 是否存儲(stored),存不存取決於查詢結果展現不展現
是,存儲field的值。存儲的目的:(爲了展現在頁面)
例如:商品名稱,圖片路徑
否,不存儲field的值。
例如:商品介紹。若是須要展現,根據ID從數據庫查詢展現在詳情頁面。
5.2 Field經常使用類型
下邊列出了開發中經常使用 的Filed類型,注意Field的屬性,根據需求選擇:
Field類 |
數據類型 |
Analyzed 是否分詞 |
Indexed 是否索引 |
Stored 是否存儲 |
說明 |
StringField(FieldName, FieldValue,Store.YES)) |
字符串 |
N |
Y |
Y或N |
這個Field用來構建一個字符串Field,可是不會進行分詞,會將整個串存儲在索引中,好比(訂單號,身份證號等) 是否存儲在文檔中用Store.YES或Store.NO決定 |
LongField(FieldName, FieldValue,Store.YES) FloatField(FieldName, FieldValue,Store.YES) |
Long類型Float類型 等等數字類型 |
Y |
Y |
Y或N |
這個Field用來構建一個Long數字型Field,進行分詞和索引,好比(價格) 是否存儲在文檔中用Store.YES或Store.NO決定 |
StoredField(FieldName, FieldValue) |
重載方法,支持多種類型 |
N |
N |
Y |
這個Field用來構建不一樣類型Field(圖片路徑) 不分詞,不索引,但要Field存儲在文檔中 |
TextField(FieldName, FieldValue, Store.NO) 或 TextField(FieldName, reader) |
字符串 或 流 |
Y |
Y |
Y或N |
若是是一個Reader, lucene猜想內容比較多,會採用Unstored的策略. |