田麗娜
(延邊職業技術學院,吉林 延吉 133000)
互聯網技術和信息數據的飛速增長,檢索有效信息要求高效地處理大量數據,在這種背景下,搜索技術的出現是不可避免的。搜索引擎是為用戶方便進行網站瀏覽而提供的必要功能,同時也是研究網站用戶行為的有效工具。通過高效的網站搜索,用戶可以找到目的信息,并更有效地促進商品和服務的銷售。此外,基于對網站訪問者行為的透徹分析,制定更有效的在線營銷策略也很有用。因此,在大型信息網站和大型在線銷售網絡的網站上只提供全文檢索是不夠的,應該開發高級搜索功能來提供個性化需求服務。
現階段搜索引擎包含了如AL、大數據、云計算等高新技術的應用,通過文字檢索,使用分布式的搜索技術,收集互聯網數以億計的文檔或網頁,而所需的查詢時間僅需幾秒甚至幾毫秒,智能化搜索已經成為搜索引擎的一種發展方向[1]。
搜索引擎收集網絡站點的信息,處理收集到的數據,并創建索引數據庫。然后,根據用戶通過輸入框輸入的查詢詞,搜索服務器對查詢詞進行文本分析,在索引數據庫中快速搜索文檔,評估搜索結果之間的關系,對搜索結果進行排序并將其返回給用戶,基本工作原理如圖1所示。

圖1 搜索引擎工作原理結構
ElasticSearch是一個開源的基于Java語言開發的能實現實時、分布式、搜索和分析的搜索引擎框架。和數據庫相比,數據庫雖然也能做到實時、存儲、搜索和分析,但ElasticSearch最大的優點是可以模糊查詢,是當前商業程序當中最流行的搜索框架之一[2]。如Githu、Wiki等都采用了ElasticSearch框架來實現搜索功能,所以ElasticSearch常用于實時搜索引擎。
ElasticSearch整體架構分為以下幾部分:Gateway層、Distributed Lucene Directory層、Functional layer層、Discovery、Scripting、第三方插件、Transport,JMX、RESTful Style API[3]。
1.3.1 網絡爬蟲相關研究
網絡爬蟲是一種可以使用任何手段,批量地從網絡上收集信息數據的一種技術,可以按照制定的規則去自動瀏覽網絡中的信息,而這些規則稱之為爬蟲算法。通常使用Python編寫爬蟲程序,進行網絡信息的爬取。本文使用的爬蟲主要由Requests、Beautifulsoup、Scrapy和Django模塊組成[4-6]。
1.3.2 網站的反爬蟲機制
反爬蟲即為阻止他人批量獲取自己網站數據的一種技術手段。
爬蟲的UA如果與普通瀏覽器不同,網站可以直接拒絕爬蟲的Request。HTTP定義了許多類型的請求頭,例如用戶UA、主機、推薦人等。通過偽造合理的HTTP請求頭,可以模擬用戶獲取數據[7]。
網頁通過識別IP來分辨用戶是否為爬蟲,在遇到短時間內大量訪問的一個Cookies ID,則會彈出驗證碼,如果沒有多次輸入正確的驗證碼則將其判斷為爬蟲程序,并禁止其訪問。要解決此問題,可以通過抓取網上公開的IP建成IP池進行輪換,來獲取網站的數據[7]。
網頁利用前端頁面設置字體的方式,將網頁數據進行加密來實現反爬取。想要獲取其加密數據,必須在網站加載的時候,獲取字體文件的動態訪問并下載字體,讀取加密后的文本內容,將其中的自定義字體編碼解密為實際文本編碼,從而復原網頁的數據信息[7]。
Es默認的分詞工具是英文分詞工具,對英文句子能夠進行分詞,但是對中文分詞效果不是很理想。隨著國內的中文分詞技術逐漸完善,中文分詞工具也隨之優化提升,比較著名的是Jieba分詞器、Hanlp等,本文使用Es的插件中文分詞工具,Ik分詞器。
Ik分詞器主要邏輯分為詞典、詞的匹配、消除歧義3個部分。詞典的優劣直接影響著分詞的效果,Ik提供了常見詞匯的詞典,如:mian.dlc一些常見詞的詞典,quantidier.dlc一些常用的量詞詞典,stopword.dlc停用詞的詞典。可以根據用戶的需求來選擇是否擴展這些詞典。
消息順序是當來自分布式系統的消息被發送時存儲消息的容器,主要解決異步處理、打開應用程序和減少事務的問題。許多消息有2種主要模式:對等(P2P)和過濾(pub-sub)。當前使用較多的消息隊列主要為以下2種:RabbitMQ和Kafka[8]。
本文使用ElasticSearch為搜索引擎框架,分為3個模塊:索引模塊、搜索模塊以及詞典擴充模塊。Pycharm作為Python的集成開發工具[9];Django搭建Web服務,運用ElasticSearch模塊獲取Es中的數據,創建Mapping映射,使用高內聚低耦合的3層架構設計。界面層實現用戶和搜索引擎的交互,當用戶在搜索引擎輸入框中輸入查詢詞時,將搜索結果展示。業務邏輯層由Django框架實現。創建了索引數據庫,完成對數據的預處理、中文分詞、更新索引庫等,搜索服務有搜索結果排序等功能;詞典匹配新詞的識別和中文分詞優化。數據存儲層可以為系統提供存儲服務,爬蟲爬取的信息存儲在數據庫中,根據業務需求,將搜索所需的數據同步到ElasticSearch索引庫[10]。本文系統架構如圖2所示。

