1. 程式人生 > >Lucene總結

Lucene總結

缺點 ocs line 運行 什麽是 jdk 不同 結構化數據 文檔

數據的分類

結構化數據:有固定類型或者有固定長度的數據

例如:數據庫中的數據(mysql,oracle), 元數據(就是windows中的數據)

結構化數據搜索方法:

數據庫中數據通過sql語句可以搜索

元數據(windows中的)通過windows提供的搜索欄進行搜索

非結構化數據:沒有固定類型和固定長度的數據

例如: Word文檔中的數據, 郵件中的數據

非結構化數據搜索方法:

Word文檔使用ctrl+F來搜索

順序掃描法:

Ctrl+F中是使用的順序掃描法,拿到搜索的關鍵字,去文檔中,逐字匹配,直到找到和關鍵字一致的內容為止.

優點: 如果文檔中存在要找的關鍵字就一定能找到想要的內容

缺點: , 效率低

全文檢索算法(倒排索引算法):

將文件中的內容提取出來, 將文字拆封成一個一個的詞(分詞), 將這些詞組成索引(字典中的目錄), 搜索的時候先搜索索引,通過索引找文檔,這個過程就叫做全文檢索.

分詞: 去掉停用詞(a, an, the ,, , , , ),因為搜索的時候搜索這些詞沒有意義,將句子拆分成詞,去掉標點符號和空格

優點: 搜索速度快

缺點: 因為創建的索引需要占用磁盤空間,所以這個算法會使用掉更多的磁盤空間,這是用空間換時間

原理

相當於字典,分為目錄和正文兩部分,查詢的時候通過先查目錄,然後通過目錄上標註的頁數去正文頁查找需要的內容

Lucene

什麽是lucene

Luceneapache旗下的頂級項目,是一個全文檢索工具包

Lucene就是一個可以創建全文檢索引擎系統的一堆jar.可以使用它來構建全文檢索引擎系統,但是它不能獨立運

全文檢索引擎系統

放在tomcat下可以獨立運行,對外提供全文檢索服務.

Lucene應用領域

  1. 互聯網全文檢索引擎(比如百度, 谷歌, 必應)
  2. 站內全文檢索引擎(淘寶, 京東搜索功能)
  3. 優化數據庫查詢(因為數據庫中使用like關鍵字是全表掃描也就是順序掃描算法,查詢慢)

Lucene下載

官方網站:http://lucene.apache.org/

版本:lucene4.10.3

Jdk要求:1.7以上

IDEEclipse

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.YESStore.NO決定

LongField(FieldName, FieldValue,Store.YES)

Long

Y

Y

Y或N

這個Field用來構建一個Long數字型Field,進行分析和索引,比如(價格)

是否存儲在文檔中用Store.YESStore.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總結