Lucene總結
數據的分類
結構化數據:有固定類型或者有固定長度的數據
例如:數據庫中的數據(mysql,oracle等), 元數據(就是windows中的數據)
結構化數據搜索方法:
數據庫中數據通過sql語句可以搜索
元數據(windows中的)通過windows提供的搜索欄進行搜索
非結構化數據:沒有固定類型和固定長度的數據
例如: Word文檔中的數據, 郵件中的數據
非結構化數據搜索方法:
Word文檔使用ctrl+F來搜索
順序掃描法:
Ctrl+F中是使用的順序掃描法,拿到搜索的關鍵字,去文檔中,逐字匹配,直到找到和關鍵字一致的內容為止.
優點: 如果文檔中存在要找的關鍵字就一定能找到想要的內容
缺點: 慢, 效率低
全文檢索算法(倒排索引算法):
將文件中的內容提取出來, 將文字拆封成一個一個的詞(分詞), 將這些詞組成索引(字典中的目錄), 搜索的時候先搜索索引,通過索引找文檔,這個過程就叫做全文檢索.
分詞: 去掉停用詞(a, an, the ,的, 地, 得, 啊, 嗯),因為搜索的時候搜索這些詞沒有意義,將句子拆分成詞,去掉標點符號和空格
優點: 搜索速度快
缺點: 因為創建的索引需要占用磁盤空間,所以這個算法會使用掉更多的磁盤空間,這是用空間換時間
原理
相當於字典,分為目錄和正文兩部分,查詢的時候通過先查目錄,然後通過目錄上標註的頁數去正文頁查找需要的內容
Lucene
什麽是lucene
Lucene是apache旗下的頂級項目,是一個全文檢索工具包
Lucene就是一個可以創建全文檢索引擎系統的一堆jar包.可以使用它來構建全文檢索引擎系統,但是它不能獨立運
全文檢索引擎系統
放在tomcat下可以獨立運行,對外提供全文檢索服務.
Lucene應用領域
- 互聯網全文檢索引擎(比如百度, 谷歌, 必應)
- 站內全文檢索引擎(淘寶, 京東搜索功能)
- 優化數據庫查詢(因為數據庫中使用like關鍵字是全表掃描也就是順序掃描算法,查詢慢)
Lucene下載
官方網站:http://lucene.apache.org/
版本:lucene4.10.3
Jdk要求:1.7以上
IDE:Eclipse
Lucene結構
索引:
域名:詞 這樣的形式,
它裏面有指針指向這個詞來源的文檔
索引庫: 放索引的文件夾(這個文件夾可以自己隨意創建,在裏面放索引就是索引庫)
Term詞元: 就是一個詞, 是lucene中詞的最小單位
文檔:
Document對象,一個Document中可以有多個Field域對象,Field域對象中是key value鍵值對的形式:有域名和域值,
一個document就是數據庫表中的一行記錄, 一個Filed域對象就是數據庫表中的一行一列
這是一個通用的存儲結構.
創建索引和搜索時所用的分詞器必須一致(才能匹配)
域的詳細介紹
是否分詞:
分詞的作用是為了索引
需要分詞: 文件名稱, 文件內容
不需要分詞: 不需要索引的域不需要分詞,還有就是分詞後無意義的域不需要分詞
比如: id, 身份證號
是否索引:
索引的的目的是為了搜索.
需要搜索的域就一定要創建索引,只有創建了索引才能被搜索出來
不需要搜索的域可以不創建索引
需要索引: 文件名稱, 文件內容, id, 身份證號等
不需要索引: 比如圖片地址不需要創建索引, e:\\xxx.jpg
因為根據圖片地址搜索無意義
是否存儲:
存儲的目的是為了顯示.
是否存儲看個人需要,存儲就是將內容放入Document文檔對象中保存出來,會額外占用磁盤空間, 如果搜索的時候需要馬上顯示出來可以放入document中也就是要存儲,這樣查詢顯示速度快, 如果不是馬上立刻需要顯示出來,則不需要存儲,因為額外占用磁盤空間不劃算.
域的各種類型
Field類 |
數據類型 |
Analyzed 是否分析 |
Indexed 是否索引 |
Stored 是否存儲 |
說明 |
StringField(FieldName, FieldValue,Store.YES)) |
字符串 |
N |
Y |
Y或N |
這個Field用來構建一個字符串Field,但是不會進行分析,會將整個串存儲在索引中,比如(訂單號,姓名等) 是否存儲在文檔中用Store.YES或Store.NO決定 |
LongField(FieldName, FieldValue,Store.YES) |
Long型 |
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的策略. |
註意:lucene底層的算法,錢數是要分詞的,因為要根據價錢進行對比
例如: 大於12.5元的小於100元的商品搜索出來
文檔的更新
更新就是按照傳入的Term進行搜索,如果找到結果那麽刪除,將更新的內容重新生成一個Document對象
如果沒有搜索到結果,那麽將更新的內容直接添加一個新的Document對象
文檔的刪除
可以根據某個域的內容進行刪除
還可以一次刪除所有
搜索
TermQuery:
根據詞進行搜索(只能從文本中進行搜索)
QueryParser:
根據域名進行搜索,可以設置默認搜索域,推薦使用. (只能從文本中進行搜索)
NumericRangeQuery:
從數值範圍進行搜索
BooleanQuery:
組合查詢,可以設置組合條件,not and or.從多個域中進行查詢
must相當於and關鍵字,是並且的意思
should,相當於or關鍵字或者的意思
must_not相當於not關鍵字, 非的意思
註意:單獨使用must_not 或者 獨自使用must_not沒有任何意義
MatchAllDocsQuery:
查詢出所有文檔
MultiFieldQueryParser:
可以從多個域中進行查詢,只有這些域中有關鍵詞的存在就查詢出來.
Lucene總結