欽蔣承,沈宏良
(湖州師范學院,湖州313000)
在目前的國內高校中,隨著數字校園的工作不斷推進,無紙化辦公的理念不斷深化,校園網絡中的各種新聞資訊、文檔、多媒體等數字資源呈現出爆發式的增長。這些數字資源能夠為師生的日常工作和學習提供有效幫助,但面對體量龐大的校園數字資源,使用人工查詢的方式無法快速的定位到所需資源所在的具體位置,而通用的搜索引擎例如百度、谷歌搜索很難對一個域內的資源進行精準全面的搜索,非常不利于校內用戶的搜索體驗;同時,這些校內的信息資源分布在不同的服務器和存儲中,無法通過集中管理來有效分析利用這些信息資源,從而無法獲取數據背后的價值和知識。也就產生了所謂“數據富裕而信息貧瘠”的尷尬局面[1]。因此,有必要根據高校的校園網特色和本校用戶的搜索需求來定制一套全面、高效、精準且易用的搜索平臺。
針對當前現狀,本文基于對新型分布式數據管理和檢索核心ES 的研究學習,利用其強大的分布式數據管理能力和高效的實時文件存儲和索引機制,建立校內全文搜索平臺。在此基礎上,根據校內用戶實際的檢索需求,針對ES 索引模塊的中文分詞缺陷,搜索結果相關度不夠符合域內用戶體驗的缺陷進行進一步的優化,引入成熟的中文分詞算法IK;并將搜索用戶的校內身份信息引入搜索結果的相關度計算中,提高用戶檢索結果的相關度和準確性。實驗表明,優化后的搜索平臺與通用的搜索引擎和基于內容管理的搜索引擎相比較,本文實現的搜索引擎能夠更快速、準確、全面地完成校內用戶的搜索需求。
搜索引擎是用以在萬維網中搜索信息的軟件系統[2]。搜索引擎平臺主要包括爬蟲工具、索引工具、檢索器和用戶界面這四個主要部分組成。搜索引擎使用網絡爬蟲(Web Crawler)不斷地挖掘網域內的網絡內容,不斷地周而復始來窮盡探索網域內的網頁。索引工具則針對爬蟲爬取的網頁內容生成以詞為索引項的索引表,提高檢索器在數據庫中查找目標文檔的工作效率。全文搜索的索引會對網頁內容中出現的每一個單詞建立索引列表[3]。檢索器會接收用戶提交的搜索關鍵詞,在數據庫中通過關鍵詞索引匹配來快速獲取關聯結果,并在用戶界面上按照預設的相關性排序來向用戶呈現搜索結果。
Elasticsearch 是一個基于Apache Lucene 開發而來的實時的分布式搜索和數據分析引擎[4]。ES 能夠快速、全面地瀏覽大規模數據集,適用于全文檢索,結構化數據檢索和數據分析;ES 強大的數據檢索能力和優秀的二次開發能力,使得很多商業軟件和平臺如百度、GitHub、Wikipedia 等也采用ES 作為數據資源檢索的核心組件。通過文獻的系統綜述[5-8],我們總結ES 具有以下突出優點:
(1)ES 支持分布式的實時文件存儲結構,任意一個爬取到的字段都可以建立索引,并且可以被搜索到。
(2)ES 有非常強大的可擴展性,分布式架構可以擴展到上百臺服務器,能夠應對PB 級結構化或非結構化數據。
(3)ES 提供了RESTful API,使用JSON 格式,提供了非常優秀的外部交互能力,使得搜索引擎能夠支持多種文件類型的搜索。ES 項目提供了多種語言版本的客戶端,包括Java、Python、.NET 和Groovy,提供了友好的二次開發平臺。
(4)ES 面向文檔,能夠存儲完整的數據對象或文檔,同時能夠對每一個數據對象的內容做索引。
(5)具備良好的數據備份和恢復功能,在發現有數據節點退出時,ES 能夠根據服務器的負載對索引分片進行重新分配,丟失的數據節點在重新啟動后,也會自動恢復連接。有較強的魯棒性。
綜合以上的特點,ES 可以有效地提升搜索效率,具有優秀的擴展能力以及數據操縱能力。因此,本文基于ES 進行校內全文搜索引擎的開發。
針對高校服務器的分布特點,本文設計的基于Elasticsearch 的校內全文搜索引擎的總體架構如圖1所示,其核心組件包括爬蟲模塊、索引模塊以及檢索模塊。

圖1 校內全文搜索引擎總體架構設計
本文設計并實現的爬蟲模塊架構如圖2 所示。