圖2 系統功能結構
爬蟲必須收集網頁信息,對收集的數據進行預處理,為當前的頁面獲取有用的信息和有用的URL,然后建立統一的數據存儲系統。不同的網站使用不同的技術,需要逐頁分析。如有必要,可以使用XPath公式將相關字段與靜態頁面分離,以便于搜索Web數據。一些網站可以使用動態頁面技術來減少資源使用。此外,使用反爬蟲的網站也在增加。在實施爬蟲計劃之前,仔細分析目的地的技術資源,并應用適當的爬蟲控制策略,如可以創建查詢、使用Cookie或者以其他方式獲取數據。下一步是將爬蟲獲得的數據保存在數據庫中,以另一種方式將數據導入腳本通道,便于系統操作員訪問和管理數據。當索引系統出現故障,可以恢復數據。爬蟲模塊是搜索引擎的重要組成部分,爬蟲信息的準確性直接影響搜索引擎的性能,因此,需要手動選擇URL作為源站點。
從網頁中提取的數據是非結構性的,不能檢索和排序,所以數據存儲是通過Scrapy的Item類來把他們進行轉換,使數據能夠像字典類型一樣進行檢索,如圖3所示。

圖3 信息提取流程
信息索引模塊定義映射,并將處理后的數據劃分為中文單詞來創建索引[11]。如果收集的數據以查詢模式存儲,則索引并顯示數據庫,然后合并索引以將數據實時輸入數據庫,形成一個完整的索引結構。倒排索引是一種實現“word文檔”一致性的數據結構,也是搜索引擎中最重要的數據結構之一。哈希表通過創建一個大數據表來存儲記錄,并使用哈希函數將每個記錄中的關鍵字與每個函數的值進行比較,以不同的方式解決數據沖突。本文使用索引方法是將倒排索引與網格表相結合的方法,當用戶發送查詢時,先在哈希表中搜索關鍵字,然后在哈希索引中搜索指定的值。因此,可以根據哈希表關鍵字的值設置倒排索引。索引流程如圖4所示。

圖4 索引流程
用戶檢索模塊允許用戶訪問數據采集頁面,與系統用戶共享數據,其主要功能是獲取和獲取推薦數據。本文檢索模塊主要使用了Django框架,不同的數據庫開發人員可以使用這些框架。輸入查詢時,基于語法的記錄會顯示在搜索框中,當用戶選擇推薦時,搜索參數將移動到后臺Es中,當輸入參數被接收時,索引服務器接收參數并以Jason格式返回結果并通知用戶。檢索功能流程如圖5所示。

圖5 檢索流程
(1)硬件環境:CPU 8核16線程,主頻2.4 GHz,內存8 G,硬盤1 T。
(2)軟件環境:Win10,JDK17.0.1,ElasticSear ch 7.0.1。
功能測試也稱為黑盒測試,是測試系統的功能模塊,以確保實現功能結果。分析了搜索引擎的3個模塊的功能,包括索引模塊、搜索模塊和擴展模塊的功能。此搜索引擎包含用于更正錯誤和顯示查詢的模塊。然后介紹測試樣本,將預期結果與實際結果進行比較,完成搜索引擎功能測試。
(1)索引模塊主要通過同步索引和數據來實現,使用head插件測試驗證索引創建和數據同步的準確性。
(2)搜索引擎主要用于改進用戶輸入的搜索結果,并向用戶返回內容。
在系統設計完成后,開發人員不僅要進行功能測試,還需要進行性能測試,保證程序能滿足用戶性能需求。本文使用壓力測試工具 ApacheBench 來進行壓力測試,該測試工具廣泛用于測試 Apache、Nginx、Lighttpd、Tomcat、IIS 等其他 Web 服務器的壓力。設置的參數為單次并發量1 000次,測試結果如表1所示。

表1 性能測試結果
開發人員通過垂直搜索引擎的測試環境和設計,然后對垂直搜索引擎的功能和錯誤進行了檢查,對功能測試的各個關鍵模塊進行了測試,達到了預期的結果。在性能方面,下載服務器驗證、索引生成和調用響應時間這3個方面保證了所需的性能。
本文主要對基于ElasticSearch的搜索引擎的設計與實現進行了詳細的說明,介紹了搜索引擎的相關技術,簡要分析了其原理,闡述了爬蟲的基本知識、Scrapy 框架以及 Django 框架等理論知識,并詳細介紹了常用的中文分詞方法和消息隊列,完成了基于ElasticSearch分布式搜索引擎的設計與實現。筆者根據系統的設計目標與思路,對搜索引擎進行了各種需求分析,完成了總體架構、模塊功能劃分和詳細設計,實現了一個基于ElasticSearch的垂直搜索引擎;對搜索引擎各個功能模塊進行測試,確保各功能實現模塊的完整。測試結果表明,基于ElasticSearch的搜索引擎在功能上可以滿足用戶的需求。