鞏義專業(yè)網(wǎng)站建設(shè)公司首選推廣賺錢平臺(tái)
文章目錄
- 第1章 Lucene概述
- 1.1 搜索的實(shí)現(xiàn)方案
- 1.1.1 傳統(tǒng)實(shí)現(xiàn)方案
- 1.1.2 Lucene實(shí)現(xiàn)方案
- 1.2 數(shù)據(jù)查詢方法
- 1.1.1 順序掃描法
- 1.1.2 倒排索引法
- 1.3 Lucene相關(guān)概念
- 1.3.1 文檔對(duì)象
- 1.3.2 域?qū)ο?/li>
- 1)分詞
- 2)索引
- 3)存儲(chǔ)
- 1.3.3 常用的Field種類
- 1.4 分詞器
第1章 Lucene概述
Lucene是apache軟件基金會(huì) jakarta項(xiàng)目組的一個(gè)子項(xiàng)目,是一套用于全文檢索和搜尋的開源程式庫,由Apache軟件基金會(huì)支持和提供。其作者是大名鼎鼎的大數(shù)據(jù)之父Doug-Cutting。Lucene通過使用倒排索引技術(shù),能夠快速地從大量的文檔中檢索出相關(guān)信息。對(duì)文本數(shù)據(jù)進(jìn)行高效的索引和搜索,支持復(fù)雜的查詢語法,包括布爾運(yùn)算、短語搜索、模糊搜索等。
在Java開發(fā)環(huán)境里L(fēng)ucene是一個(gè)成熟的免費(fèi)開源工具。就其本身而言,Lucene是當(dāng)前以及最近幾年最受歡迎的免費(fèi)Java信息檢索[程序庫。人們經(jīng)常提到信息檢索程序庫,雖然與搜索引擎有關(guān),但不應(yīng)該將信息檢索程序庫與搜索引擎相混淆。Java中著名的搜索引擎ElasticSearch、Solr等都是采用Lucene作為內(nèi)核進(jìn)行開發(fā);
- Lucene官網(wǎng):https://lucene.apache.org/
Lucene的應(yīng)用場(chǎng)景如下:
- 網(wǎng)站搜索:許多網(wǎng)站使用Lucene或其衍生產(chǎn)品(如Elasticsearch)來提供站內(nèi)搜索功能。
- 企業(yè)級(jí)搜索:在企業(yè)內(nèi)部,Lucene可用于構(gòu)建文件、郵件、數(shù)據(jù)庫記錄等信息的搜索引擎。
- 日志分析:對(duì)于大規(guī)模的日志數(shù)據(jù),可以通過Lucene快速定位到特定的錯(cuò)誤或異常信息。
- 電子商務(wù):在線購物平臺(tái)經(jīng)常利用Lucene來優(yōu)化商品搜索體驗(yàn),提高用戶滿意度。
1.1 搜索的實(shí)現(xiàn)方案
1.1.1 傳統(tǒng)實(shí)現(xiàn)方案
用戶發(fā)送請(qǐng)求查詢到服務(wù)器,服務(wù)器通過SQL查詢數(shù)據(jù)庫將結(jié)果返回,最終將結(jié)果集響應(yīng)到用戶。
特點(diǎn):數(shù)據(jù)庫服務(wù)器壓力大,查詢速度慢,搜索不智能化。
1.1.2 Lucene實(shí)現(xiàn)方案
說明:根據(jù)用戶輸入的搜索關(guān)鍵詞(java),應(yīng)用服務(wù)器通過lucene的API搜索索引庫,索引庫把搜索結(jié)果響應(yīng)應(yīng)用服務(wù)器,應(yīng)用服務(wù)器再把搜索結(jié)果響應(yīng)給用戶。
特點(diǎn):解決用戶量大,數(shù)據(jù)量很大,系統(tǒng)對(duì)搜索速度要求高并且需要智能化搜索的業(yè)務(wù)需求。
1.2 數(shù)據(jù)查詢方法
1.1.1 順序掃描法
舉個(gè)例子:比如我們有大量的文件,文件編號(hào)從A,B,C。。。。。。
需求:要找出文件內(nèi)容中包含有java的所有文件
需求實(shí)現(xiàn):從A文件開始查找,再找B文件,然后再找C文件,以此類推。。。。。
特點(diǎn):如果文件數(shù)量很多,查找將會(huì)非常慢。
1.1.2 倒排索引法
舉個(gè)例子:使用新華字典查找漢字,先找到漢字的偏旁部首,再根據(jù)偏旁部首對(duì)應(yīng)的目錄(索引)找到目標(biāo)漢字。這個(gè)目錄在計(jì)算機(jī)中被稱為索引,是用來幫助程序快速查詢數(shù)據(jù)用的。
索引的組織方式有很多,底層結(jié)構(gòu)也不一樣,但無論是那種索引都只有一個(gè)目標(biāo),那就是用于提高查詢性能,快速定位到目標(biāo)數(shù)據(jù)所在。
以Lucene為例建立倒排索引:
文件一(編號(hào)0):I am Chinese I am Chinese
文件二(編號(hào)1):I love China
Term | (Doc,Freq) |
---|---|
Chinese | (0) (2) |
love | (1)(1) |
china | (1)(1) |
說明:
- 建立倒排索引,就是建立詞語與文件的對(duì)應(yīng)關(guān)系(詞語在什么文件出現(xiàn),出現(xiàn)了幾次,在什么位置出現(xiàn))
- 搜索的時(shí)候,直接根據(jù)搜索關(guān)鍵詞(java),在倒排索引中找到目標(biāo)內(nèi)容。
1.3 Lucene相關(guān)概念
使用Lucene的第一步我們需要采集原始數(shù)據(jù),數(shù)據(jù)的來源可以是傳統(tǒng)的關(guān)系型數(shù)據(jù)庫、文本文件、網(wǎng)絡(luò)資源等;
- 保存在關(guān)系數(shù)據(jù)庫中的業(yè)務(wù)數(shù)據(jù)MySQL:通過JDBC操作獲取到關(guān)系數(shù)據(jù)庫中的業(yè)務(wù)數(shù)據(jù)(mysql)
- 保存在文件中的數(shù)據(jù):通過IO流獲取文件上的數(shù)據(jù)
- 網(wǎng)絡(luò)上的網(wǎng)頁文件數(shù)據(jù):通過爬蟲(蜘蛛)程序獲取網(wǎng)絡(luò)上的網(wǎng)頁數(shù)據(jù)
1.3.1 文檔對(duì)象
文檔對(duì)象(Document):一個(gè)文檔對(duì)象包含有多個(gè)域(Field)。一個(gè)文檔對(duì)象就相當(dāng)于關(guān)系數(shù)據(jù)庫表中的一條記錄,一個(gè)域就相當(dāng)于一個(gè)字段。
1.3.2 域?qū)ο?/h4>
在Lucene中,一篇文檔對(duì)應(yīng)數(shù)據(jù)庫的一行數(shù)據(jù),一個(gè)域?qū)ο髣t對(duì)應(yīng)一個(gè)字段,一個(gè)文檔由多個(gè)域?qū)ο蠼M成。在Lucene中不同的域?qū)ο缶哂胁煌膶傩院凸δ?/p>
1)分詞
分詞(tokenized):對(duì)域中的文本內(nèi)容進(jìn)行根據(jù)要求進(jìn)行分析,將一段文本分析成一個(gè)個(gè)符合邏輯的詞組;
原始文檔:
華為5G智能全面屏拍照游戲手機(jī)
分詞后:
華為、5G、智能、全面屏、拍照、游戲、手機(jī)、游戲手機(jī)
- 需要分詞的域(Field):商品名稱,商品標(biāo)題。這些內(nèi)容用戶需要輸入關(guān)鍵詞進(jìn)行查詢,由于內(nèi)容格式大,內(nèi)容多,需要進(jìn)行分詞處理建立索引。
- 不需要分詞的域(Field):商品編號(hào),身份證號(hào)。是一個(gè)整體,分詞以后沒有意義,不需要分詞。
2)索引
索引(indexed):對(duì)分詞后的數(shù)據(jù)(詞組)建立索引關(guān)系(建立倒排索引表),索引的目的是為了搜索,最終實(shí)現(xiàn)的效果是只需要搜索分詞后的詞組就能找出對(duì)應(yīng)的文檔;
創(chuàng)建索引是對(duì)詞組單元索引,通過詞語找文檔,這種索引的結(jié)構(gòu)叫倒排索引結(jié)構(gòu)。
原始文檔:
doc-01: 華為5G智能全面屏手機(jī)
doc-02: vivo智能5G游戲手機(jī)
分詞后的數(shù)據(jù):
doc-01: 華為、5G、智能、全面屏、手機(jī)、全面屏手機(jī)
doc-02: vivo、智能、5G、游戲、手機(jī)、游戲手機(jī)
- 建立的索引(倒排索引表):
Term | (Doc,Freq) |
---|---|
華為 | (1) (1) |
5G | (1) (1) (2) (1) |
智能 | (1) (1) (2) (1) |
全面屏 | (1) (1) |
全面屏手機(jī) | (1) (1) |
游戲 | (1) (1) |
手機(jī) | (1) (1) (2) (1) |
游戲手機(jī) | (2) (1) |
vivo | (2) (1) |
建立索引其實(shí)就是建立詞組與文檔之間的關(guān)系,這個(gè)關(guān)系表就是倒排索引表,由于倒排索引表中也包含詞組,因此索引建立的越多,占用的磁盤空間也會(huì)很大;
- 需要建立索引的域:商品名稱,商品描述需要分詞建立索引。商品編號(hào),身份證號(hào)作為整體建立索引。只要將來要作為用戶查詢條件的詞,都需要索引。
- 不需要建立索引的域:商品圖片路徑,不作為查詢條件,不需要建立索引。
3)存儲(chǔ)
存儲(chǔ)(stored):由于索引庫的數(shù)據(jù)都是從其他地方采集的(大多數(shù)是從關(guān)系型數(shù)據(jù)庫中采集),因此其他地方已經(jīng)存儲(chǔ)一份原始數(shù)據(jù),因此有些域我們是不需要存儲(chǔ)到Lucenen的索引庫的,只有那些需要搜索的域我們才存儲(chǔ)到Lucene中;
- 需要存儲(chǔ)的域:商品名稱,商品價(jià)格。凡是將來在搜索結(jié)果頁面展現(xiàn)給用戶的內(nèi)容,都需要存儲(chǔ)。
- 不需要存儲(chǔ)的域:商品描述。內(nèi)容多格式大,不需要直接在搜索結(jié)果頁面展現(xiàn),不做存儲(chǔ)。需要的時(shí)候可以從關(guān)系數(shù)據(jù)庫取。
1.3.3 常用的Field種類
Field種類 | 數(shù)據(jù)類型 | 是否分詞 | 是否索引 | 是否存儲(chǔ) | 說明 |
---|---|---|---|---|---|
StringField(FieldName,FieldValue,Store.YES)) | 字符串 | N | Y | Y或N | 字符串類型Field,不分詞,作為一個(gè)整體進(jìn)行索引(比如:身份證號(hào),商品編號(hào)),是否需要存儲(chǔ)根據(jù)Store.YES或Store.NO決定 |
DoublePoint(FieldName,FieldValue) | 數(shù)值型代表 | Y | Y | N | Double數(shù)值型Field代表,分詞并且索引(比如:價(jià)格),不存儲(chǔ) |
StoredField(FieldName,FieldValue) | 重載方法,支持多種類型 | N | N | Y | 構(gòu)建不同類型的Field,不分詞,不索引,只存儲(chǔ)。(比如:商品圖片路徑) |
TextField(FieldName,FieldValue,Store.NO) | 文本類型 | Y | Y | Y或N | 文本類型Field,分詞并且索引,是否需要存儲(chǔ)根據(jù)Store.YES或Store.NO決定 |
1.4 分詞器
分詞器,是將用戶輸入的一段文本,分析成符合邏輯的一種工具。到目前為止呢,分詞器沒有辦法做到完全的符合人們的要求。和我們有關(guān)的分析器有英文的和中文的;
- 英文分詞:
英文分詞過程:輸入文本-關(guān)鍵詞切分-去停用詞-形態(tài)還原-轉(zhuǎn)為小寫。
我們知道英文本身是以單詞為單位,單詞與單詞之間,句子之間通常是空格、逗號(hào)、句號(hào)分隔。因此對(duì)于英文,可以簡(jiǎn)單的以空格來判斷某個(gè)字符串是否是一個(gè)詞,比如:I am Chinese,Chinese很容易被程序處理。
- 中文分詞:
中文是以字為單位的,字與字再組成詞,詞再組成句子。中文:我是中國人,電腦不知道“是中”是一個(gè)詞,還是“中國”是一個(gè)詞?所以我們需要一定的規(guī)則來告訴電腦應(yīng)該怎么切分,這就是中文分詞器所要解決的問題。
- StandardAnalyzer分詞器
一元切分法:一個(gè)字切分成一個(gè)詞。
一元切分法“我是中國人”:我、是、中、國、人。擴(kuò)展字庫
- CJKAnalyzer分詞器
二元切分法:把相鄰的兩個(gè)字,作為一個(gè)詞。
二元切分法“我是中國人”:我是,是中、中國、國人。
- SmartChineseAnalyzer 詞庫分詞器
通常一元切分法,二元切分法都不能滿足我們的業(yè)務(wù)需求。SmartChineseAnalyzer,對(duì)中文支持較好,但是擴(kuò)展性差,針對(duì)擴(kuò)展詞庫、停用詞均不好處理。
- IK-analyzer:IK分詞器
最新版在 https://code.google.com/p/ik-analyzer/上,支持 Lucene 4.10 從 2006 年 12 月推出1.0 版開始, IKAnalyzer 已經(jīng)推出了 4 個(gè)大版本。最初,它是以開源項(xiàng)目 Luence 為應(yīng)用主體的,結(jié)合詞典分詞和文法分析算法的中文分詞組件。從 3.0 版本開 始,IK 發(fā)展為面向 Java 的公用分詞組件,獨(dú)立 于 Lucene 項(xiàng)目,同時(shí)提供了對(duì) Lucene 的默認(rèn)優(yōu)化實(shí)現(xiàn)。適合在項(xiàng)目中應(yīng)用。
ik分詞器本身就是對(duì)Lucene提供的分詞器Analyzer擴(kuò)展實(shí)現(xiàn),使用方式與Lucene的分詞器一致。
依賴:
<dependency><groupId>com.janeluo</groupId><artifactId>ikanalyzer</artifactId><version>2012_u6</version></dependency>
但是IK分詞器在2012年就不再更新了,在Lucene 5.4.0版本出現(xiàn)了部分兼容問題,因此我們本次使用的是:
<dependency><groupId>com.github.magese</groupId><artifactId>ik-analyzer</artifactId><version>8.5.0</version></dependency>