定義
Lucene是一個(gè)成熟的窟勃、高性能的、可擴(kuò)展的逗堵、輕量級(jí)的秉氧,而且功能強(qiáng)大的搜索引擎包。Lucene的核心jar包只有一個(gè)文件蜒秤,而且不依賴任何第三方j(luò)ar包谬运。更重要的是,它提供的索引數(shù)據(jù)和檢索數(shù)據(jù)的功能開箱即用垦藏。當(dāng)然梆暖,Lucene也提供了多語(yǔ)言支持,具有拼寫檢查掂骏、高亮等功能轰驳。
?架構(gòu) 術(shù)語(yǔ)? Lucene中的術(shù)語(yǔ)和 < 存儲(chǔ)
Apache Lucene把所有的信息都寫入到一個(gè)稱為倒排索引的數(shù)據(jù)結(jié)構(gòu)中,倒排索引的介紹可以參考 < 數(shù)據(jù)分析
學(xué)習(xí)ES初期弟灼,我經(jīng)臣督猓考慮的問(wèn)題是,傳入到Document中的數(shù)據(jù)是如何轉(zhuǎn)變成倒排索引的田绑?查詢語(yǔ)句是如何轉(zhuǎn)換成一個(gè)個(gè)Term使高效率文本搜索變得可行勤哗?這種轉(zhuǎn)換數(shù)據(jù)的過(guò)程就稱為文本分析(analysis)
文本分析工作由analyzer組件負(fù)責(zé)。analyzer由一個(gè)分詞器(tokenizer)和0個(gè)或者多個(gè)過(guò)濾器(filter)組成,也可能會(huì)有0個(gè)或者多個(gè)字符映射器(character mappers)組成掩驱。
Lucene中的tokenizer用來(lái)把文本拆分成一個(gè)個(gè)的Token芒划。Token包含了比較多的信息,比如Term在文本的中的位置及Term原始文本欧穴,以及Term的長(zhǎng)度民逼。文本經(jīng)過(guò)tokenizer處理后的結(jié)果稱為token stream。token stream其實(shí)就是一個(gè)個(gè)Token的順序排列涮帘。token stream將等待著filter來(lái)處理拼苍。
除了tokenizer外,Lucene的另一個(gè)重要組成部分就是filter鏈调缨,filter鏈將用來(lái)處理Token Stream中的每一個(gè)token疮鲫。這些處理方式包括刪除Token,改變Token,甚至添加新的Token弦叶。Lucene中內(nèi)置了許多filter俊犯,讀者也可以輕松地自己實(shí)現(xiàn)一個(gè)filter。有如下內(nèi)置的filter:
Lowercase filter:把所有token中的字符都變成小寫
ASCII folding filter:去除tonken中非ASCII碼的部分
Synonyms filter:根據(jù)同義詞替換規(guī)則替換相應(yīng)的token
Multiple language-stemming
filters:把Token(實(shí)際上是Token的文本內(nèi)容)轉(zhuǎn)化成詞根或者詞干的形式湾蔓。
所以通過(guò)Filter可以讓analyzer有幾乎無(wú)限的處理能力:因?yàn)樾碌男枨筇砑有碌腇ilter就可以了瘫析。
?索引和查詢
索引過(guò)程:Lucene用用戶指定好的analyzer解析用戶添加的Document。當(dāng)然Document中不同的Field可以指定不同的analyzer。如果用戶的Document中有title和description兩個(gè)Field贬循,那么這兩個(gè)Field可以指定不同的analyzer咸包。
搜索過(guò)程:用戶的輸入查詢語(yǔ)句將被選定的查詢解析器(query parser)所解析,生成多個(gè)Query對(duì)象。當(dāng)然用戶也可以選擇不解析查詢語(yǔ)句杖虾,使查詢語(yǔ)句保留原始的狀態(tài)烂瘫。在ElasticSearch中,有的Query對(duì)象會(huì)被解析(analyzed)奇适,有的不會(huì)坟比,比如:前綴查詢(prefix query)就不會(huì)被解析,精確匹配查詢(match query)就會(huì)被解析嚷往。對(duì)用戶來(lái)說(shuō)葛账,理解這一點(diǎn)至關(guān)重要。
對(duì)于索引過(guò)程和搜索過(guò)程的數(shù)據(jù)解析這一環(huán)節(jié)皮仁,我們需要把握的重點(diǎn)在于:倒排索引中詞應(yīng)該和查詢語(yǔ)句中的詞正確匹配籍琳。如果無(wú)法匹配,那么Lucene也不會(huì)返回我們喜聞樂(lè)見(jiàn)的結(jié)果贷祈。舉個(gè)例子:如果在索引階段對(duì)文本進(jìn)行了轉(zhuǎn)小寫(lowercasing)和轉(zhuǎn)變成詞根形式(stemming)處理趋急,那么查詢語(yǔ)句也必須進(jìn)行相同的處理∈铺埽或是查詢使用的analyzer必須和索引時(shí)使用的analyzer相同呜达。