圖2 爬蟲模塊架構設計
初始化的URLs 列表為校園網的首頁以及各二級行政單位和二級學院首頁,并提交給多線程工作分配單元,將列表內的URLs 平均的分配給n 只爬蟲。每個爬蟲單元在接收到各自的URLs 列表后,向目標URL發送HTTP 請求,接收返回的網頁內容數據并進行解析。一方面,將文本內容按照預設的文檔標準進行結構化整理并保存在本地ES 數據庫中。另一方面,提取網頁內容中包含的URL 鏈接作為新增URLs。這些新增的URLs 將通過預先設定的URL 篩選規則,將重復的、無效的以及校園網域外的URL 剔除,將剩余的URLs 提交給多線程工作分配單元來進行下一輪的數據抓取工作。
本文基于開源的Java 爬蟲框架WebCollector 定制開發了并行爬蟲模塊。通過8 條爬蟲線程連續30 天不間斷爬取,共累計獲取超過四百萬份校園網域內的文檔。這些文檔內容都按照預設的JSON 標準文檔結構預處理后存儲在ES 的非關系型數據庫內,等待索引模塊處理。
本文預設的JSON 文檔結構:


ES 引擎的索引機制基于倒排索引(Inverted Index)技術開發,文檔的關鍵詞來組成文檔集合。在用戶搜索時,首先將搜索詞與關鍵詞文檔集進行匹配,再根據各文檔在該關鍵詞集的權重量來對搜索結果排序。但是,由于ES 搜索核心的分詞表默認為英語,對中文文檔的分詞和歸類能力比較薄弱;同時,在文檔的權重計算上,也沒有考慮到域內用戶的檢索偏好,在搜索結果的相關度上與用戶實際要搜索的內容匹配度不高。針對以上兩個ES 系統的缺陷,本文針對性地對分詞技術和文檔權重計算算法進行了優化,進一步提升校內用戶的搜索體驗。
(1)中文分詞
本文引入的中文分詞技術基于IKAnalyzer 中文分詞語言包開發而來,其本質是一個開源的,基于詞典分詞和文法分析算法的中文分詞組件。同時,根據對校內搜索用戶的了解,其特點是周期性的搜索關鍵詞重復率較高[11]。相比廣域的搜索引擎,校園網絡范圍內的用戶的搜索關鍵詞統計結果分布的離散度相對較低。將這些高頻詞匯引入分詞詞典,對中文分詞的表現和結果集的分類表現都有較大提升。針對這一特點,我們重新設計了ES 的索引模塊,如圖3 所示,將用戶檢索的高頻關鍵詞按用戶身份分類收集在擴展詞庫內,并對爬蟲爬取的校內文檔進行實時分詞索引。最終生成的索引結果能夠更加匹配校內用戶檢索的關鍵詞,也能進一步提升搜索結果的相關度。
(2)權重計算
一個文檔在索引內的排序由文檔的相關性權重決定。一個文檔的權重計算由關鍵詞在該文檔中出現的位置和出現次數計算得來(出現的次數越多,出現該詞的文檔數量越少,則權重越大)。基于ES 存儲文檔的JSON 特性,以及校內檢索用戶的身份識別特性,我們可以根據關鍵詞在不同位置(標題、作者、機構、內容等)分別出現的次數來綜合計算關鍵詞的權重,使搜索結果能夠進一步的匹配用戶的期望。
根據魯松等人[12]基于空間向量模型的文檔詞語權重計算方法,本文的權重計算公式如下:

wt,d表示詞t 在文檔d 中的權重;tft,T,tft,H,tft,C分別表示詞t 在文檔中標題、段落標題和內容中分別出現的次數;n 表示文檔的總數;dft表示出現詞t 的文檔總數;而a,b,c 分別代表標題、段落標題和內容中的關鍵詞的權重系數,約束條件為:a+b+c=1且a>b>c>0。
檢索模塊是面向檢索用戶的Web,接收并解析用戶鍵入的搜索關鍵詞,在后臺匹配索引并反饋滿足搜索條件的結果。

圖3 基于IKAnalyzer的優化索引模塊設計
用戶界面的設計參照了目前世界主流的搜索引擎,谷歌搜索和百度搜索的界面設計,來降低用戶的使用學習成本,如圖4 所示。頁面通過輸入框來接收用戶鍵入的搜索文本,并提交給查詢解析器。最終查詢的結果按照預先設定的相關性排序進行列表呈現,如圖5 所示。

圖4 校內搜索引擎首頁面
最后,為了優化引擎的用戶體驗,我們對部分搜索關鍵詞生成檢索結果進行排序優化,提高校園網域內的各主要站點和熱門站點的排序名次。

圖5 搜索結果頁面
為了驗證基于ES 的校內全文搜索引擎的搜索性能,分別選用了國內通用搜索引擎百度和校內CMS 集成搜索引擎(CMS)來進行對比測試。測試的指標為前50 個搜索結果的相關度和搜索結果的反饋時間,測試的關鍵詞為“學校名稱+圖書館”。對比結果如表1所示。

表1 搜索性能對比
測試結果顯示,基于ES 的校內全文搜索引擎在搜索用時和搜索結果的準確率上要優于百度和校內CMS集成搜索引擎,有效的提升了校內文檔檢索的效率和準確性。
基于ES 的校內全文搜索引擎平臺在校園網域內運行穩定,成功解決了校內數字資源無法精準和快速的定位的問題,同時也滿足了校內用戶的搜索需求。本文的下一步工作是在搜索引擎的基礎上,增加用戶搜索熱詞的功能,全校園網域特定時間段內對特定數據的需求量,并動態更新檢索結果的相關度權重排序,進一步提升校內用戶的搜索體驗。