国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Lucene的全文檢索的研究及實現(xiàn)

2018-07-28 07:19:12徐誠皓
電腦知識與技術(shù) 2018年11期
關(guān)鍵詞:全文檢索

徐誠皓

摘要:Lucene是一個基于Java 開發(fā)的,高效的、開源的全文索引引擎工具包。它使用簡單,有良好的移植性,可以嵌入到各種系統(tǒng)及應(yīng)用中。同時它也是強(qiáng)大的,實現(xiàn)了針對多種復(fù)雜文檔的索引及檢索。文章介紹分析了Lucene的系統(tǒng)結(jié)構(gòu),與關(guān)系型數(shù)據(jù)庫的不同以及其實現(xiàn)機(jī)制,開發(fā)實現(xiàn)了一個基于Lucene的Web應(yīng)用。

關(guān)鍵詞:全文檢索;Lucene;中文分詞;Web實現(xiàn)

中圖分類號:TP311 文獻(xiàn)標(biāo)志碼:A 文章編號:1009-3044(2018)11-0095-03

Lucene是一個開源全文檢索工具包,它具有優(yōu)異的索引結(jié)構(gòu)和良好的系統(tǒng)架構(gòu),提供了靈活的API函數(shù)接口和可以定制的數(shù)據(jù)存儲結(jié)構(gòu),以實現(xiàn)具體的全文檢索功能。Lucene完全由Java JDK開發(fā)而成,沒有用到任何第三方開發(fā)包,因此,Lucene也具有良好的跨平臺特性。文章對Lucene進(jìn)行了研究和分析,以此為基礎(chǔ)設(shè)計實現(xiàn)了一個手機(jī)信息檢索的Web應(yīng)用。

1 全文檢索引擎Lucene

1.1系統(tǒng)結(jié)構(gòu)

由于是基于Java設(shè)計的,Lucene也運(yùn)用了面向?qū)ο蟮脑O(shè)計思想。首先,各種格式的文件被Lucene的對外接口導(dǎo)入之后,通過分析器,被轉(zhuǎn)換成了一種中間索引文件,這種文件能在不同平臺間兼容共享;之后,Lucene通過抽象將索引核心組成部分設(shè)計為抽象類,并提供具體平臺的實現(xiàn)類,用于檢索索引及保存結(jié)果;最后,以中間索引文件為數(shù)據(jù)源,使用某個特定平臺上的方法,獲得想查詢的內(nèi)容。此外,一些經(jīng)常會使用的對象及方法,與具體平臺相關(guān)的對象及方法,也封裝為類,為查詢提供方便。這樣就使得Lucene成為了一個簡單,高效,易擴(kuò)展的檢索引擎系統(tǒng)。

Lucene 由對外接口、索引核心、基礎(chǔ)結(jié)構(gòu)封裝三大部分組成。系統(tǒng)結(jié)構(gòu)圖如圖1 所示。

如圖1所示,Lucene包含七個組成結(jié)構(gòu):

1) org.apache.lucene.analysis:語言分析器,主要用于分詞

2)org.apache.lucene.document:存儲索引的文檔結(jié)構(gòu),類似oracle中的表結(jié)構(gòu)

3) org.apache.lucene.index:索引管理,主要包括建立,刪索引除等

4) org.apache.lucene.search:檢索管理,提供檢索方法,并根據(jù)查詢條件,檢索結(jié)果

5)org.apache.lucene.queryParser:查詢分析器,根據(jù)關(guān)鍵詞及其相互關(guān)系,提供自定義檢索

6)org.apache.lucene.store:數(shù)據(jù)存儲管理,主要包括底層I/O操作

7)org.apache.lucene.util:提供一些工具類

1.2 與關(guān)系型數(shù)據(jù)庫的對比

一般來說,信息可分為結(jié)構(gòu)化信息和非結(jié)構(gòu)化信息。結(jié)構(gòu)化信息指的是具有固定格式和長度的信息;而非結(jié)構(gòu)化信息指的是不定長,無格式的信息。現(xiàn)實生活中,大部分信息都是非結(jié)構(gòu)化的,比如HTML頁面,電子郵件等。

關(guān)系型數(shù)據(jù)庫,如oracle,它們在處理結(jié)構(gòu)化信息時,有著高效快速的特點。但是在處理非結(jié)構(gòu)化信息時,由于結(jié)構(gòu)模型等原因的限制,往往力不從心。而Lucene就能夠處理這些非結(jié)構(gòu)化信息,它通過將這些文本數(shù)據(jù)解析成中間格式,再進(jìn)行索引查詢。

1.3 檢索實現(xiàn)機(jī)制

Lucene中有四個最基本的概念,分別是索引(index), 文檔(document), 域(field)和項(term)。它們是層層包含,層層遞進(jìn)的。通常,一個索引,包含一些序列的文檔;一個文檔,包含一些序列的域;一個域,包含一些序列的項;一個項,包含一些序列的最低層的字符。項是靜態(tài)存儲的,這樣就會使得搜索更方便,更有效率。

