一、Lucene概述
1义黎、Lucene簡(jiǎn)介
Lucene是apache下的一個(gè)開(kāi)源的全文檢索引擎工具包诉瓦。
2、 全文檢索(Full-text Search)
定義
全文檢索就是先“分詞”創(chuàng)建索引漱挎,再執(zhí)行搜索的過(guò)程系枪。
分詞:就是將一段文字分成一個(gè)個(gè)單詞
全文檢索就將一段文字分成一個(gè)個(gè)單詞去查詢(xún)數(shù)據(jù)!?牧隆私爷!
應(yīng)用場(chǎng)景
(1)搜索引擎(了解)
搜索引擎是一個(gè)基于全文檢索雾棺、能獨(dú)立運(yùn)行、提供搜索服務(wù)的軟件系統(tǒng)衬浑。
(2)電商站內(nèi)搜索(重點(diǎn))
思考:電商網(wǎng)站內(nèi)捌浩,我們都是通過(guò)輸入關(guān)鍵詞來(lái)搜索商品的。如果我們根據(jù)關(guān)鍵詞工秩,直接查詢(xún)數(shù)據(jù)庫(kù)尸饺,會(huì)有什么后果?
答:我們只能使用模糊搜索助币,來(lái)進(jìn)行匹配浪听,會(huì)導(dǎo)致很多數(shù)據(jù)匹配不到。所以眉菱,我們必須使用全文檢索馋辈。
二、Lucene實(shí)現(xiàn)全文檢索的流程
全文檢索的流程分為兩大部分:索引流程倍谜、搜索流程迈螟。
索引流程:采集數(shù)據(jù)--->構(gòu)建文檔對(duì)象--->創(chuàng)建索引(將文檔寫(xiě)入索引庫(kù))。
搜索流程:創(chuàng)建查詢(xún)--->執(zhí)行搜索--->渲染搜索結(jié)果尔崔。
三答毫、配置步驟說(shuō)明
(1)搭建環(huán)境(先下載Lucene)
1、下載Lucene
Lucene是開(kāi)發(fā)全文檢索功能的工具包季春,使用時(shí)從官方網(wǎng)站下載洗搂,并解壓。
官方網(wǎng)站:http://lucene.apache.org/
下載地址:http://archive.apache.org/dist/lucene/java/
2载弄、創(chuàng)建項(xiàng)目耘拇,導(dǎo)入包
mysql5.1驅(qū)動(dòng)包:mysql-connector-java-5.1.7-bin.jar
核心包:lucene-core-4.10.3.jar
分析器通用包:lucene-analyzers-common-4.10.3.jar
查詢(xún)解析器包:lucene-queryparser-4.10.3.jar
(2)創(chuàng)建索引庫(kù)
1.采集數(shù)據(jù)
2.將數(shù)據(jù)轉(zhuǎn)換成Lucene文檔
3.將文檔寫(xiě)入索引庫(kù),創(chuàng)建索引
(具體代碼不在此寫(xiě)出)
(3)搜索索引庫(kù)
(具體代碼不在此寫(xiě)出)
四宇攻、分詞
(1) 重要性
分詞是全文檢索的核心惫叛。
所謂的分詞,就是將一段文本逞刷,根據(jù)一定的規(guī)則嘉涌,拆分成一個(gè)一個(gè)詞。
Lucene是根據(jù)分析器實(shí)現(xiàn)分詞的夸浅。針對(duì)不同的語(yǔ)言提供了不同的分析器仑最。并且提供了一個(gè)通用的標(biāo)準(zhǔn)分析器StandardAnalyzer
(2)Lucene分詞的過(guò)程
分詞的時(shí)候,是以域?yàn)閱挝坏姆2煌挠蚓剑嗷オ?dú)立。
同一個(gè)域中坯钦,拆分出來(lái)相同的詞预皇,視為同一個(gè)詞(Term)
不同的域中侈玄,拆分出來(lái)相同的詞,不是同一個(gè)詞深啤。
其中拗馒,Term是Lucene最小的語(yǔ)匯單元,不可再細(xì)分溯街。
分詞的時(shí)候經(jīng)歷了一系列的過(guò)濾器诱桂。如大小寫(xiě)轉(zhuǎn)換、去除停用詞等呈昔。
(3)分詞后索引庫(kù)結(jié)構(gòu)
索引庫(kù)中有兩個(gè)區(qū)域:索引區(qū)挥等、文檔區(qū)。
文檔區(qū)存放的是文檔堤尾。Lucene給每一個(gè)文檔自動(dòng)加上一個(gè)文檔編號(hào)docID肝劲。
索引區(qū)存放的是索引。注意:
索引是以域?yàn)閱挝坏墓Γ煌挠虼腔保舜讼嗷オ?dú)立。
索引是根據(jù)分詞規(guī)則創(chuàng)建出來(lái)的粘室,根據(jù)索引就能找到對(duì)應(yīng)的文檔榄檬。
五、Field域
(1)三大屬性
1.是否分詞(tokenized)
只有設(shè)置了分詞屬性為true衔统,lucene才會(huì)對(duì)這個(gè)域進(jìn)行分詞處理鹿榜。
在實(shí)際的開(kāi)發(fā)中,有一些字段是不需要分詞的锦爵,比如商品id舱殿,商品圖片等。
而有一些字段是必須分詞的险掀,比如商品名稱(chēng)沪袭,描述信息等。
- 是否索引(indexed)
只有設(shè)置了索引屬性為true迷郑,lucene才為這個(gè)域的Term詞創(chuàng)建索引枝恋。
在實(shí)際的開(kāi)發(fā)中,有一些字段是不需要?jiǎng)?chuàng)建索引的嗡害,比如商品的圖片等。我們只需要對(duì)參與搜索的字段做索引處理畦攘。
3.是否存儲(chǔ)(stored)
只有設(shè)置了存儲(chǔ)屬性為true霸妹,在查找的時(shí)候,才能從文檔中獲取這個(gè)域的值知押。
在實(shí)際開(kāi)發(fā)中叹螟,有一些字段是不需要存儲(chǔ)的鹃骂。比如:商品的描述信息。
因?yàn)樯唐访枋鲂畔照溃ǔ6际谴笪谋緮?shù)據(jù)畏线,讀的時(shí)候會(huì)造成巨大的IO開(kāi)銷(xiāo)。而描述信息是不需要經(jīng)常查詢(xún)的字段良价,這樣的話(huà)就白白浪費(fèi)了cpu的資源了寝殴。
因此,像這種不需要經(jīng)常查詢(xún)明垢,又是大文本的字段蚣常,通常不會(huì)存儲(chǔ)到索引庫(kù)。
(2)特點(diǎn)
三大屬性彼此獨(dú)立痊银。
通常分詞是為了創(chuàng)建索引抵蚊。