專(zhuān)利名稱(chēng):基于Hadoop的分布式搜索引擎構(gòu)建方法
基于Hadoop的分布式搜索引擎構(gòu)建方法技術(shù)領(lǐng)域
本發(fā)明屬于海量數(shù)據(jù)處理技術(shù)領(lǐng)域,具體涉及一種基于Hadoop的分布式搜索引擎構(gòu)建方法。
背景技術(shù):
隨著互聯(lián)網(wǎng)的迅猛發(fā)展,人們已經(jīng)越來(lái)越依賴(lài)網(wǎng)絡(luò)來(lái)獲取信息,搜索引擎的出現(xiàn)在人們與海量網(wǎng)絡(luò)信息之間架起了一道橋梁。然而,隨著網(wǎng)絡(luò)用戶(hù)的激增和網(wǎng)絡(luò)信息呈指數(shù)性增長(zhǎng),網(wǎng)絡(luò)流量急增,傳統(tǒng)的集中式搜索引擎出現(xiàn)了瓶頸。以Internet上產(chǎn)生的數(shù)據(jù)為例,在Facebook公司,每天處理的新數(shù)據(jù)量超過(guò)20TB,隨著Facebook用戶(hù)的不斷增加以后要處理的數(shù)據(jù)會(huì)變的更加龐大。面對(duì)著如此海量傳統(tǒng)的存儲(chǔ)數(shù)據(jù),分布式存儲(chǔ)正是為解決這些問(wèn)題。
Google在這方面的研究處于領(lǐng)先地位,在Google的發(fā)展過(guò)程中,用戶(hù)的搜索需求是與日俱增的,Google不是靠購(gòu)買(mǎi)大量昂貴的服務(wù)器資源滿(mǎn)足大量的搜索需求,而是根據(jù)需求量來(lái)添加。Google使用自己的分布式存儲(chǔ)文件系統(tǒng)GFS,MapR-eduCe以及BigTable分布式數(shù)據(jù)庫(kù),只需要廉價(jià)的IinuxPC機(jī)組成集群就能處理各種用戶(hù)需求。
傳統(tǒng)的搜索引擎采用的索引表是通過(guò)Lucene (全文檢索引擎工具包)建立的。由于Lucene建立索引表時(shí)不支持集群環(huán)境,所以對(duì)大量文本建立索引將變得非常耗費(fèi)時(shí)間。 Hadoop是一個(gè)高效、可靠和可擴(kuò)展的開(kāi)源分布式計(jì)算平臺(tái),能非常高效分布式處理海量數(shù)據(jù)。隨著數(shù)據(jù)量的增加,Hadoop集群相比于單機(jī),其節(jié)省的時(shí)間量越來(lái)越大。本發(fā)明因此而來(lái)。發(fā)明內(nèi)容
本發(fā)明目的在于提供一種基于Hadoop的分布式搜索引擎構(gòu)建方法,解決了現(xiàn)有技術(shù)中海量數(shù)據(jù)進(jìn)行搜索時(shí),會(huì)耗費(fèi)大量的時(shí)間等問(wèn)題。
為了解決現(xiàn)有技術(shù)中的這些問(wèn)題,本發(fā)明提供的技術(shù)方案是
一種基于Hadoop的分布式搜索引擎構(gòu)建方法,其特征在于所述方法包括以下步驟
(I)通過(guò)Lucene分詞處理本地海量文件,形成文件塊;
(2)通過(guò)Map-Reduce進(jìn)行數(shù)據(jù)分解處理,獲得key=關(guān)鍵字和value=文件名的輸出鍵值對(duì)〈key,value〉,構(gòu)建關(guān)鍵字和文件名列表相關(guān)的索引文件;
(3)將關(guān)鍵字和文件名列表相關(guān)的索引文件存儲(chǔ)到HBase數(shù)據(jù)庫(kù)中。
優(yōu)選的,所述方法具體按照如下步驟進(jìn)行
(I)通過(guò)Lucene分詞處理本地海量文件,將逐行讀取文件塊并將行號(hào)及該行內(nèi)容映射為初始鍵值輸入,采用Map函數(shù)對(duì)鍵值部分進(jìn)行分離處理,提取關(guān)鍵字、文件絕對(duì)路徑,形成中間鍵值對(duì)〈key, value〉;
分離處理在Map函數(shù)處理中3
Map 函數(shù)提供四個(gè)形參分別為 keyl, valuel, key2, value2。其中(keyl, valuel) 作為map的輸入?yún)?shù),而(key2, value2)對(duì)應(yīng)map的輸出參數(shù),也是Reduce函數(shù)的輸入?yún)?shù)(key2, value2)。
作為Map的輸入?yún)?shù),(I) keyl對(duì)應(yīng)的文件內(nèi)容每行行號(hào)偏移量的輸入但不做處理,把文件內(nèi)容進(jìn)行分詞后形成的關(guān)鍵字詞直接作為Map輸出參數(shù)key2,(2) value對(duì)應(yīng)文件的內(nèi)容找出其對(duì)應(yīng)文件的絕對(duì)路徑,作為Map的輸出參數(shù)value2 ;(3)將Map輸出參數(shù) (key2, value2),組成中間鍵值對(duì)〈key, value)作為 Reduce 的輸入?yún)?shù)(key2, value2)。
分詞就是指將一個(gè)完整的句子劃分成一個(gè)個(gè)詞條(Token)的過(guò)程。盡管每種語(yǔ)言都要進(jìn)行分詞,但是英文可以利用空格作為天然的分隔符。然而對(duì)于中文來(lái)說(shuō),分詞的情況要復(fù)雜得多。
中文分詞在中文搜索引擎領(lǐng)域極其重要。基于字符串匹配的分詞方法是將待分析的漢字串與詞典進(jìn)行匹配,若匹配成功,則分出一個(gè)詞。假設(shè)有如下文檔docl (中國(guó)在亞洲)doc2 (心中有夢(mèng)想)doc3 (中國(guó)很強(qiáng)大)doc4 (中國(guó)在發(fā)展),使用非單字分詞來(lái)建立索引。當(dāng)用戶(hù)輸入“中國(guó)”作為查詢(xún)?cè)~時(shí),對(duì)于非單字分詞將經(jīng)歷以下過(guò)程(I)進(jìn)行字符串與詞典詞語(yǔ)進(jìn)行匹配可以得出,“中國(guó)”,“夢(mèng)想”,“亞洲”,“發(fā)展”,“強(qiáng)大”等詞語(yǔ)。(2)查索引表得包含“中國(guó)”詞的文檔集合為A (docUdoc3,doc4)0 (3)直接就可以得出中國(guó)對(duì)應(yīng)文檔集合為 A (docl、doc3、doc4)。
分詞效果還影響到查詢(xún)結(jié)果和用戶(hù)的期望的匹配程度,可以通過(guò)基于字符串匹配,機(jī)器模擬人對(duì)語(yǔ)言的理解,以及統(tǒng)計(jì)的分詞方法進(jìn)行結(jié)合,相互補(bǔ)充的“復(fù)合分詞法”。
(2)采用reduce函數(shù)讀取文件的絕對(duì)路徑,從中分離出文件名作為鍵值(value), 合并具有相同關(guān)鍵字(key)的鍵值對(duì),統(tǒng)計(jì)關(guān)鍵字在與其對(duì)應(yīng)的文件中出現(xiàn)的次數(shù),和文件名一起作為值(value)迭代輸出;進(jìn)行相同關(guān)鍵字合并后,其結(jié)果作為Reduce操作的輸出鍵值對(duì)〈key, value〉;
在reduce階段,reduce函數(shù)接收到所有映射到map輸出后,先調(diào)用job. setSortComparatorClass設(shè)置的key比較函數(shù)類(lèi)對(duì)所有數(shù)據(jù)對(duì)排序。然后開(kāi)始構(gòu)造一個(gè) key對(duì)應(yīng)的value迭代器。這時(shí)就要用到分組,使用jobjob. setGroupingComparatorClass 設(shè)置的分組函數(shù)類(lèi)。只要這個(gè)比較器比較的兩個(gè)key相同,他們就屬于同一個(gè)組,它們的 value放在一個(gè)value迭代器,而這個(gè)迭代器的key使用屬于同一個(gè)組的所有key的第一個(gè) key ο以及對(duì)應(yīng)的value為迭代器所有key對(duì)的value值,作為Reduce操作的輸出鍵值對(duì) 〈key,value>。
(3)經(jīng)過(guò)MapReduce建立的索引文件存儲(chǔ)到HBase中,其中Row Key存儲(chǔ)的是查詢(xún)關(guān)鍵字,value存儲(chǔ)的是文件名,關(guān)鍵字在文件中出現(xiàn)的次數(shù)統(tǒng)計(jì)以及文件內(nèi)容屬性。
HBase以表的形式存放數(shù)據(jù),每個(gè)表由行和列組成,每個(gè)列屬于一個(gè)特定的列族。 表中Row Key是用來(lái)檢索記錄的主鍵,由行和列確定的存儲(chǔ)單元成為一個(gè)元素,每個(gè)元素保存了同一份數(shù)據(jù)的多個(gè)版本,由時(shí)間戳來(lái)標(biāo)識(shí)。HBase在磁盤(pán)上按照列族存儲(chǔ)數(shù)據(jù),一個(gè)列族里的所有項(xiàng)目有相同讀/寫(xiě)方式,HBase的更新操作都對(duì)應(yīng)一個(gè)時(shí)間戳,對(duì)每個(gè)數(shù)據(jù)單元,只存儲(chǔ)指定個(gè)數(shù)的最新版本。查詢(xún)時(shí)由{Row Key,列族,版本}唯一確定的單元,里面的數(shù)據(jù)是沒(méi)有類(lèi)型的,全部是字節(jié)碼形式存貯。
具體的步驟是將海量文件通過(guò)Lucene分詞技術(shù)后直接上傳到HDFS,默認(rèn)將逐行讀取文檔文件塊(默認(rèn)大小為64MB)并將行號(hào)及該行內(nèi)容映射為初始鍵值(value)輸入, Map函數(shù)將對(duì)值部分進(jìn)行分離處理,提取出關(guān)鍵字,文件絕對(duì)路徑,形成中間鍵值對(duì)〈key, value>。
reduce函數(shù)讀取絕對(duì)路徑,從中分離出文件名作為值(value),再自動(dòng)合并具有相同關(guān)鍵字(key)的鍵值對(duì),與關(guān)鍵字對(duì)應(yīng)的分離出的文件名被封裝在迭代器中,統(tǒng)計(jì)關(guān)鍵字在與其對(duì)應(yīng)的文件中出現(xiàn)的次數(shù),和文件名一起作為值(value)輸出。進(jìn)行相同關(guān)鍵字合并后,其結(jié)果作為Reduce操作的輸出鍵值對(duì)〈key,value〉,存儲(chǔ)到HDFS上。
Reduce操作的輸出鍵值對(duì)〈key,value)數(shù)據(jù)輸出,以文件的形式儲(chǔ)存在HDFS分布式文件系統(tǒng)中。等待進(jìn)一步Reduce函數(shù)的去重處理,最后將MapReduce建立形成的索引文件再存儲(chǔ)到HBase中。
在Reduce函數(shù)中,只需將重復(fù)查詢(xún)?cè)~過(guò)濾便完成數(shù)據(jù)去重處理。如需對(duì)數(shù)據(jù)進(jìn)一步處理,可將Reduce函數(shù)的輸出鍵值對(duì)作為下個(gè)操作的初始輸入數(shù)據(jù)。經(jīng)過(guò)MapReduce建立的索引文件存儲(chǔ)到HBase中,其中Row Key存儲(chǔ)的是查詢(xún)關(guān)鍵字,value存儲(chǔ)的是文件名, 關(guān)鍵字在文件次數(shù)統(tǒng)計(jì)以及文件內(nèi)容屬性。
本發(fā)明技術(shù)方案從海量數(shù)據(jù)的特點(diǎn)出發(fā),通過(guò)采用Map Reduce分布式計(jì)算模型和Iucene的相關(guān)技術(shù)建立索引文件,存儲(chǔ)到HDFS和Hbase中,通過(guò)索引關(guān)鍵字在Hbase中查詢(xún),可實(shí)現(xiàn)快速檢索出關(guān)鍵字所在的文件名,內(nèi)容以及關(guān)鍵字在文件中出現(xiàn)的次數(shù)統(tǒng)計(jì)。 充分利用Hadoop分布式集群拓?fù)涮匦裕瑢?shí)現(xiàn)了搜索引擎的分布式處理、高可靠性和易擴(kuò)展性。
本發(fā)明技術(shù)方案基于Lucene在海量文件中建立索引的非常費(fèi)時(shí)的特點(diǎn),提出了基于Hadoop分布式,利用Map/Reduce技術(shù)快速建立索引表,存儲(chǔ)在hbase中進(jìn)行高效快速搜索查詢(xún)的方法。通過(guò)關(guān)鍵字在HBase中查詢(xún),可以非常高效得出查詢(xún)結(jié)果以及通過(guò) Lucene在HDFS上進(jìn)行高效搜索查詢(xún)。
本發(fā)明與現(xiàn)有技術(shù)相比,具有如下的有益效果
本發(fā)明技術(shù)方案與現(xiàn)有技術(shù)中集中式搜索方法相比,當(dāng)單服務(wù)器處理搜索請(qǐng)求時(shí),索引文件在1G-3G時(shí)Lucene查詢(xún)時(shí)間成指數(shù)增長(zhǎng)出現(xiàn)瓶頸。采用本發(fā)明的技術(shù)方案, 將海量數(shù)據(jù)文件結(jié)合MapReduce編程模式后,雖然數(shù)據(jù)量小的時(shí)候MapReduce的分布式搜索系統(tǒng)優(yōu)勢(shì)不是很明顯,當(dāng)隨著數(shù)據(jù)量的不斷增大,系統(tǒng)效率提高了約60%。因此可以得出 MapReduce分布式搜索在處理大數(shù)據(jù)上,非常高效,解決了 Lucene數(shù)據(jù)量大的瓶頸,而且還提高了搜索響應(yīng)效率。
下面結(jié)合附圖及實(shí)施例對(duì)本發(fā)明作進(jìn)一步描述
圖I為本發(fā)明技術(shù)方案中MapReduce進(jìn)行數(shù)據(jù)分解的方法流程圖。
圖2為本發(fā)明技術(shù)方案與集中式搜索方法的效果比較圖。
具體實(shí)施方式
以下結(jié)合具體實(shí)施例對(duì)上述方案做進(jìn)一步說(shuō)明。應(yīng)理解,這些實(shí)施例是用于說(shuō)明本發(fā)明而不限于限制本發(fā)明的范圍。實(shí)施例中采用的實(shí)施條件可以根據(jù)具體廠(chǎng)家的條件做進(jìn)一步調(diào)整,未注明的實(shí)施條件通常為常規(guī)實(shí)驗(yàn)中的條件。
實(shí)施例
如圖I所示,本方法實(shí)施時(shí)可分為以下A、B、C三個(gè)部分
A.索引文件的建立
本實(shí)施例利用開(kāi)源的全文檢索開(kāi)發(fā)包Lucene實(shí)現(xiàn)索引的建立及查詢(xún)。隨著索引文件的不斷增大到一定程度時(shí),利用Lucene. search搜索時(shí),搜索效率出現(xiàn)嚴(yán)重的瓶頸。通過(guò)本地海量文件由Lucene. analysis分詞,并最終由lucene. index建立索引文件。
類(lèi)似的實(shí)現(xiàn)部分代碼如下(數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì))
writer=newIndex Wr iter (FS Di rectory, op en(newFile(Constants.INDEX STORE PATH)), new IKAna!yzer() , true, IndexWriter.MaxFieldLength.LIMITED);//初始化寫(xiě)索引操作,指定存儲(chǔ)索引目錄,指定分詞器.String) j files = folder,Iist();for (int = 0; i < files.length; i++) {File file = new File(folder, files[i|); Document dot = getDocument(fiie): //getDocument 添加索引內(nèi)容函數(shù)writer.addDocument(doc); // 添加索引文件
B、通過(guò)MapReduce數(shù)據(jù)處理
通過(guò)Reduce函數(shù)處理的數(shù)據(jù)集中含有大量重復(fù)記錄,比如“你好fl: 1”,“你好 f2:2”,“你好f3:4”。以上3條記錄表示用戶(hù)連續(xù)查詢(xún)了結(jié)果集的3條記錄,記錄包括關(guān)鍵字對(duì)應(yīng)的文件名已經(jīng)關(guān)鍵字在文件中出現(xiàn)的次數(shù)。但在統(tǒng)計(jì)分析時(shí)只能看作一次查詢(xún),需去除重復(fù)數(shù)據(jù)。采用MapReduce并行計(jì)算模型的數(shù)據(jù)去重流程如圖2所示。
步驟如下
(I)將海量文件通過(guò)Lucene分詞技術(shù)后直接上傳到HDFS,默認(rèn)將逐行讀取文檔文件塊(默認(rèn)大小為64MB)并將行號(hào)及該行內(nèi)容映射為初始鍵值(value)輸入,Map函數(shù)將對(duì)值部分進(jìn)行分離處理,提取出關(guān)鍵字,文件絕對(duì)路徑,形成中間鍵值對(duì)〈key,value〉。
(2) reduce函數(shù)讀取絕對(duì)路徑,從中分離出文件名作為值(value),再自動(dòng)合并具有相同關(guān)鍵字(key)的鍵值對(duì),與關(guān)鍵字對(duì)應(yīng)的分離出的文件名被封裝在迭代器中,統(tǒng)計(jì)關(guān)鍵字在與其對(duì)應(yīng)的文件中出現(xiàn)的次數(shù),和文件名一起作為值(value)輸出。進(jìn)行相同關(guān)鍵字合并后,其結(jié)果作為Reduce操作的輸出鍵值對(duì)〈key,value〉,存儲(chǔ)到HDFS上。
(3)在Reduce函數(shù)中,只需將重復(fù)查詢(xún)?cè)~過(guò)濾便完成數(shù)據(jù)去重處理。如需對(duì)數(shù)據(jù)進(jìn)一步處理,可將Reduce函數(shù)的輸出鍵值對(duì)作為下個(gè)操作的初始輸入數(shù)據(jù)。
(4M^lMapReduce建立的索引文件存儲(chǔ)到HBase中,其中Row Key存儲(chǔ)的是查詢(xún)關(guān)鍵字,value存儲(chǔ)的是文件名,關(guān)鍵字在文件次數(shù)統(tǒng)計(jì)以及文件內(nèi)容屬性。
(5)通過(guò)關(guān)鍵字在HBase中查詢(xún),可以非常高效得出查詢(xún)結(jié)果?;蛘哂蒐ucene在 HDFS上進(jìn)行高效搜索查詢(xún)。
進(jìn)行數(shù)據(jù)處理的部分代碼如下
權(quán)利要求
1.一種基于Hadoop的分布式搜索引擎構(gòu)建方法,其特征在于所述方法包括以下步驟(1)通過(guò)Lucene分詞處理本地海量文件,形成文件塊;(2)通過(guò)Map-Reduce進(jìn)行數(shù)據(jù)分解處理,獲得key=關(guān)鍵字和value=文件名的輸出鍵值對(duì)〈key,value〉,構(gòu)建關(guān)鍵字和文件名列表相關(guān)的索引文件;(3)將關(guān)鍵字和文件名列表相關(guān)的索引文件存儲(chǔ)到HBase數(shù)據(jù)庫(kù)中。
2.根據(jù)權(quán)利要求I所述的方法,其特征在于所述方法具體按照如下步驟進(jìn)行(1)通過(guò)Lucene分詞處理本地海量文件,將逐行讀取文件塊并將行號(hào)及該行內(nèi)容映射為初始鍵值輸入,采用Map函數(shù)對(duì)鍵值部分進(jìn)行分離處理,提取關(guān)鍵字、文件絕對(duì)路徑,形成中間鍵值對(duì)〈key, value〉;(2)采用reduce函數(shù)讀取文件的絕對(duì)路徑,從中分離出文件名作為鍵值(value),合并具有相同關(guān)鍵字(key)的鍵值對(duì),統(tǒng)計(jì)關(guān)鍵字在與其對(duì)應(yīng)的文件中出現(xiàn)的次數(shù),和文件名一起作為值(value)迭代輸出;進(jìn)行相同關(guān)鍵字合并后,其結(jié)果作為Reduce操作的輸出鍵值對(duì)〈key, value);(3)經(jīng)過(guò)MapReduce建立的索引文件存儲(chǔ)到HBase中,其中RowKey存儲(chǔ)的是查詢(xún)關(guān)鍵字,value存儲(chǔ)的是文件名,關(guān)鍵字在文件中出現(xiàn)的次數(shù)統(tǒng)計(jì)以及文件內(nèi)容屬性。
全文摘要
本發(fā)明公開(kāi)了一種基于Hadoop的分布式搜索引擎構(gòu)建方法,其特征在于所述方法包括以下步驟(1)通過(guò)Lucene分詞處理本地海量文件,形成文件塊;(2)通過(guò)Map-Reduce進(jìn)行數(shù)據(jù)分解處理,獲得key=關(guān)鍵字和value=文件名的輸出鍵值對(duì)<key,value>,構(gòu)建關(guān)鍵字和文件名列表相關(guān)的索引文件;(3)將關(guān)鍵字和文件名列表相關(guān)的索引文件存儲(chǔ)到HBase數(shù)據(jù)庫(kù)中。該方法解決了Lucene數(shù)據(jù)量大的瓶頸,而且還提高了搜索響應(yīng)效率。
文檔編號(hào)G06F17/30GK102915365SQ20121040875
公開(kāi)日2013年2月6日 申請(qǐng)日期2012年10月24日 優(yōu)先權(quán)日2012年10月24日
發(fā)明者陳國(guó)慶, 楊浩 申請(qǐng)人:蘇州兩江科技有限公司