1. 1 倒排索引
將數據加入到索引庫(你可以理解成另外一個數據庫)時,會先提取數據中的詞匯(分詞),將詞匯加入到文檔域,文檔域中記錄了詞匯以及詞匯在哪條數據記錄中出現過的數據下標。用戶在搜索數據時,先將用戶搜索的數據進行詞匯提取,然后把對應詞匯拿到索引域中進行匹配查找,查找后會找到對應的下標ID,再根據對應下標ID到文檔域中找真實數據.
1.2 應用場景 :
1、 單機軟件的搜索(word中的搜索)
2、 站內搜索 (baidu貼吧、論壇、 京東、 taobao)
3、 垂直領域的搜索 (818工作網)
4、 專業搜索引擎公司 (google、baidu)
2.1 什么是Lucene
Lucene是apache軟件基金會 Jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。
- Lucene是一套用於全文檢索和搜尋的開源程式庫,由Apache軟件基金會支持和提供。 Lucene提供了一個簡單卻強大的應用程式接口,能夠做全文索引和搜尋, 在Java開發環境里Lucene是一個成熟的免費開放源代碼工具。
- Lucene並不是現成的搜索引擎產品,但可以用來制作搜索引擎產品。
2.2 Lucene與搜索引擎的區別
全文檢索系統是按照全文檢索理論建立起來的用於提供全文檢索服務的軟件系統,包括建立索引、處理查詢返回結果集、增加索引、優化索引結構等功能。例如:百度搜索、eclipse幫助搜索、淘寶網商品搜索等。
搜索引擎是全文檢索技術最主要的一個應用,例如百度。搜索引擎起源於傳統的信息全文檢索理論,即計算機程序通過掃描每一篇文章中的每一個詞,建立以詞為單位的倒排文件,檢索程序根據檢索詞在每一篇文章中出現的頻率和每一個檢索詞在一篇文章中出現的概率,對包含這些檢索詞的文章進行排序,最后輸出排序的結果。全文檢索技術是搜索引擎的核心支撐技術。
Lucene和搜索引擎不同,Lucene是一套用java或其它語言寫的全文檢索的工具包,為應用程序提供了很多個api接口去調用,可以簡單理解為是一套實現全文檢索的類庫,搜索引擎是一個全文檢索系統,它是一個單獨運行的軟件系統。
3.1 Lucene入門
實現這么一個案例,通過Java代碼調用Lucene API實現對索引庫的增刪改查,索引庫數據來源於數據庫,所以增加操作需要先從數據庫將數據查詢出來,再調用Lucene API將數據加入到索引庫中。
3.2 Lucene實現全文檢索思路
全文檢索的流程分為兩大部分:索引流程、搜索流程。
- 索引流程:即采集數據à構建文檔對象à分析文檔(分詞)à創建索引。
- 搜索流程:即用戶通過搜索界面輸入à創建查詢à執行搜索,搜索器從索引庫搜à渲染搜索結果。
4.1 常用api介紹及分詞
IndexSearcher搜索方法如下:
4.2
- 分詞:采集到的數據會存儲到document對象的Field域中,分詞就是將Document中Field的value值切分成一個一個的詞。
- 過濾:包括去除標點符號過濾、去除停用詞過濾(的、是、a、an、the等)、大寫轉小寫、詞的形還原(復數形式轉成單數形參、過去式轉成現在式。。。)等。
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的策略. |