一般我們平時搜索文件,通常是以文件為單位,每個文件中又都記錄著每個字的位置信息,進(jìn)行關(guān)鍵字查找時,順序掃描每個文件,找到關(guān)鍵字在文檔中出現(xiàn)過幾次,在什么位置,從而確定我們所需要的文件,這是索引方式中的正向索引。而Lucene使用的是索引方式中的反向索引,是以關(guān)鍵字為單位進(jìn)行索引,找到這個關(guān)鍵字包含在幾個文件中,記錄出現(xiàn)的位置。反向索引機(jī)制的應(yīng)用,使Lucene的檢索效率更高。

1.4 中文分詞

分詞是文本挖掘的基礎(chǔ)與關(guān)鍵。由于語言的不同特點,英文文檔本身就是由一個個意思明確的英文單詞組成的,而對于中文文檔來說,是由一個個漢字組成的,漢字之間互相組合,又可能產(chǎn)生不同的語意。

所以,Lucene自帶的分詞器,對英文能夠進(jìn)行較為準(zhǔn)確的分詞,但在中文分詞方面效果并不理想。為了使系統(tǒng)能更好地進(jìn)行中文分詞,處理中文信息,本文采用了IKAnalyzer作為分詞器。

IKAnalyzer是一個開源的,基于Java開發(fā)的輕量級的中文分詞工具包,是結(jié)合詞典分詞和文法分析算法的中文分詞組件。它具有以下特點:1)支持中英文,數(shù)字混合分詞;2)具有高速處理能力;3)能自定義用戶字典;4)支持細(xì)粒度和智能分詞兩種切分模式。

2 手機(jī)信息檢索系統(tǒng)的實現(xiàn)

本系統(tǒng)采用的是 MyEclipse10 + Struts2 + Tomcat6 的開發(fā)環(huán)境。

2.1 構(gòu)建文本庫

圖2的數(shù)據(jù)是從中關(guān)村手機(jī)頻道中整理的手機(jī)部分信息,包括廠商,型號,處理器,系統(tǒng),內(nèi)存容量,屏幕尺寸,攝像頭最高像素,報價,特點等,組成以TAB分隔的tsv文件。

2.2 創(chuàng)建索引

一般全文檢索有兩個過程,創(chuàng)建索引和搜索索引。由此可見,索引是全文檢索引擎中的關(guān)鍵,只有建立了索引才能進(jìn)行全文檢索。Lucene采用了文檔(document)和域(field)來組織各種數(shù)據(jù)源。這里,我們可以把文檔(document)想象成一個新聞HTML頁面,把URL,新聞標(biāo)題,作者,發(fā)布時間,正文等組成部分看做域(field),再根據(jù)其他配置信息,進(jìn)行相應(yīng)處理,創(chuàng)建索引。

創(chuàng)建索引的過程如下:

1)創(chuàng)建IKAnalyzer中文分詞器對象,用來從文本中提取出索引項。

2)用IndexWriter類創(chuàng)建一個索引(index),之后為索引(index)添加文檔(document)。

3)創(chuàng)建Document類的實例,代表我們要索引的文檔(document),它是由一個或多個域(field)組成的。

4)將不同的域(field)加入到文檔(document)中。比如上文提到的一個新聞HTML頁面有多種信息,URL,新聞標(biāo)題,作者,發(fā)布時間,正文等,都可以域用來表示。

5)IndexWriter類對象調(diào)用addDocument方法將文檔(document)寫到索引(index)中。

6)提交保存索引文件。

下面是建立索引的關(guān)鍵代碼:

// 創(chuàng)建分詞器

analyzer = new IKAnalyzer(true);

// 根據(jù)指定的路徑創(chuàng)建索引庫,如果路徑不存在就會創(chuàng)建

directory = FSDirectory.open(new File(INDEX_PATH));

// 創(chuàng)建IndexWriter

IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_40, analyzer);

indexWriter = new IndexWriter(directory, config);

for (File file : fileList) {

// 讀取文件的內(nèi)容

List content = file2String(file);

// 創(chuàng)建Document對象

for (int i = 0; i < content.size(); i++) {

Document document = new Document();

//Store配置field字段是否存儲到索引庫

//YES:字段存儲到索引庫中

//No:不存儲到索引庫中

document.add(new TextField("contents", content.get(i), Store.YES));

// 通過IndexWriter將文檔添加到索引中

indexWriter.addDocument(document);

}

}

// 提交索引

indexWriter.commit();

2.3 搜索索引

Lucene建立了功能強(qiáng)大的索引機(jī)制為搜索服務(wù)。

搜索索引的過程如下:

1)使用DirectoryReader將磁盤上的文件夾中索引文件信息讀入到內(nèi)存。

2)使用IndexSearcher創(chuàng)建查詢對象,準(zhǔn)備進(jìn)行搜索。

