




已閱讀5頁(yè),還剩41頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
太原理工大學(xué)畢業(yè)設(shè)計(jì)(論文)用紙搜索引擎的研究與實(shí)現(xiàn)摘 要網(wǎng)絡(luò)中的資源非常豐富,但是如何有效地找到自己需要的信息卻是一件困難的事情。網(wǎng)絡(luò)搜索引擎應(yīng)運(yùn)而生。本文首先詳細(xì)介紹了網(wǎng)絡(luò)搜索引擎的系統(tǒng)結(jié)構(gòu),然后從網(wǎng)頁(yè)信息抓取、網(wǎng)頁(yè)內(nèi)容分析、網(wǎng)頁(yè)索引建立、用戶檢索與結(jié)果排序等方面進(jìn)行詳細(xì)的說(shuō)明。為了更加深刻的理解這種技術(shù),本人還親自實(shí)現(xiàn)了一個(gè)自己的搜索引擎,能夠?qū)崿F(xiàn)網(wǎng)頁(yè)內(nèi)容的抓取和搜索功能,也能夠自己添加內(nèi)容并顯示在搜索結(jié)果中。網(wǎng)絡(luò)搜索引擎根據(jù)初始配置,自動(dòng)從網(wǎng)絡(luò)上抓取信息并處理,將提取到的信息結(jié)構(gòu)化,然后建立索引。然后通過(guò)web服務(wù)器接收用戶請(qǐng)求,在索引庫(kù)中找到相關(guān)結(jié)果并排序,最終通過(guò)頁(yè)面的形式呈現(xiàn)給用戶。本人在介紹搜索引擎的章節(jié)中除了詳細(xì)的闡述技術(shù)核心外還結(jié)合了搜索引擎的實(shí)現(xiàn)代碼來(lái)說(shuō)明,圖文并茂、易于理解。關(guān)鍵詞:搜索引擎;網(wǎng)絡(luò);Lucene全套設(shè)計(jì)加扣 3012250582Research and implementation of search engineAbstractThe resources in the internet are abundant, but it is a difficult job to search some useful information. So a search engine is the best method to solve this problem. This article fist introduces the system structure of search engine based on the internet in detail, then gives a minute explanation form Spider search, engine and web server. In order to understand the technology more deeply, I have programmed a web search engine by myself.The news search engine is explained and searched according to hyperlink from a appointed web page, then indexes every searched information and adds it to the index database. Then after receiving the customers requests from the web server, it soon searches the right pages form the index engine。In the chapter of introducing search engine, it is not only elaborate the core technology, but also combine with the modern code,pictures included, easy to understand.Key words: search engine; network; Luceneii目錄摘 要iAbstractii1 引言12 搜索引擎研究22.1 搜索引擎發(fā)展歷史22.1.1 分類目錄時(shí)代22.1.2 文本檢索時(shí)代22.1.3 整合分析時(shí)代22.1.4 用戶中心時(shí)代22.2 搜索引擎的結(jié)構(gòu)22.2.1 Web 搜索引擎體系結(jié)構(gòu)22.2.2 網(wǎng)絡(luò)機(jī)器人32.2.3 網(wǎng)頁(yè)分析器42.2.4 網(wǎng)頁(yè)索引器52.2.5 網(wǎng)頁(yè)搜索器52.3 現(xiàn)代搜索引擎的主要技術(shù)62.3.1 倒排索引技術(shù)62.3.2 分布式技術(shù)62.4 小結(jié)73 開(kāi)發(fā)平臺(tái)和技術(shù)83.1 Java編程語(yǔ)言83.2 MyEclipse93.3 Tomcat93.4 Lucene103.4.1 什么是Lucene103.4.2 索引和搜索103.4.3 lucene能做什么103.4.4 lucene的工作方式113.5 Spring113.6 Struts2123.7 Mybatis124 搜索引擎的總體設(shè)計(jì)134.1 系統(tǒng)概述134.2 系統(tǒng)需求134.3 系統(tǒng)結(jié)構(gòu):134.4 小結(jié)145 網(wǎng)絡(luò)機(jī)器人的實(shí)現(xiàn)155.1 什么是網(wǎng)絡(luò)機(jī)器人155.2 網(wǎng)絡(luò)機(jī)器人結(jié)構(gòu)分析155.2.1 如何解析HTML165.2.2 工作流程175.3 網(wǎng)絡(luò)機(jī)器人的實(shí)現(xiàn)175.3.1 實(shí)現(xiàn)說(shuō)明175.3.2 HTML頁(yè)面結(jié)構(gòu)175.3.3 代碼分析185.4 內(nèi)容處理185.4.1 正文提取195.5 小結(jié)226 網(wǎng)頁(yè)索引程序的實(shí)現(xiàn)236.1 索引程序簡(jiǎn)介236.2 準(zhǔn)備工作236.2.1 分詞236.2.2 特征值抽取246.3 Lucene索引器266.3.1 實(shí)現(xiàn)原理266.3.2 存儲(chǔ)結(jié)構(gòu)276.3.3 提高性能286.4 實(shí)現(xiàn)286.4.1 代碼說(shuō)明286.5 小結(jié)307 網(wǎng)絡(luò)搜索程序和客戶端的實(shí)現(xiàn)317.1 網(wǎng)絡(luò)搜索程序簡(jiǎn)介317.2 檢索317.3 排序317.3.1 Jaccard coefficient327.3.2 向量空間模型(Vector Space Model,VSM)327.4 Web客戶端實(shí)現(xiàn)337.4.1 JavaEE與Web容器337.4.2 查詢的基本方法347.4.3 請(qǐng)求處理347.4.4 主要代碼347.4.5 前端界面357.5 小結(jié)37結(jié)論38參考文獻(xiàn)39致 謝40外文原文41中文翻譯45v 太原理工大學(xué)畢業(yè)設(shè)計(jì)(論文)用紙1 引言面對(duì)浩瀚的網(wǎng)絡(luò)資源,搜索引擎為所有網(wǎng)上沖浪的用戶提供了一個(gè)入口,毫不夸張的說(shuō),所有的用戶都可以從搜索出發(fā)到達(dá)自己想去的網(wǎng)上任何一個(gè)地方。因此它也成為除了電子郵件以外最多人使用的網(wǎng)上服務(wù)。搜索引擎技術(shù)伴隨著WWW的發(fā)展是引人注目的。搜索引擎大約經(jīng)歷了三代的更新發(fā)展:第一代搜索引擎出現(xiàn)于1994年。這類搜索引擎一般都索引少于1,000,000個(gè)網(wǎng)頁(yè),極少重新搜集網(wǎng)頁(yè)并去刷新索引。而且其檢索速度非常慢,一般都要等待10秒甚至更長(zhǎng)的時(shí)間。在實(shí)現(xiàn)技術(shù)上也基本沿用較為成熟的IR(Information Retrieval)、網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)等技術(shù),相當(dāng)于利用一些已有技術(shù)實(shí)現(xiàn)的一個(gè)WWW上的應(yīng)用。在1994年3月到4月,網(wǎng)絡(luò)爬蟲(chóng)World Web Worm (WWWW)平均每天承受大約1500次查詢。大約在1996年出現(xiàn)的第二代搜索引擎系統(tǒng)大多采用分布式方案(多個(gè)微型計(jì)算機(jī)協(xié)同工作)來(lái)提高數(shù)據(jù)規(guī)模、響應(yīng)速度和用戶數(shù)量,它們一般都保持一個(gè)大約50,000,000網(wǎng)頁(yè)的索引數(shù)據(jù)庫(kù),每天能夠響應(yīng)10,000,000次用戶檢索請(qǐng)求。1997年11月,當(dāng)時(shí)最先進(jìn)的幾個(gè)搜索引擎號(hào)稱能建立從2,000,000到100,000,000的網(wǎng)頁(yè)索引。Altavista搜索引擎聲稱他們每天大概要承受20,000,000次查詢。2000年搜索引擎2000年大會(huì)上,按照Google公司總裁Larry Page的演講,Google正在用3,000臺(tái)運(yùn)行Linux系統(tǒng)的個(gè)人電腦在搜集Web上的網(wǎng)頁(yè),而且以每天30臺(tái)的速度向這個(gè)微機(jī)集群里添加電腦,以保持與網(wǎng)絡(luò)的發(fā)展相同步。每臺(tái)微機(jī)運(yùn)行多個(gè)爬蟲(chóng)程序搜集網(wǎng)頁(yè)的峰值速度是每秒100個(gè)網(wǎng)頁(yè),平均速度是每秒48.5個(gè)網(wǎng)頁(yè),一天可以搜集超過(guò)4,000,000網(wǎng)頁(yè)搜索引擎一詞在國(guó)內(nèi)外因特網(wǎng)領(lǐng)域被廣泛使用,然而他的含義卻不盡相同。在美國(guó)搜索引擎通常指的是基于因特網(wǎng)的搜索引擎,他們通過(guò)網(wǎng)絡(luò)機(jī)器人程序收集上千萬(wàn)到幾億個(gè)網(wǎng)頁(yè),并且每一個(gè)詞都被搜索引擎索引,也就是我們說(shuō)的全文檢索。著名的因特網(wǎng)搜索引擎包括First Search、Google、HotBot等。在中國(guó),搜索引擎通常指基于網(wǎng)站目錄的搜索服務(wù)或是特定網(wǎng)站的搜索服務(wù),本人這里研究的是基于因特網(wǎng)的搜索技術(shù)。12 搜索引擎研究2.1 搜索引擎發(fā)展歷史2.1.1 分類目錄時(shí)代分類目錄是將網(wǎng)站信息系統(tǒng)地分類整理,提供一個(gè)按類別編排的網(wǎng)站目錄,在每類中,排列著屬于這一類別的網(wǎng)站站名、網(wǎng)址鏈接、內(nèi)容提要,以及子分類目錄,可以在分類目錄中逐級(jí)瀏覽尋找相關(guān)的網(wǎng)站,分類目錄中往往還提供交叉索引,從而可以方便地在相關(guān)的目錄之間跳轉(zhuǎn)和瀏覽。也可以使用關(guān)鍵詞進(jìn)行檢索,檢索結(jié)果為網(wǎng)站信息,這種檢索也稱之為網(wǎng)站檢索。分類目錄專案效仿一些在20世紀(jì)最重要的編輯員/志愿者項(xiàng)目。就像牛津英文字典通過(guò)志愿者的努力成為權(quán)威的工具一樣,Open Directory跟隨著它的腳步也成為了權(quán)威的互聯(lián)網(wǎng)分類目錄。2.1.2 文本檢索時(shí)代文本檢索,亦稱為自然語(yǔ)言檢索,指不對(duì)文獻(xiàn)進(jìn)行任何標(biāo)引,直接通過(guò)計(jì)算機(jī)以自然語(yǔ)言中的語(yǔ)詞匹配查找的系統(tǒng)。文本檢索進(jìn)行匹配的對(duì)象,可以是整個(gè)出版的文本,包括文章、報(bào)告甚整本圖書(shū),也可以是它的部分,如文摘、摘錄或只是文獻(xiàn)的題名。以整個(gè)文獻(xiàn)正文為對(duì)象進(jìn)行的匹配查找,稱為全文檢索。這種方式無(wú)需標(biāo)引,數(shù)據(jù)庫(kù)制作快,可以很快投入運(yùn)行。2.1.3 整合分析時(shí)代這一代的搜索引擎所使用的方法大概是和我們今天的網(wǎng)站的外部鏈接形式基本相同,在當(dāng)時(shí),外部鏈接代表的是一種推薦的含義,通過(guò)每個(gè)網(wǎng)站的推薦鏈接的數(shù)量來(lái)判斷一個(gè)網(wǎng)站的流行性和重要性。然后搜索引擎再結(jié)合網(wǎng)頁(yè)內(nèi)容的重要性來(lái)和相似程度來(lái)改善用戶搜索的信息質(zhì)量。這種模式的首先使用者是google,google不僅為首次使用并且大獲成功,這一成就在當(dāng)時(shí)引起了學(xué)術(shù)界和其他商業(yè)搜索引擎的極度關(guān)注。后來(lái),學(xué)術(shù)界以此成就為基礎(chǔ),提出了更多的改進(jìn)的鏈接分析算法。大多數(shù)的主流搜索引擎都在使用分析鏈接技術(shù)算法。這就是第三代搜索引擎。2.1.4 用戶中心時(shí)代這一時(shí)代的搜索引擎的特點(diǎn)是以用戶為中心。其與第三代搜索引擎最大的區(qū)別是,對(duì)于相同的搜索關(guān)鍵詞,不同用戶得到的搜索結(jié)果可能不同。第四代 搜索將把個(gè)性化信息及人際推薦關(guān)系疊加到鏈接分析上,大大改善搜索結(jié)果排序效果;同時(shí),跨媒體搜索將實(shí)現(xiàn)諸如用圖片搜索圖片等功能,打通文字,圖片,視頻,聲音的界限,顛覆現(xiàn)在全部基于關(guān)鍵字的搜索方法,為用戶帶來(lái)更加直觀的搜索體驗(yàn)。 并且,社交關(guān)系的引入將使網(wǎng)頁(yè)排序質(zhì)量大大提高。2.2 搜索引擎的結(jié)構(gòu)2.2.1 Web 搜索引擎體系結(jié)構(gòu)在搜索引擎的后臺(tái),有一些用于搜集網(wǎng)頁(yè)信息的程序。所收集的信息一般是能表明網(wǎng)站內(nèi)容(包括網(wǎng)頁(yè)本身、網(wǎng)頁(yè)的URL地址、構(gòu)成網(wǎng)頁(yè)的代碼以及進(jìn)出網(wǎng)頁(yè)的連接)的關(guān)鍵詞或者短語(yǔ)。接著將這些信息的索引存放到數(shù)據(jù)庫(kù)中。一個(gè)典型的網(wǎng)絡(luò)搜索引擎的結(jié)構(gòu)如圖2-1所示:圖 2-1 搜索引擎的結(jié)構(gòu)2.2.2 網(wǎng)絡(luò)機(jī)器人又稱為網(wǎng)絡(luò)爬蟲(chóng),網(wǎng)絡(luò)蜘蛛等。在搜索引擎系統(tǒng)中扮演搜集器的角色。它通常是一個(gè)計(jì)算機(jī)程序,在需要時(shí)運(yùn)行。網(wǎng)絡(luò)機(jī)器人通過(guò)統(tǒng)一資源定位符(URL)來(lái)訪問(wèn)網(wǎng)絡(luò)資源。它會(huì)從一個(gè)入口URL列表開(kāi)始,通過(guò)一定的算法順序,下載并通過(guò)網(wǎng)頁(yè)分析器分析網(wǎng)頁(yè),從網(wǎng)頁(yè)中發(fā)現(xiàn)新的URL 地址,并將新發(fā)現(xiàn)的URL 添加到待訪問(wèn)的URL 列表中。網(wǎng)絡(luò)爬蟲(chóng)將得到的網(wǎng)頁(yè)保存在本地網(wǎng)頁(yè)庫(kù)中,以備網(wǎng)頁(yè)分析器和索引器進(jìn)行處理和使用?;ヂ?lián)網(wǎng)中的網(wǎng)頁(yè)數(shù)以億計(jì),一個(gè)網(wǎng)絡(luò)機(jī)器人應(yīng)該盡可能多地覆蓋網(wǎng)絡(luò),但不可能訪問(wèn)到所有的網(wǎng)頁(yè)。如何更加有效地下載網(wǎng)頁(yè)就成了網(wǎng)絡(luò)機(jī)器人設(shè)計(jì)過(guò)程中最需要解決的問(wèn)題。為了有效利用帶寬資源和處理能力,抓取過(guò)程中需要算法和策略支持。常用的算法有深度優(yōu)先搜索策略、IP段掃描搜索策略、廣度優(yōu)先搜索策略等。通常主要采用廣度優(yōu)先搜索策略,保證對(duì)互聯(lián)網(wǎng)的整體覆蓋率。同時(shí)配合探測(cè)性的搜索策略,快速發(fā)現(xiàn)新的網(wǎng)絡(luò)資源。每個(gè)搜索策略的具體介紹如下:1. 深度優(yōu)先搜索策略:深度優(yōu)先的基本方法是依次訪問(wèn)下一級(jí)的網(wǎng)頁(yè)鏈接,直到不能再深入為止。網(wǎng)絡(luò)機(jī)器人完成一個(gè)搜索分支后返回到上一個(gè)鏈接節(jié)點(diǎn)進(jìn)一步搜索其他鏈接。當(dāng)所有鏈接已經(jīng)遍歷之后,搜索任務(wù)結(jié)束。深度優(yōu)先算法比較適合垂直搜索或站內(nèi)搜索等應(yīng)用環(huán)境。對(duì)大規(guī)模的互聯(lián)網(wǎng)搜索,由于部分網(wǎng)站內(nèi)容層次結(jié)構(gòu)很深,會(huì)造成巨大的資源浪費(fèi)。2. IP 段掃描搜索策略:IP 段掃描搜索策略的基本思想是以某種策略找到一批起始IP地址。從設(shè)定的IP地址,按照IP地址遞增的方式搜索后續(xù)的每一個(gè)IP地址中的信息。這種方法可以解決網(wǎng)絡(luò)蜘蛛對(duì)HTML文件中指向其他Web站點(diǎn)的超鏈接地址的過(guò)度依賴,能夠發(fā)現(xiàn)新的孤立資源。但是這種策略計(jì)算范圍巨大,不適用于大規(guī)模的搜索,但可以用于配合其他策略在小范圍內(nèi)全面搜索。3. 廣度優(yōu)先搜索策略:廣度優(yōu)先搜索策略主要按照目錄層次比較淺的網(wǎng)頁(yè)內(nèi)容優(yōu)先的搜索方法。網(wǎng)絡(luò)機(jī)器人先訪問(wèn)所有同一層次的內(nèi)容,然后再繼續(xù)搜索下一層。這種方法保證了對(duì)網(wǎng)頁(yè)內(nèi)容的有效控制,避免遇到一個(gè)無(wú)窮深層分智時(shí)無(wú)法結(jié)束的問(wèn)題。廣度優(yōu)先搜索策略實(shí)現(xiàn)方便,不需要存儲(chǔ)大量的中間節(jié)點(diǎn),目前被廣泛采用。存在的問(wèn)題是需要話費(fèi)比較長(zhǎng)的時(shí)間才能到達(dá)深層的網(wǎng)頁(yè)。單個(gè)網(wǎng)站的訪問(wèn)速度通常不高,為了提高網(wǎng)絡(luò)利用率,網(wǎng)絡(luò)機(jī)器人通常會(huì)采用多線程技術(shù)來(lái)同時(shí)訪問(wèn)多個(gè)網(wǎng)頁(yè)。網(wǎng)絡(luò)機(jī)器人遇到的另一個(gè)問(wèn)題是如何高效且正確的提取網(wǎng)頁(yè)中的URL。對(duì)于普通的HTML中你的鏈接比較容易。但是隨著XHTML技術(shù)的普及,大量的網(wǎng)頁(yè)不再是簡(jiǎn)單的鏈接關(guān)系。很多網(wǎng)絡(luò)入口都包含在Javascript代碼中,甚至有些是動(dòng)態(tài)生成的。如何正確地得到這些URL,如何解決死鏈,如何處理非文本內(nèi)容等, 都是網(wǎng)絡(luò)機(jī)器人需要解決的問(wèn)題。2.2.3 網(wǎng)頁(yè)分析器網(wǎng)絡(luò)機(jī)器人搜集來(lái)的網(wǎng)頁(yè)信息或下載的文檔一般要首先進(jìn)行分析,用于后續(xù)建立索引。對(duì)于通用型網(wǎng)絡(luò)搜索引擎,網(wǎng)頁(yè)提取技術(shù)主要對(duì)下載的數(shù)據(jù)進(jìn)行正文提取分析操作;對(duì)于垂直搜索,在結(jié)構(gòu)化操作以后,還要對(duì)其進(jìn)行數(shù)據(jù)挖掘,進(jìn)行領(lǐng)域信息識(shí)別,從而提高信息的質(zhì)量。我呢當(dāng)分析技術(shù)一般包括分詞、過(guò)濾、轉(zhuǎn)換等工作,具體處理與文檔類型、搜索引擎的具體結(jié)構(gòu)和算法密切相關(guān)。網(wǎng)頁(yè)分析中的一項(xiàng)關(guān)鍵技術(shù)就是分詞。與英文為代表的拉丁語(yǔ)系語(yǔ)言相比,英文以空格作為天然的分隔符,而中文由于繼承自古代漢語(yǔ)的傳統(tǒng),詞語(yǔ)之間沒(méi)有分隔。古代漢語(yǔ)中除了連綿詞和人名地名等,詞通常就是單個(gè)漢字,所以當(dāng)時(shí)沒(méi)有分詞書(shū)寫(xiě)的必要。而現(xiàn)代漢語(yǔ)中雙字或多字詞居多,一個(gè)字不再等同于一個(gè)詞。在中文里,“詞”和“詞組”邊界模糊?,F(xiàn)代漢語(yǔ)的基本表達(dá)單元雖然為“詞”,且以雙字或者多字詞居多,但由于人們認(rèn)識(shí)水平的不同,對(duì)詞和短語(yǔ)的邊界很難去區(qū)分。中文分詞對(duì)于搜索引擎來(lái)說(shuō),最重要的并不是找到所有結(jié)果,因?yàn)樵谏习賰|的網(wǎng)頁(yè)中找到所有結(jié)果沒(méi)有太多的意義,沒(méi)有人能看得完,最重要的是把最相關(guān)的結(jié)果排在最前面,這也稱為相關(guān)度排序。中文分詞的準(zhǔn)確與否,常常直接影響到對(duì)搜索結(jié)果的相關(guān)度排序。從定性分析來(lái)說(shuō),搜索引擎的分詞算法不同,詞庫(kù)的不同都會(huì)影響頁(yè)面的返回結(jié)果?,F(xiàn)有的分詞算法可分為三大類:基于字符串匹配的分詞方法、基于理解的分詞方法和基于統(tǒng)計(jì)的分詞方法。按照是否與詞性標(biāo)注過(guò)程相結(jié)合,又可以分為單純分詞方法和分詞與標(biāo)注相結(jié)合的一體化方法。2.2.4 網(wǎng)頁(yè)索引器網(wǎng)頁(yè)需要建立索引才能被后續(xù)流程使用。設(shè)計(jì)良好的索引可以加快搜索速度,能夠更準(zhǔn)確地進(jìn)行網(wǎng)頁(yè)定位,從而減少設(shè)計(jì)開(kāi)銷。索引的功能是對(duì)搜索器所搜索的信息進(jìn)行分析處理,從中抽取索引項(xiàng),用于表示文檔以及生成文檔庫(kù)的索引表。搜索引擎普遍借鑒了傳統(tǒng)信息檢索中的索引模型,包括倒排文檔、矢量空間模型、概率模型等。為了快速查找特定的信息,建立索引數(shù)據(jù)庫(kù)是一種常用的方法,即將文檔表示為一種便于檢索的方式,并存儲(chǔ)在索引數(shù)據(jù)庫(kù)中。索引數(shù)據(jù)庫(kù)的格式是一種特殊的數(shù)據(jù)存儲(chǔ)格式。索引結(jié)構(gòu)和效率的好壞是Web信息檢索系統(tǒng)的關(guān)鍵,要求易于實(shí)現(xiàn)和維護(hù)、檢索速度快、空間需求低。倒排索引的結(jié)構(gòu)如圖2-2所示:圖 2-2 倒排索引的結(jié)構(gòu)索引器是用來(lái)建立索引的軟件程序。索引器的主要功能是分析處理文檔的內(nèi)容和信息,把文檔轉(zhuǎn)化成一系列的索引項(xiàng)。索引中的最小信息單位是索引項(xiàng),索引項(xiàng)除了文檔內(nèi)容,還可以包含文檔的大小、時(shí)間、類型、存放路徑等描述信息和附屬信息。索引項(xiàng)可以是短語(yǔ)、詞組或單字。索引項(xiàng)存儲(chǔ)的信息包括關(guān)鍵詞及其權(quán)重,以及來(lái)源URL、更新時(shí)間、編碼格式、鏈接情況等。搜索引擎的索引通常使用倒排表,也就是常說(shuō)的倒排索引。根據(jù)要求的速度和精度等要求,搜索引擎可以采用復(fù)合索引和簡(jiǎn)單索引。記錄索引項(xiàng)在文檔中出現(xiàn)的位置,對(duì)檢索時(shí)的匹配度計(jì)算也很有好處。索引表也可能要記錄索引項(xiàng)在文檔中出現(xiàn)的位置,以便檢索器計(jì)算索引項(xiàng)之間的相鄰或接近關(guān)系。2.2.5 網(wǎng)頁(yè)搜索器用戶輸入檢索詞后,搜索引擎返回的結(jié)果需要根據(jù)語(yǔ)義相關(guān)性和其他權(quán)值進(jìn)行排序。通常的網(wǎng)頁(yè)排序除了基本的檢索詞語(yǔ)素相關(guān)外,還要根據(jù)網(wǎng)頁(yè)的連接情況,分析網(wǎng)頁(yè)自身的重要性,保證用戶得到重要的網(wǎng)頁(yè)信息。中文搜索引擎中經(jīng)常由于語(yǔ)義歧義和差別,造成關(guān)鍵字檢索將誒過(guò)的語(yǔ)義相關(guān)性效果較差。一詞多義造成的搜索結(jié)果和用戶本意差距較大的情況時(shí)常發(fā)生。垂直搜索由于只包含某個(gè)領(lǐng)域的信息,詞義明確,可以提高結(jié)果的相關(guān)性。2.3 現(xiàn)代搜索引擎的主要技術(shù)2.3.1 倒排索引技術(shù)在關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)里,索引1是檢索數(shù)據(jù)最有效率的方式。但對(duì)于搜索引擎,它并不能滿足其特殊要求:1)海量數(shù)據(jù):搜索引擎面對(duì)的是海量數(shù)據(jù),像Google,百度這樣大型的商業(yè)搜索引擎索引都是億級(jí)甚至幾千億的網(wǎng)頁(yè)數(shù)量,面對(duì)如此海量數(shù)據(jù),使得數(shù)據(jù)庫(kù)系統(tǒng)很難有效的管理。2)數(shù)據(jù)操作簡(jiǎn)單:搜索引擎使用的數(shù)據(jù)操作簡(jiǎn)單,一般而言,只需要增、 刪、 改、 查幾個(gè)功能,而且數(shù)據(jù)都有特定的格式,可以針對(duì)這些應(yīng)用設(shè)計(jì)出簡(jiǎn)單高效的應(yīng)用程序。而一般的數(shù)據(jù)庫(kù)系統(tǒng)則支持大而全的功能,同時(shí)損失了速度和空間。最后,搜索引擎面臨大量的用戶檢索需求,這要求搜索引擎在檢索程序的設(shè)計(jì)上要分秒必爭(zhēng),盡可能的將大運(yùn)算量的工作在索引建立時(shí)完成,使檢索運(yùn)算盡量的少。一般的數(shù)據(jù)庫(kù)系統(tǒng)很難承受如此大量的用戶請(qǐng)求,而且在檢索響應(yīng)時(shí)間和檢索并發(fā)度上都不及我們專門設(shè)計(jì)的索引系統(tǒng)。倒排索引,也常被稱為反向索引、置入檔案或反向檔案,是一種索引方法,被用來(lái)存儲(chǔ)在全文搜索下某個(gè)單詞在一個(gè)文檔或者一組文檔中的存儲(chǔ)位置的映射。它是文檔檢索系統(tǒng)中最常用的數(shù)據(jù)結(jié)構(gòu)。通過(guò)倒排索引,可以根據(jù)單詞快速獲取包含這個(gè)單詞的文檔列表。倒排索引主要由兩個(gè)部分組成:“單詞詞典”和“倒排文件”。倒排索引有兩種不同的反向索引形式:一條記錄的水平反向索引(或者反向檔案索引)包含每個(gè)引用單詞的文檔的列表。一個(gè)單詞的水平反向索引(或者完全反向索引)又包含每個(gè)單詞在一個(gè)文檔中的位置。后者的形式提供了更多的兼容性(比如短語(yǔ)搜索),但是需要更多的時(shí)間和空間來(lái)創(chuàng)建?,F(xiàn)代搜索引擎的索引都是基于倒排索引。相比“簽名文件”、“后綴樹(shù)”等索引結(jié)構(gòu),“倒排索引”是實(shí)現(xiàn)單詞到文檔映射關(guān)系的最佳實(shí)現(xiàn)方式和最有效的索引結(jié)構(gòu).2.3.2 分布式技術(shù)分布式搜索引擎是根據(jù)地域、主題、IP地址及其它的劃分標(biāo)準(zhǔn)將全網(wǎng)分成若干個(gè)自治區(qū)域,在每個(gè)自治區(qū)域內(nèi)設(shè)立一個(gè)檢索服務(wù)器,而每個(gè)檢索服務(wù)器由信息搜索機(jī)器人、索引搜索軟件數(shù)據(jù)庫(kù)和代理三部分組成。信息搜索機(jī)器人負(fù)責(zé)本自治區(qū)域內(nèi)的信息搜索,并建立索引信息存入索引數(shù)據(jù)庫(kù)。代理負(fù)責(zé)向用戶提供查詢接口,并與其它代理進(jìn)行互換,實(shí)現(xiàn)檢索服務(wù)器之間的信息交換,且查詢可以重定向,即如果一個(gè)索引數(shù)據(jù)庫(kù)沒(méi)有滿足查詢要求,它可以將查詢請(qǐng)求發(fā)送到其它檢索服務(wù)器上。它與集中式搜索引擎相比有以下優(yōu)點(diǎn):各檢索服務(wù)器之間相互共享資源,站點(diǎn)只向本自治區(qū)域內(nèi)的信息搜索機(jī)器人提供信息,減輕了網(wǎng)絡(luò)及各站點(diǎn)的負(fù)載。各代理之間的相互協(xié)作及查詢重定向使得提供的服務(wù)更完善。與Web本身的分布式特性相適應(yīng),具有良好的可擴(kuò)充性,便于維護(hù)。索引信息劃分到各自的索引數(shù)據(jù)庫(kù)中,使得各索引數(shù)據(jù)庫(kù)相對(duì)較小,查詢的響應(yīng)時(shí)間相對(duì)較短。部分檢索服務(wù)器發(fā)生故障時(shí),其它部分能正常工作。2.4 小結(jié)本章介紹了搜索引擎的發(fā)展歷程,并討論了未來(lái)搜索引擎的形態(tài)。然后重點(diǎn)闡述了現(xiàn)代網(wǎng)絡(luò)搜索引擎的主要組成結(jié)構(gòu)。網(wǎng)絡(luò)機(jī)器人利用搜索策略和算法獲取網(wǎng)頁(yè)。網(wǎng)頁(yè)分析器對(duì)網(wǎng)頁(yè)進(jìn)行正文提取、分詞等加工操作,分析和處理,生成可以被索引的標(biāo)準(zhǔn)文檔。網(wǎng)頁(yè)索引器生成對(duì)文檔的倒排索引。網(wǎng)頁(yè)搜索器分析用戶輸入的關(guān)鍵詞,在索引庫(kù)中檢索,按照一定的算法將檢索結(jié)果排序后呈現(xiàn)給用戶。最后,介紹了現(xiàn)代搜索引擎的兩個(gè)主要技術(shù):倒排索引和分布式技術(shù)。3 開(kāi)發(fā)平臺(tái)和技術(shù)本章主要介紹了搜索引擎系統(tǒng)的開(kāi)發(fā)平臺(tái)以及使用的技術(shù)。3.1 Java編程語(yǔ)言Java是一種可以撰寫(xiě)跨平臺(tái)應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,是由Sun Microsystems公司于1995年5月推出的Java程序設(shè)計(jì)語(yǔ)言和Java平臺(tái)(即JavaEE, JavaME, JavaSE)的總稱。Java自面世后就非常流行,發(fā)展迅速,對(duì)C+語(yǔ)言形成了有力沖擊。Java 技術(shù)具有卓越的通用性、高效性、平臺(tái)移植性和安全性,廣泛應(yīng)用于個(gè)人PC、數(shù)據(jù)中心、游戲控制臺(tái)、科學(xué)超級(jí)計(jì)算機(jī)、移動(dòng)電話和互聯(lián)網(wǎng),同時(shí)擁有全球最大的開(kāi)發(fā)者專業(yè)社群。在全球云計(jì)算和移動(dòng)互聯(lián)網(wǎng)的產(chǎn)業(yè)環(huán)境下,Java更具備了顯著優(yōu)勢(shì)和廣闊前景。Java語(yǔ)言具有如下特點(diǎn):1.簡(jiǎn)單Java最初是為對(duì)家用電器進(jìn)行集成控制而設(shè)計(jì)的一種語(yǔ)言,因此它必須簡(jiǎn)單明了。Java語(yǔ)言的簡(jiǎn)單性主要體現(xiàn)在以下三個(gè)方面:1)Java的風(fēng)格類似于C+,因而C+程序員是非常熟悉的。從某種意義上講,Java語(yǔ)言是C及C+語(yǔ)言的一個(gè)變種,因此,C+程序員可以很快就掌握J(rèn)ava編程技術(shù)。2)Java摒棄了C+中容易引發(fā)程序錯(cuò)誤的地方,如指針和內(nèi)存管理。3)Java提供了豐富的類庫(kù)。2.面向?qū)ο竺嫦驅(qū)ο罂梢哉f(shuō)是Java最重要的特性。Java語(yǔ)言的設(shè)計(jì)完全是面向?qū)ο蟮?,它不支持類似C語(yǔ)言那樣的面向過(guò)程的程序設(shè)計(jì)技術(shù)。Java支持靜態(tài)和動(dòng)態(tài)風(fēng)格的代碼繼承及重用。單從面向?qū)ο蟮奶匦詠?lái)看,Java類似于SmallTalk,但其它特性、尤其是適用于分布式計(jì)算環(huán)境的特性遠(yuǎn)遠(yuǎn)超越了SmallTalk。3.分布式Java包括一個(gè)支持HTTP和FTP等基于TCP/IP協(xié)議的子庫(kù)。因此,Java應(yīng)用程序可憑借URL打開(kāi)并訪問(wèn)網(wǎng)絡(luò)上的對(duì)象,其訪問(wèn)方式與訪問(wèn)本地文件系統(tǒng)幾乎完全相同。為分布環(huán)境尤其是Internet提供的動(dòng)態(tài)內(nèi)容無(wú)疑是一項(xiàng)非常宏偉的任務(wù),但Java的語(yǔ)法特性卻使我們很容易地實(shí)現(xiàn)這項(xiàng)目標(biāo)。4.健壯Java致力于檢查程序在編譯和運(yùn)行時(shí)的錯(cuò)誤。類型檢查幫助檢查出許多開(kāi)發(fā)早期出現(xiàn)的錯(cuò)誤。Java自已操縱內(nèi)存減少了內(nèi)存出錯(cuò)的可能性。Java還實(shí)現(xiàn)了真數(shù)組,避免了覆蓋數(shù)據(jù)的可能。這些功能特征大大縮短了開(kāi)發(fā)Java應(yīng)用程序的周期。Java提供Null指針檢測(cè)數(shù)組邊界檢測(cè)異常出口字節(jié)代碼校驗(yàn)。5.結(jié)構(gòu)中立另外,為了建立Java作為網(wǎng)絡(luò)的一個(gè)整體,Java將它的程序編譯成一種結(jié)構(gòu)中立的中間文件格式。只要有Java運(yùn)行系統(tǒng)的機(jī)器都能執(zhí)行這種中間代碼?,F(xiàn)在,Java運(yùn)行系統(tǒng)有Solaris2.4(SPARC),Win32系統(tǒng)(Windows95和WindowsNT)等.Java源程序被編譯成一種高層次的與機(jī)器無(wú)關(guān)的byte-code格式語(yǔ)言,這種語(yǔ)言被設(shè)計(jì)在虛擬機(jī)上運(yùn)行,由機(jī)器相關(guān)的運(yùn)行調(diào)試器實(shí)現(xiàn)執(zhí)行。6.安全Java的安全性可從兩個(gè)方面得到保證。一方面,在Java語(yǔ)言里,象指針和釋放內(nèi)存等C+功能被刪除,避免了非法內(nèi)存操作。另一方面,當(dāng)Java用來(lái)創(chuàng)建瀏覽器時(shí),語(yǔ)言功能和瀏覽器本身提供的功能結(jié)合起來(lái),使它更安全。Java語(yǔ)言在你的機(jī)器上執(zhí)行前,要經(jīng)過(guò)很多次的測(cè)試。它經(jīng)過(guò)代碼校驗(yàn),檢查代碼段的格式,檢測(cè)指針操作,對(duì)象操作是否過(guò)分以及試圖改變一個(gè)對(duì)象的類型。7.可移植的這句話一直是Java程序設(shè)計(jì)師們的精神指標(biāo),也是Java之所以能夠受到程序設(shè)計(jì)師們喜愛(ài)的原因之一,最大的功臣就是JVM的技術(shù)。大多數(shù)編譯器產(chǎn)生的目標(biāo)代碼只能運(yùn)行在一種CPU上(如Intel的x86系列),即使那些能支持多種CPU的編譯器也不能同時(shí)產(chǎn)生適合多種CPU的目標(biāo)代碼。如果你需要在三種CPU(如x86、SPARC和MIPS)上運(yùn)行同一程序,就必須編譯三次。但JAVA編譯器就不同了。JAVA編譯器產(chǎn)生的目標(biāo)代碼(J-Code)是針對(duì)一種并不存在的CPU-JAVA虛擬機(jī)(JAVA Virtual Machine),而不是某一實(shí)際的CPU。JAVA虛擬機(jī)能掩蓋不同CPU之間的差別,使J-Code能運(yùn)行于任何具有JAVA虛擬機(jī)的機(jī)器上。3.2 MyEclipseMyEclipse企業(yè)級(jí)工作平臺(tái)(MyEclipseEnterprise Workbench ,簡(jiǎn)稱MyEclipse)是對(duì)EclipseIDE的擴(kuò)展,利用它我們可以在數(shù)據(jù)庫(kù)和JavaEE的開(kāi)發(fā)、發(fā)布以及應(yīng)用程序服務(wù)器的整合方面極大的提高工作效率。它是功能豐富的JavaEE集成開(kāi)發(fā)環(huán)境,包括了完備的編碼、調(diào)試、測(cè)試和發(fā)布功能,完整支持HTML,Struts,JSP,CSS,Javascript,Spring,SQL,Hibernate。MyEclipse 是一個(gè)十分優(yōu)秀的用于開(kāi)發(fā)Java, J2EE的 Eclipse 插件集合,MyEclipse的功能非常強(qiáng)大,支持也十分廣泛,尤其是對(duì)各種開(kāi)源產(chǎn)品的支持十分不錯(cuò)。MyEclipse目前支持Java Servlet,AJAX, JSP, JSF, Struts,Spring, Hibernate,EJB3,JDBC數(shù)據(jù)庫(kù)鏈接工具等多項(xiàng)功能??梢哉f(shuō)MyEclipse是幾乎囊括了目前所有主流開(kāi)源產(chǎn)品的專屬eclipse開(kāi)發(fā)工具。3.3 TomcatTomcat是由Apache軟件基金會(huì)下屬的Jakarta項(xiàng)目開(kāi)發(fā)的一個(gè)Servlet容器,按照Sun Microsystems提供的技術(shù)規(guī)范,實(shí)現(xiàn)了對(duì)Servlet和JavaServer Page(JSP)的支持,并提供了作為Web服務(wù)器的一些特有功能,如Tomcat管理和控制平臺(tái)、安全局管理和Tomcat閥等。由于Tomcat本身也內(nèi)含了一個(gè)HTTP服務(wù)器,它也可以被視作一個(gè)單獨(dú)的Web服務(wù)器。但是,不能將Tomcat和Apache Web服務(wù)器混淆,Apache Web Server是一個(gè)用C語(yǔ)言實(shí)現(xiàn)的HTTP web server;這兩個(gè)HTTP web server不是捆綁在一起的。Apache Tomcat包含了一個(gè)配置管理工具,也可以通過(guò)編輯XML格式的配置文件來(lái)進(jìn)行配置。Tomcat提供了一個(gè)Jasper編譯器用以將JSP編譯成對(duì)應(yīng)的Servlet。Tomcat的Servlet引擎通常與Apache或者其他Web服務(wù)器一起工作。除了用于開(kāi)發(fā)過(guò)程中的調(diào)試以及那些對(duì)速度和事務(wù)處理只有很小要求的用戶,很少會(huì)將Tomcat單獨(dú)作為Web服務(wù)器。但隨著版本的更新,正有越來(lái)越多的用戶將其單獨(dú)作為Web服務(wù)器用以那些對(duì)速度和可靠性有較高要求的環(huán)境中。3.4 Lucene3.4.1 什么是LuceneApacheLucene是一個(gè)基于Java全文搜索引擎,利用它可以輕易地為Java軟件加入全文搜尋功能。Lucene是一個(gè)基于Java的全文信息檢索工具包,它不是一個(gè)完整的搜索應(yīng)用程序,而是為你的應(yīng)用程序提供索引和搜索功能??梢苑奖愕那度氲礁鞣N應(yīng)用中實(shí)現(xiàn)針對(duì)應(yīng)用的全文索引/檢索功能。因此它并不像 或者google Desktop那么拿來(lái)就能用,它只是提供了一種工具讓你能實(shí)現(xiàn)這些產(chǎn)品。Lucene目前是ApacheJakarta家族中的一個(gè)開(kāi)源項(xiàng)目。也是目前最為流行的基于Java開(kāi)源全文檢索工具包。目前已經(jīng)有很多應(yīng)用程序的搜索功能是基于Lucene的,比如Eclipse的幫助系統(tǒng)的搜索功能。Lucene能夠?yàn)槲谋绢愋偷臄?shù)據(jù)建立索引,所以你只要能把你要索引的數(shù)據(jù)格式轉(zhuǎn)化為文本的,Lucene就能對(duì)你的文檔進(jìn)行索引和搜索。比如你要對(duì)一些HTML文檔,PDF文檔進(jìn)行索引的話你就首先需要把HTML文檔和PDF文檔轉(zhuǎn)化成文本格式的,然后將轉(zhuǎn)化后的內(nèi)容交給Lucene進(jìn)行索引,然后把創(chuàng)建好的索引文件保存到磁盤或者內(nèi)存中,最后根據(jù)用戶輸入的查詢條件在索引文件上進(jìn)行查詢。不指定要索引的文檔的格式也使Lucene能夠幾乎適用于所有的搜索應(yīng)用程序。Lucene的最主要工作是替文件的每一個(gè)字作索引,索引讓搜尋的效率比傳統(tǒng)的逐字比較大大提高,Lucen提供一組解讀,過(guò)濾,分析文件,編排和使用索引的API,它的強(qiáng)大之處除了高效和簡(jiǎn)單外,最重要的是使使用者可以隨時(shí)應(yīng)自已需要自訂其功能。3.4.2 索引和搜索索引是現(xiàn)代搜索引擎的核心,建立索引的過(guò)程就是把源數(shù)據(jù)處理成非常方便查詢的索引文件的過(guò)程。為什么索引這么重要呢,試想你現(xiàn)在要在大量的文檔中搜索含有某個(gè)關(guān)鍵詞的文檔,那么如果不建立索引的話你就需要把這些文檔順序的讀入內(nèi)存,然后檢查這個(gè)文章中是不是含有要查找的關(guān)鍵詞,這樣的話就會(huì)耗費(fèi)非常多的時(shí)間,想想搜索引擎可是在毫秒級(jí)的時(shí)間內(nèi)查找出要搜索的結(jié)果的。這就是由于建立了索引的原因,你可以把索引想象成這樣一種數(shù)據(jù)結(jié)構(gòu),他能夠使你快速的隨機(jī)訪問(wèn)存儲(chǔ)在索引中的關(guān)鍵詞,進(jìn)而找到該關(guān)鍵詞所關(guān)聯(lián)的文檔。Lucene采用的是一種稱為反向索引(invertedindex)的機(jī)制。反向索引就是說(shuō)我們維護(hù)了一個(gè)詞/短語(yǔ)表,對(duì)于這個(gè)表中的每個(gè)詞/短語(yǔ),都有一個(gè)鏈表描述了有哪些文檔包含了這個(gè)詞/短語(yǔ)。這樣在用戶輸入查詢條件的時(shí)候,就能非??斓牡玫剿阉鹘Y(jié)果。我們將在本系列文章的第二部分詳細(xì)介紹Lucene的索引機(jī)制,由于Lucene提供了簡(jiǎn)單易用的API,所以即使讀者剛開(kāi)始對(duì)全文本進(jìn)行索引的機(jī)制并不太了解,也可以非常容易的使用Lucene對(duì)你的文檔實(shí)現(xiàn)索引。對(duì)文檔建立好索引后,就可以在這些索引上面進(jìn)行搜索了。搜索引擎首先會(huì)對(duì)搜索的關(guān)鍵詞進(jìn)行解析,然后再在建立好的索引上面進(jìn)行查找,最終返回和用戶輸入的關(guān)鍵詞相關(guān)聯(lián)的文檔。3.4.3 lucene能做什么要回答這個(gè)問(wèn)題,先要了解lucene的本質(zhì)。實(shí)際上lucene的功能很單一,說(shuō)到底,就是你給它若干個(gè)字符串,然后它為你提供一個(gè)全文搜索服務(wù),告訴你你要搜索的關(guān)鍵詞出現(xiàn)在哪里。知道了這個(gè)本質(zhì),你就可以發(fā)揮想象做任何符合這個(gè)條件的事情了。你可以把站內(nèi)新聞都索引了,做個(gè)資料庫(kù);你可以把一個(gè)數(shù)據(jù)庫(kù)表的若干個(gè)字段索引起來(lái),那就不用再擔(dān)心因?yàn)椤?like%”而鎖表了;你也可以寫(xiě)個(gè)自己的搜索引擎。3.4.4 lucene的工作方式lucene提供的服務(wù)實(shí)際包含兩部分:一入一出。所謂入是寫(xiě)入,即將你提供的源(本質(zhì)是字符串)寫(xiě)入索引或者將其從索引中刪除;所謂出是讀出,即向用戶提供全文搜索服務(wù),讓用戶可以通過(guò)關(guān)鍵詞定位源。寫(xiě)入流程源字符串首先經(jīng)過(guò)analyzer處理,包括:分詞,分成一個(gè)個(gè)單詞;去除stopword(可選)。將源中需要的信息加入Document的各個(gè)Field中,并把需要索引的Field索引起來(lái),把需要存儲(chǔ)的Field存儲(chǔ)起來(lái)。將索引寫(xiě)入存儲(chǔ)器,存儲(chǔ)器可以是內(nèi)存或磁盤。讀出流程用戶提供搜索關(guān)鍵詞,經(jīng)過(guò)analyzer處理。對(duì)處理后的關(guān)鍵詞搜索索引找出對(duì)應(yīng)的Document。用戶根據(jù)需要從找到的Document中提取需要的Field(原文或者源URL)。3.5 SpringSpring Framework是一個(gè)開(kāi)源的JavaJava EE全功能棧(full-stack)的應(yīng)用程序框架,以Apache許可證形式發(fā)布,也有.NET平臺(tái)上的移植版本。該框架基于 Expert One-on-One Java EE Design and Development(ISBN 0-7645-4385-7)一書(shū)中的代碼,最初由Rod Johnson和Juergen Hoeller等開(kāi)發(fā)。Spring Framework提供了一個(gè)簡(jiǎn)易的開(kāi)發(fā)方式,這種開(kāi)發(fā)方式,將避免那些可能致使底層代碼變得繁雜混亂的大量的屬性文件和幫助類。Spring中包含的關(guān)鍵特性:強(qiáng)大的基于JavaBeans的采用控制翻轉(zhuǎn)(Inversion of Control,IoC)原則的配置管理,使得應(yīng)用程序的組建更加快捷簡(jiǎn)易。一個(gè)可用于從applet到Java EE等不同運(yùn)行環(huán)境的核心Bean工廠。數(shù)據(jù)庫(kù)事務(wù)的一般化抽象層,允許聲明式(Declarative)事務(wù)管理器,簡(jiǎn)化事務(wù)的劃分使之與底層無(wú)關(guān)。內(nèi)建的針對(duì)JTA和單個(gè)JDBC數(shù)據(jù)源的一般化策略,使Spring的事務(wù)支持不要求Java EE環(huán)境,這與一般的JTA或者EJB CMT相反。JDBC 抽象層提供了有針對(duì)性的異常等級(jí)(不再?gòu)腟QL異常中提取原始代碼),簡(jiǎn)化了錯(cuò)誤處理,大大減少了程序員的編碼量。再次利用JDBC時(shí),你無(wú)需再寫(xiě)出另一個(gè)終止(finally)模塊。并且面向JDBC的異常與Spring通用數(shù)據(jù)訪問(wèn)對(duì)象(Data Access Object)異常等級(jí)相一致。以資源容器,DAO實(shí)現(xiàn)和事務(wù)策略等形式與Hibernate,JDO和iBATIS SQL Maps集成。利用眾多的翻轉(zhuǎn)控制方便特性來(lái)全面支持,解決了許多典型的Hibernate集成問(wèn)題。所有這些全部遵從Spring通用事務(wù)處理和通用數(shù)據(jù)訪問(wèn)對(duì)象異常等級(jí)規(guī)范。靈活的基于核心Spring功能的MVC網(wǎng)頁(yè)應(yīng)用程序框架。開(kāi)發(fā)者通過(guò)策略接口將擁有對(duì)該框架的高度控制,因而該框架將適應(yīng)于多種呈現(xiàn)(View)技術(shù),例如JSP、FreeMarker、Velocity、Tiles、iText以及POI。值得注意的是,Spring中間層可以輕易地結(jié)合于任何基于MVC框架的網(wǎng)頁(yè)層,例如Struts、WebWork或Tapestry。提供諸如事務(wù)管理等服務(wù)的面向方面編程框架。在設(shè)計(jì)應(yīng)用程序Model時(shí),MVC模式(例如Struts)通常難于給出一個(gè)簡(jiǎn)潔明了的框架結(jié)構(gòu)。Spring卻具有能夠讓這部分工作變得簡(jiǎn)單的能力。程序開(kāi)發(fā)員們可以使用Spring的JDBC抽象層重新設(shè)計(jì)那些復(fù)雜的框架結(jié)構(gòu)。3.6 Struts2Apache Struts 2是一個(gè)用于開(kāi)發(fā)Java EE網(wǎng)絡(luò)應(yīng)用程序的開(kāi)源Web應(yīng)用框架。它利用并擴(kuò)展了Java Servlet API,鼓勵(lì)開(kāi)發(fā)者采用MVC架構(gòu)。Struts 2是Struts的下一代產(chǎn)品,是在 struts 1和WebWork的技術(shù)基礎(chǔ)上進(jìn)行了合并的全新的Struts 2框架。其全新的Struts 2的體系結(jié)構(gòu)與Struts 1的體系結(jié)構(gòu)差別巨大。Struts 2以WebWork為核心,采用攔截器的機(jī)制來(lái)處理用戶的請(qǐng)求,這樣的設(shè)計(jì)也使得業(yè)務(wù)邏輯控制器能夠與ServletAPI完全脫離開(kāi),所以Struts 2可以理解為WebWork的更新產(chǎn)品。雖然從Struts 1到Struts 2有著太大的變化,但是相對(duì)于WebWork,Struts 2的變化很小。當(dāng)Web容器收到 請(qǐng)求(HttpServletRequest)它將請(qǐng)求傳遞給一個(gè)標(biāo)準(zhǔn)的的過(guò)濾鏈包括(ActionContextCleanUp)過(guò)濾器,然后經(jīng)過(guò)Other filters(SiteMesh ,etc)。接下來(lái)需要調(diào)用FilterDispatcher核心控制器,然后它調(diào)用ActionMapper確定請(qǐng)求那個(gè)Action,ActionMapper返回一個(gè)收集Action詳細(xì)信息的ActionMaping對(duì)象。接下來(lái)FilterDispatcher將控制權(quán)委派給ActionProxy,ActionProxy調(diào)用配置管理器(ConfigurationManager) 從配置文件中讀取配置信息(struts.xml),然后創(chuàng)建ActionInvocation對(duì)象,ActionInvocation在調(diào)用Action之前會(huì)依次的調(diào)用所用配置攔截器(Interceptor N) 一旦執(zhí)行結(jié)果返回結(jié)果字符串ActionInvocation負(fù)責(zé)查找結(jié)果字符串對(duì)應(yīng)的(Result)然后執(zhí)行這個(gè)Result Result會(huì)調(diào)用一些模版(JSP)來(lái)呈現(xiàn)頁(yè)面,之后攔截器(Interceptor N)會(huì)在被執(zhí)行(順序和Action執(zhí)行之前相反)最后響應(yīng)(HttpServletResponse)被返回在web.xml中配置的那些過(guò)濾器和(核心控制器)(FilterDispatcher)。3.7 MybatisMyBatis是一個(gè)Java持久化框架,它通過(guò)XML描述符或注解把對(duì)象與存儲(chǔ)過(guò)程或SQL語(yǔ)句關(guān)聯(lián)起來(lái)。與其他的對(duì)象關(guān)系映射框架不同,MyBatis并沒(méi)有將Java對(duì)象與數(shù)據(jù)庫(kù)表關(guān)聯(lián)起來(lái),而是將Java方法與SQL語(yǔ)句關(guān)聯(lián)。MyBatis允許用戶充分利用數(shù)據(jù)庫(kù)的各種功能,例如存儲(chǔ)過(guò)程、視圖、各種復(fù)雜的查詢以及某數(shù)據(jù)庫(kù)的專有特性。如果要對(duì)遺留數(shù)據(jù)庫(kù)、不規(guī)范的數(shù)據(jù)庫(kù)進(jìn)行操作,或者要完全控制SQL的執(zhí)行,MyBatis是一個(gè)不錯(cuò)的選擇。與JDBC相比,MyBatis簡(jiǎn)化了相關(guān)代碼:SQL語(yǔ)句在一行代碼中就能執(zhí)行。MyBatis提供了一個(gè)映射引擎,聲明式的把SQL語(yǔ)句執(zhí)行結(jié)果與對(duì)象樹(shù)映射起來(lái)。通過(guò)使用一種內(nèi)建的類XML表達(dá)式語(yǔ)言,或者使用Apache Velocity集成的插件,SQL語(yǔ)句可以被動(dòng)態(tài)的生成。MyBatis與Spring Framework和Google Guice集成,這使開(kāi)發(fā)者免于依賴性問(wèn)題。MyBatis支持聲明式數(shù)據(jù)緩存(declarative data caching)。當(dāng)一條SQL語(yǔ)句被標(biāo)記為“可緩存”后,首次執(zhí)行它時(shí)從數(shù)據(jù)庫(kù)取得的所有數(shù)據(jù)會(huì)被存儲(chǔ)在一段高速緩存中,今后執(zhí)行這條語(yǔ)句時(shí)就會(huì)從高速緩存中讀取結(jié)果,而不是再次命中數(shù)據(jù)庫(kù)。MyBatis提供了默認(rèn)下基于Java HashMap的緩存實(shí)現(xiàn),以及用于與OSCache、Ehcache、Hazelcast和Memcached連接的默認(rèn)連接器。MyBatis還提供API供其他緩存實(shí)現(xiàn)使用。4 搜索引擎的總體設(shè)計(jì)在前面章節(jié)中對(duì)搜索引擎的技術(shù)的研究和探討基礎(chǔ)上,從本章開(kāi)始將逐步實(shí)現(xiàn)一個(gè)自己的具有爬蟲(chóng)、索引器、搜索器等功能的完整搜索引擎。本章描述了搜索引擎實(shí)現(xiàn)的需求分析、概要設(shè)計(jì)等內(nèi)容,為后面的具體功能實(shí)現(xiàn)打下基礎(chǔ)。4.1 系統(tǒng)概述搜索引擎是根據(jù)用戶的查詢請(qǐng)求,按照一定算法從索引數(shù)據(jù)中查找信息返回給用戶。為了保證用戶查找信息的精度和新鮮度,搜索引擎需要建立并維護(hù)一個(gè)龐大的索引數(shù)據(jù)庫(kù)。一般的搜索引擎由網(wǎng)絡(luò)機(jī)器人程序、索引與搜索程序、索引數(shù)據(jù)庫(kù)等部分組成。雖然在大多數(shù)的實(shí)際應(yīng)用場(chǎng)合中,搜索引擎這樣的系統(tǒng)的運(yùn)行過(guò)程中通常伴隨著超高并發(fā)、超大數(shù)據(jù)量,對(duì)性能會(huì)有苛刻的要求,所以通常使用C/C+語(yǔ)言開(kāi)發(fā)。但在本程序中,為了探索搜索引擎的主要技術(shù),為了效率更高,節(jié)約時(shí)間和成本,所以使用Java語(yǔ)言進(jìn)行開(kāi)發(fā),并引入了Lucene框架的支持。4.2 系統(tǒng)需求從功能上看,搜索引擎需要在后臺(tái)下載和分析網(wǎng)頁(yè)、建立索引,用戶在系統(tǒng)提供的圖形界面中輸入關(guān)鍵詞并得到搜索結(jié)果,由此我們得到了本系統(tǒng)的用例圖,如圖4-1所示。圖 4-1 用例圖4.3 系統(tǒng)結(jié)構(gòu):由系統(tǒng)需求可以看出,系統(tǒng)的組成部分必不可少的有:l 網(wǎng)絡(luò)機(jī)器人l 網(wǎng)頁(yè)分析程序l 網(wǎng)頁(yè)索引程序l 網(wǎng)頁(yè)搜索程序l 搜索程序客戶端通過(guò)以上的分析可以確立系統(tǒng)的基本框架。首先,需要實(shí)現(xiàn)的是一個(gè)BS結(jié)構(gòu)的JSP動(dòng)態(tài)Web程序。程序使用Spring作為類依賴管理器,使程序功能具有更好的獨(dú)立性。使用Struts2作為MVC框架,使程序結(jié)構(gòu)清晰。MyBatis做ORM(對(duì)象關(guān)系映射),簡(jiǎn)化數(shù)據(jù)庫(kù)操作。Lucene框架提供對(duì)索引功能的基本支持。系統(tǒng)結(jié)構(gòu)如圖4-2所示。WWW文檔網(wǎng)絡(luò)機(jī)器人程序建立Lucene索引從數(shù)據(jù)庫(kù)中搜索信息Tomcat服務(wù)器Lucene索引數(shù)據(jù)庫(kù)WWW瀏覽器WWW瀏覽器JSP網(wǎng)絡(luò)機(jī)器人程序圖 4-2 程序結(jié)構(gòu)圖4.4 小結(jié)本章中我們分析了搜索引擎實(shí)現(xiàn)的系統(tǒng)需求,確立了系統(tǒng)結(jié)構(gòu),接下的章節(jié)將講述系統(tǒng)各部分的具體實(shí)現(xiàn)。5 網(wǎng)絡(luò)機(jī)器人的實(shí)現(xiàn)5.1 什么是網(wǎng)絡(luò)機(jī)器人又稱為網(wǎng)絡(luò)爬蟲(chóng),網(wǎng)絡(luò)蜘蛛等。在搜索引擎系統(tǒng)中扮演搜集器的角色。它通常是一個(gè)計(jì)算機(jī)程序,在需要時(shí)運(yùn)行。網(wǎng)絡(luò)機(jī)器人通過(guò)統(tǒng)一資源定位符(URL)來(lái)訪問(wèn)網(wǎng)絡(luò)資源。它會(huì)從一個(gè)入口URL列表開(kāi)始,通過(guò)一定的算法順序,下載并通過(guò)網(wǎng)頁(yè)分析器分析網(wǎng)頁(yè),從網(wǎng)頁(yè)中發(fā)現(xiàn)新的URL 地址,并將新發(fā)現(xiàn)的URL 添加到待訪問(wèn)的URL 列表中。網(wǎng)絡(luò)爬蟲(chóng)將得到的網(wǎng)頁(yè)保存在本地網(wǎng)頁(yè)庫(kù)中,以備網(wǎng)頁(yè)分析器和索引器進(jìn)行處理和使用。5.2 網(wǎng)絡(luò)機(jī)器人結(jié)構(gòu)分析在搜索引擎實(shí)現(xiàn)中,網(wǎng)絡(luò)機(jī)器人和網(wǎng)頁(yè)分析器通常協(xié)同工作,關(guān)系緊密。在獲得網(wǎng)頁(yè)后直接對(duì)其分析,去掉不必要的內(nèi)容,從而減少了磁盤空間的浪費(fèi)。所以這里將網(wǎng)絡(luò)機(jī)器人的實(shí)現(xiàn)和網(wǎng)頁(yè)分析器的實(shí)現(xiàn)放在一起進(jìn)行說(shuō)明。5.2.1 如何解析HTML
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)畢業(yè)典禮教師代表發(fā)言稿模版
- 醫(yī)保政策下的醫(yī)療資源分配倫理
- 供應(yīng)鏈中區(qū)塊鏈技術(shù)的信任機(jī)制構(gòu)建
- CAD工程師職業(yè)汲取的智慧試題及答案
- 闡述商務(wù)禮儀師考試提升自信的途徑試題及答案
- 區(qū)塊鏈技術(shù)安全培訓(xùn)與教育需求分析
- 質(zhì)量控制的數(shù)據(jù)監(jiān)測(cè)與分析試題及答案
- 醫(yī)學(xué)教育中精準(zhǔn)醫(yī)療的應(yīng)用前景分析
- 《胸部檢查觸診》課件
- 酒店服務(wù)流程優(yōu)化的試題及答案
- 《常德旅游景點(diǎn)介紹》課件
- 危險(xiǎn)化學(xué)品安全管理與安全技術(shù)培訓(xùn)課件
- 2023山西云時(shí)代技術(shù)限公司員工招聘136人上岸筆試歷年難、易錯(cuò)點(diǎn)考題附帶參考答案與詳解
- 全國(guó)廣播電視技術(shù)能手調(diào)頻與電視廣播組題庫(kù)
- 2023電力人工智能平臺(tái)架構(gòu)及技術(shù)要求
- 耐甲氧西林金黃色葡萄球(MRSA)檢測(cè)教學(xué)課件
- 成交結(jié)果公告
- 2023年學(xué)位英語(yǔ)考試真題
- 安徽迪合永欣藥業(yè)有限公司原料藥、醫(yī)藥中間體及CDMO項(xiàng)目環(huán)境影響報(bào)告書(shū)
- 2017版銀皮書(shū)(中英文完整版)FIDIC設(shè)計(jì)采購(gòu)施工交鑰匙項(xiàng)目合同條件
- CNG加氣站計(jì)量監(jiān)督管理制度
評(píng)論
0/150
提交評(píng)論