田麗娜
(延邊職業(yè)技術(shù)學(xué)院,吉林 延吉 133000)
互聯(lián)網(wǎng)技術(shù)和信息數(shù)據(jù)的飛速增長,檢索有效信息要求高效地處理大量數(shù)據(jù),在這種背景下,搜索技術(shù)的出現(xiàn)是不可避免的。搜索引擎是為用戶方便進行網(wǎng)站瀏覽而提供的必要功能,同時也是研究網(wǎng)站用戶行為的有效工具。通過高效的網(wǎng)站搜索,用戶可以找到目的信息,并更有效地促進商品和服務(wù)的銷售。此外,基于對網(wǎng)站訪問者行為的透徹分析,制定更有效的在線營銷策略也很有用。因此,在大型信息網(wǎng)站和大型在線銷售網(wǎng)絡(luò)的網(wǎng)站上只提供全文檢索是不夠的,應(yīng)該開發(fā)高級搜索功能來提供個性化需求服務(wù)。
現(xiàn)階段搜索引擎包含了如AL、大數(shù)據(jù)、云計算等高新技術(shù)的應(yīng)用,通過文字檢索,使用分布式的搜索技術(shù),收集互聯(lián)網(wǎng)數(shù)以億計的文檔或網(wǎng)頁,而所需的查詢時間僅需幾秒甚至幾毫秒,智能化搜索已經(jīng)成為搜索引擎的一種發(fā)展方向[1]。
搜索引擎收集網(wǎng)絡(luò)站點的信息,處理收集到的數(shù)據(jù),并創(chuàng)建索引數(shù)據(jù)庫。然后,根據(jù)用戶通過輸入框輸入的查詢詞,搜索服務(wù)器對查詢詞進行文本分析,在索引數(shù)據(jù)庫中快速搜索文檔,評估搜索結(jié)果之間的關(guān)系,對搜索結(jié)果進行排序并將其返回給用戶,基本工作原理如圖1所示。
圖1 搜索引擎工作原理結(jié)構(gòu)
ElasticSearch是一個開源的基于Java語言開發(fā)的能實現(xiàn)實時、分布式、搜索和分析的搜索引擎框架。和數(shù)據(jù)庫相比,數(shù)據(jù)庫雖然也能做到實時、存儲、搜索和分析,但ElasticSearch最大的優(yōu)點是可以模糊查詢,是當(dāng)前商業(yè)程序當(dāng)中最流行的搜索框架之一[2]。如Githu、Wiki等都采用了ElasticSearch框架來實現(xiàn)搜索功能,所以ElasticSearch常用于實時搜索引擎。
ElasticSearch整體架構(gòu)分為以下幾部分:Gateway層、Distributed Lucene Directory層、Functional layer層、Discovery、Scripting、第三方插件、Transport,JMX、RESTful Style API[3]。
1.3.1 網(wǎng)絡(luò)爬蟲相關(guān)研究
網(wǎng)絡(luò)爬蟲是一種可以使用任何手段,批量地從網(wǎng)絡(luò)上收集信息數(shù)據(jù)的一種技術(shù),可以按照制定的規(guī)則去自動瀏覽網(wǎng)絡(luò)中的信息,而這些規(guī)則稱之為爬蟲算法。通常使用Python編寫爬蟲程序,進行網(wǎng)絡(luò)信息的爬取。本文使用的爬蟲主要由Requests、Beautifulsoup、Scrapy和Django模塊組成[4-6]。
1.3.2 網(wǎng)站的反爬蟲機制
反爬蟲即為阻止他人批量獲取自己網(wǎng)站數(shù)據(jù)的一種技術(shù)手段。
爬蟲的UA如果與普通瀏覽器不同,網(wǎng)站可以直接拒絕爬蟲的Request。HTTP定義了許多類型的請求頭,例如用戶UA、主機、推薦人等。通過偽造合理的HTTP請求頭,可以模擬用戶獲取數(shù)據(jù)[7]。
網(wǎng)頁通過識別IP來分辨用戶是否為爬蟲,在遇到短時間內(nèi)大量訪問的一個Cookies ID,則會彈出驗證碼,如果沒有多次輸入正確的驗證碼則將其判斷為爬蟲程序,并禁止其訪問。要解決此問題,可以通過抓取網(wǎng)上公開的IP建成IP池進行輪換,來獲取網(wǎng)站的數(shù)據(jù)[7]。
網(wǎng)頁利用前端頁面設(shè)置字體的方式,將網(wǎng)頁數(shù)據(jù)進行加密來實現(xiàn)反爬取。想要獲取其加密數(shù)據(jù),必須在網(wǎng)站加載的時候,獲取字體文件的動態(tài)訪問并下載字體,讀取加密后的文本內(nèi)容,將其中的自定義字體編碼解密為實際文本編碼,從而復(fù)原網(wǎng)頁的數(shù)據(jù)信息[7]。
Es默認(rèn)的分詞工具是英文分詞工具,對英文句子能夠進行分詞,但是對中文分詞效果不是很理想。隨著國內(nèi)的中文分詞技術(shù)逐漸完善,中文分詞工具也隨之優(yōu)化提升,比較著名的是Jieba分詞器、Hanlp等,本文使用Es的插件中文分詞工具,Ik分詞器。
Ik分詞器主要邏輯分為詞典、詞的匹配、消除歧義3個部分。詞典的優(yōu)劣直接影響著分詞的效果,Ik提供了常見詞匯的詞典,如:mian.dlc一些常見詞的詞典,quantidier.dlc一些常用的量詞詞典,stopword.dlc停用詞的詞典??梢愿鶕?jù)用戶的需求來選擇是否擴展這些詞典。
消息順序是當(dāng)來自分布式系統(tǒng)的消息被發(fā)送時存儲消息的容器,主要解決異步處理、打開應(yīng)用程序和減少事務(wù)的問題。許多消息有2種主要模式:對等(P2P)和過濾(pub-sub)。當(dāng)前使用較多的消息隊列主要為以下2種:RabbitMQ和Kafka[8]。
本文使用ElasticSearch為搜索引擎框架,分為3個模塊:索引模塊、搜索模塊以及詞典擴充模塊。Pycharm作為Python的集成開發(fā)工具[9];Django搭建Web服務(wù),運用ElasticSearch模塊獲取Es中的數(shù)據(jù),創(chuàng)建Mapping映射,使用高內(nèi)聚低耦合的3層架構(gòu)設(shè)計。界面層實現(xiàn)用戶和搜索引擎的交互,當(dāng)用戶在搜索引擎輸入框中輸入查詢詞時,將搜索結(jié)果展示。業(yè)務(wù)邏輯層由Django框架實現(xiàn)。創(chuàng)建了索引數(shù)據(jù)庫,完成對數(shù)據(jù)的預(yù)處理、中文分詞、更新索引庫等,搜索服務(wù)有搜索結(jié)果排序等功能;詞典匹配新詞的識別和中文分詞優(yōu)化。數(shù)據(jù)存儲層可以為系統(tǒng)提供存儲服務(wù),爬蟲爬取的信息存儲在數(shù)據(jù)庫中,根據(jù)業(yè)務(wù)需求,將搜索所需的數(shù)據(jù)同步到ElasticSearch索引庫[10]。本文系統(tǒng)架構(gòu)如圖2所示。
圖2 系統(tǒng)功能結(jié)構(gòu)
爬蟲必須收集網(wǎng)頁信息,對收集的數(shù)據(jù)進行預(yù)處理,為當(dāng)前的頁面獲取有用的信息和有用的URL,然后建立統(tǒng)一的數(shù)據(jù)存儲系統(tǒng)。不同的網(wǎng)站使用不同的技術(shù),需要逐頁分析。如有必要,可以使用XPath公式將相關(guān)字段與靜態(tài)頁面分離,以便于搜索Web數(shù)據(jù)。一些網(wǎng)站可以使用動態(tài)頁面技術(shù)來減少資源使用。此外,使用反爬蟲的網(wǎng)站也在增加。在實施爬蟲計劃之前,仔細(xì)分析目的地的技術(shù)資源,并應(yīng)用適當(dāng)?shù)呐老x控制策略,如可以創(chuàng)建查詢、使用Cookie或者以其他方式獲取數(shù)據(jù)。下一步是將爬蟲獲得的數(shù)據(jù)保存在數(shù)據(jù)庫中,以另一種方式將數(shù)據(jù)導(dǎo)入腳本通道,便于系統(tǒng)操作員訪問和管理數(shù)據(jù)。當(dāng)索引系統(tǒng)出現(xiàn)故障,可以恢復(fù)數(shù)據(jù)。爬蟲模塊是搜索引擎的重要組成部分,爬蟲信息的準(zhǔn)確性直接影響搜索引擎的性能,因此,需要手動選擇URL作為源站點。
從網(wǎng)頁中提取的數(shù)據(jù)是非結(jié)構(gòu)性的,不能檢索和排序,所以數(shù)據(jù)存儲是通過Scrapy的Item類來把他們進行轉(zhuǎn)換,使數(shù)據(jù)能夠像字典類型一樣進行檢索,如圖3所示。
圖3 信息提取流程
信息索引模塊定義映射,并將處理后的數(shù)據(jù)劃分為中文單詞來創(chuàng)建索引[11]。如果收集的數(shù)據(jù)以查詢模式存儲,則索引并顯示數(shù)據(jù)庫,然后合并索引以將數(shù)據(jù)實時輸入數(shù)據(jù)庫,形成一個完整的索引結(jié)構(gòu)。倒排索引是一種實現(xiàn)“word文檔”一致性的數(shù)據(jù)結(jié)構(gòu),也是搜索引擎中最重要的數(shù)據(jù)結(jié)構(gòu)之一。哈希表通過創(chuàng)建一個大數(shù)據(jù)表來存儲記錄,并使用哈希函數(shù)將每個記錄中的關(guān)鍵字與每個函數(shù)的值進行比較,以不同的方式解決數(shù)據(jù)沖突。本文使用索引方法是將倒排索引與網(wǎng)格表相結(jié)合的方法,當(dāng)用戶發(fā)送查詢時,先在哈希表中搜索關(guān)鍵字,然后在哈希索引中搜索指定的值。因此,可以根據(jù)哈希表關(guān)鍵字的值設(shè)置倒排索引。索引流程如圖4所示。
圖4 索引流程
用戶檢索模塊允許用戶訪問數(shù)據(jù)采集頁面,與系統(tǒng)用戶共享數(shù)據(jù),其主要功能是獲取和獲取推薦數(shù)據(jù)。本文檢索模塊主要使用了Django框架,不同的數(shù)據(jù)庫開發(fā)人員可以使用這些框架。輸入查詢時,基于語法的記錄會顯示在搜索框中,當(dāng)用戶選擇推薦時,搜索參數(shù)將移動到后臺Es中,當(dāng)輸入?yún)?shù)被接收時,索引服務(wù)器接收參數(shù)并以Jason格式返回結(jié)果并通知用戶。檢索功能流程如圖5所示。
圖5 檢索流程
(1)硬件環(huán)境:CPU 8核16線程,主頻2.4 GHz,內(nèi)存8 G,硬盤1 T。
(2)軟件環(huán)境:Win10,JDK17.0.1,ElasticSear ch 7.0.1。
功能測試也稱為黑盒測試,是測試系統(tǒng)的功能模塊,以確保實現(xiàn)功能結(jié)果。分析了搜索引擎的3個模塊的功能,包括索引模塊、搜索模塊和擴展模塊的功能。此搜索引擎包含用于更正錯誤和顯示查詢的模塊。然后介紹測試樣本,將預(yù)期結(jié)果與實際結(jié)果進行比較,完成搜索引擎功能測試。
(1)索引模塊主要通過同步索引和數(shù)據(jù)來實現(xiàn),使用head插件測試驗證索引創(chuàng)建和數(shù)據(jù)同步的準(zhǔn)確性。
(2)搜索引擎主要用于改進用戶輸入的搜索結(jié)果,并向用戶返回內(nèi)容。
在系統(tǒng)設(shè)計完成后,開發(fā)人員不僅要進行功能測試,還需要進行性能測試,保證程序能滿足用戶性能需求。本文使用壓力測試工具 ApacheBench 來進行壓力測試,該測試工具廣泛用于測試 Apache、Nginx、Lighttpd、Tomcat、IIS 等其他 Web 服務(wù)器的壓力。設(shè)置的參數(shù)為單次并發(fā)量1 000次,測試結(jié)果如表1所示。
表1 性能測試結(jié)果
開發(fā)人員通過垂直搜索引擎的測試環(huán)境和設(shè)計,然后對垂直搜索引擎的功能和錯誤進行了檢查,對功能測試的各個關(guān)鍵模塊進行了測試,達到了預(yù)期的結(jié)果。在性能方面,下載服務(wù)器驗證、索引生成和調(diào)用響應(yīng)時間這3個方面保證了所需的性能。
本文主要對基于ElasticSearch的搜索引擎的設(shè)計與實現(xiàn)進行了詳細(xì)的說明,介紹了搜索引擎的相關(guān)技術(shù),簡要分析了其原理,闡述了爬蟲的基本知識、Scrapy 框架以及 Django 框架等理論知識,并詳細(xì)介紹了常用的中文分詞方法和消息隊列,完成了基于ElasticSearch分布式搜索引擎的設(shè)計與實現(xiàn)。筆者根據(jù)系統(tǒng)的設(shè)計目標(biāo)與思路,對搜索引擎進行了各種需求分析,完成了總體架構(gòu)、模塊功能劃分和詳細(xì)設(shè)計,實現(xiàn)了一個基于ElasticSearch的垂直搜索引擎;對搜索引擎各個功能模塊進行測試,確保各功能實現(xiàn)模塊的完整。測試結(jié)果表明,基于ElasticSearch的搜索引擎在功能上可以滿足用戶的需求。