3)創(chuàng)建IKAnalyzer對象用來對查詢語句進(jìn)行中文詞法分析和語言處理。

4)創(chuàng)建MultiFieldQueryParser對象用來對查詢語句進(jìn)行語法分析。

5)調(diào)用MultiFieldQueryParser對象的parser方法進(jìn)行語法分析,形成查詢語法樹,放到Query對象中。

6) 調(diào)用IndexSearcher對象的search方法,對查詢語法樹Query進(jìn)行搜索,得到查詢結(jié)果。

下面是進(jìn)行搜索的關(guān)鍵代碼:

//創(chuàng)建索引庫

directory = FSDirectory.open(new File(INDEX_PATH));

//創(chuàng)建分詞器

analyzer = new IKAnalyzer(true);

ireader = DirectoryReader.open(directory);

//創(chuàng)建查詢對象

IndexSearcher isearcher = new IndexSearcher(ireader);

//要查找的關(guān)鍵字字符串?dāng)?shù)組

String[] stringQuery= keywords;

//Occur.MUST表示對應(yīng)字段必須有查詢值, Occur.MUST_NOT 表示對應(yīng)字段必須沒有查詢值

String[] fields = new String[keywords.length];

Occur[] occ = new Occur[keywords.length];

//生成關(guān)鍵字與字段間的關(guān)系

for (int i = 0; i < fields.length; i++) {

fields[i] = "contents";

occ[i] = Occur.MUST;

}

//查找

Query query = MultiFieldQueryParser.parse(Version.LUCENE_40, stringQuery, fields, occ, analyzer);

//返回查到的數(shù)據(jù)

ScoreDoc[] hits = isearcher.search(query, 1000).scoreDocs;

2.4 系統(tǒng)演示

3 結(jié)論

Lucene全文檢索機(jī)制主要工作在搜索引擎的索引階段和檢索階段。文章對Lucene在這兩個階段的應(yīng)用做了初步的探討,實現(xiàn)了一個手機(jī)信息檢索系統(tǒng)的實例。可以看出,Lucene在搜索引擎領(lǐng)域的應(yīng)用有很大發(fā)展前景。

參考文獻(xiàn):

[1] 郎小偉,王申康. 基于Lucene的全文檢索系統(tǒng)研究與開發(fā) [J].計算機(jī)工程,2006,32(4):94-99.

[2] 管建和,甘劍峰. 基于Lucene全文檢索引擎的應(yīng)用研究與實現(xiàn) [J].計算機(jī)工程與設(shè)計,2007,1.28(2):489-491.

[3] 向暉,郭一平,王亮. 基于Lucene的中文字典分詞模塊的設(shè)計與實現(xiàn)[J].現(xiàn)代圖書情報技術(shù),2006(8):46-50.

[4] 朱小杰.Lucene教程[EB/OL].[2016-03-15].https://www.cnblogs.com/zhuxiaojie/p/5277219.html#autoid-5-1-0

[5] 一枚Sir. lucene4.7 索引文件(九)[EB/OL].[2014-04-11]. https://my.oschina.net/MrMichael/blog/220961.

[6] 車東. 在應(yīng)用中加入全文檢索功能—基于Java的全文索引引擎Lucene簡介[EB/OL].[2009.03.20]http://www.chedong.com/tech/lucene.html.

[7] 李剛,宋偉.征服Ajax+Lucene構(gòu)建搜索引擎 [M].北京:人民郵電出版社,2006:220-245.

[8] 文振威,秦曉.個性化搜索引擎的研究與設(shè)計[J].計算機(jī)工程與設(shè)計,2009,30(2):342-344.

猜你喜歡
全文檢索
基于Lucene的全文檢索的研究及實現(xiàn)
實名制校園安保服務(wù)平臺的設(shè)計與實現(xiàn)
基于MySQL的中文全文搜索研究
基于Lucene全文檢索技術(shù)的優(yōu)化探討
Oracle數(shù)據(jù)庫全文檢索性能研究
全文檢索引擎Lucene系統(tǒng)模型與應(yīng)用研究
全文檢索引擎技術(shù)在電子病歷中的應(yīng)用
基于云計算的知識管理系統(tǒng)
基于KySou的全文檢索系統(tǒng)的分析與優(yōu)化
特色數(shù)據(jù)庫全文檢索系統(tǒng)的設(shè)計
民勤县| 广汉市| 新和县| 玉门市| 石屏县| 昌图县| 孟连| 娄底市| 怀远县| 丹寨县| 西盟| 济阳县| 汽车| 龙海市| 通渭县| 格尔木市| 法库县| 新干县| 无为县| 文登市| 阿坝县| 万年县| 奉新县| 伽师县| 柳江县| 海伦市| 南投市| 三亚市| 平阳县| 循化| 宜都市| 九江市| 西贡区| 万年县| 宁南县| 台中县| 五寨县| 敦化市| 嘉义县| 和静县| 镇雄县|