国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
基于JAVA技術(shù)的搜索引擎的研究與實(shí)現(xiàn) - 來自D&DPUB
摘要
網(wǎng)絡(luò)中的資源非常豐富,但是如何有效的搜索信息卻是一件困難的事情。建立搜索引擎就是解決這個問題的最好方法。本文首先詳細(xì)介紹了基于英特網(wǎng)的搜索引擎的系統(tǒng)結(jié)構(gòu),然后從網(wǎng)絡(luò)機(jī)器人、索引引擎、Web服務(wù)器三個方面進(jìn)行詳細(xì)的說明。為了更加深刻的理解這種技術(shù),本人還親自實(shí)現(xiàn)了一個自己的搜索引擎——新聞搜索引擎。
新聞搜索引擎是從指定的Web頁面中按照超連接進(jìn)行解析、搜索,并把搜索到的每條新聞進(jìn)行索引后加入數(shù)據(jù)庫。然后通過Web服務(wù)器接受客戶端請求后從索引數(shù)據(jù)庫中搜索出所匹配的新聞。
本人在介紹搜索引擎的章節(jié)中除了詳細(xì)的闡述技術(shù)核心外還結(jié)合了新聞搜索引擎的實(shí)現(xiàn)代碼來說明,圖文并茂、易于理解。
Abstract
The 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 news search engine by myself.
The news search engine is explained and searched according to hyperlink from a appointed web page, then indexs every searched information and adds it to the index database. Then after receiving the customers‘ requests from the web server, it soon searchs the right news 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.
第一章 引言
面對浩瀚的網(wǎng)絡(luò)資源,搜索引擎為所有網(wǎng)上沖浪的用戶提供了一個入口,毫不夸張的說,所有的用戶都可以從搜索出發(fā)到達(dá)自己想去的網(wǎng)上任何一個地方。因此它也成為除了電子郵件以外最多人使用的網(wǎng)上服務(wù)。
搜索引擎技術(shù)伴隨著WWW的發(fā)展是引人注目的。搜索引擎大約經(jīng)歷了三代的更新發(fā)展:
第一代搜索引擎出現(xiàn)于1994年。這類搜索引擎一般都索引少于1,000,000個網(wǎng)頁,極少重新搜集網(wǎng)頁并去刷新索引。而且其檢索速度非常慢,一般都要等待10秒甚至更長的時間。在實(shí)現(xiàn)技術(shù)上也基本沿用較為成熟的IR(Information Retrieval)、網(wǎng)絡(luò)、數(shù)據(jù)庫等技術(shù),相當(dāng)于利用一些已有技術(shù)實(shí)現(xiàn)的一個WWW上的應(yīng)用。在1994年3月到4月,網(wǎng)絡(luò)爬蟲World Web Worm (WWWW)平均每天承受大約1500次查詢。
大約在1996年出現(xiàn)的第二代搜索引擎系統(tǒng)大多采用分布式方案(多個微型計(jì)算機(jī)協(xié)同工作)來提高數(shù)據(jù)規(guī)模、響應(yīng)速度和用戶數(shù)量,它們一般都保持一個大約50,000,000網(wǎng)頁的索引數(shù)據(jù)庫,每天能夠響應(yīng)10,000,000次用戶檢索請求。1997年11月,當(dāng)時最先進(jìn)的幾個搜索引擎號稱能建立從2,000,000到100,000,000的網(wǎng)頁索引。Altavista搜索引擎聲稱他們每天大概要承受20,000,000次查詢。
2000年搜索引擎2000年大會上,按照Google公司總裁Larry Page的演講,Google正在用3,000臺運(yùn)行Linux系統(tǒng)的個人電腦在搜集Web上的網(wǎng)頁,而且以每天30臺的速度向這個微機(jī)集群里添加電腦,以保持與網(wǎng)絡(luò)的發(fā)展相同步。每臺微機(jī)運(yùn)行多個爬蟲程序搜集網(wǎng)頁的峰值速度是每秒100個網(wǎng)頁,平均速度是每秒48.5個網(wǎng)頁,一天可以搜集超過4,000,000網(wǎng)頁
搜索引擎一詞在國內(nèi)外因特網(wǎng)領(lǐng)域被廣泛使用,然而他的含義卻不盡相同。在美國搜索引擎通常指的是基于因特網(wǎng)的搜索引擎,他們通過網(wǎng)絡(luò)機(jī)器人程序收集上千萬到幾億個網(wǎng)頁,并且每一個詞都被搜索引擎索引,也就是我們說的全文檢索。著名的因特網(wǎng)搜索引擎包括First Search、Google、HotBot等。在中國,搜索引擎通常指基于網(wǎng)站目錄的搜索服務(wù)或是特定網(wǎng)站的搜索服務(wù),本人這里研究的是基于因特網(wǎng)的搜索技術(shù)。
第二章 搜索引擎的結(jié)構(gòu)
2.1系統(tǒng)概述
搜索引擎是根據(jù)用戶的查詢請求,按照一定算法從索引數(shù)據(jù)中查找信息返回給用戶。為了保證用戶查找信息的精度和新鮮度,搜索引擎需要建立并維護(hù)一個龐大的索引數(shù)據(jù)庫。一般的搜索引擎由網(wǎng)絡(luò)機(jī)器人程序、索引與搜索程序、索引數(shù)據(jù)庫等部分組成。
系統(tǒng)結(jié)構(gòu)圖
2.2搜索引擎的構(gòu)成
2.2.1網(wǎng)絡(luò)機(jī)器人
網(wǎng)絡(luò)機(jī)器人也稱為“網(wǎng)絡(luò)蜘蛛”(Spider),是一個功能很強(qiáng)的WEB掃描程序。它可以在掃描WEB頁面的同時檢索其內(nèi)的超鏈接并加入掃描隊(duì)列等待以后掃描。因?yàn)閃EB中廣泛使用超鏈接,所以一個Spider程序理論上可以訪問整個WEB頁面。
為了保證網(wǎng)絡(luò)機(jī)器人遍歷信息的廣度和深度需要設(shè)定一些重要的鏈接并制定相關(guān)的掃描策略。
2.2.2索引與搜索
網(wǎng)絡(luò)機(jī)器人將遍歷得到的頁面存放在臨時數(shù)據(jù)庫中,如果通過SQL直接查詢信息速度將會難以忍受。為了提高檢索效率,需要建立索引,按照倒排文件的格式存放。如果索引不及時跟新的話,用戶用搜索引擎也不能檢索到。
用戶輸入搜索條件后搜索程序?qū)⑼ㄟ^索引數(shù)據(jù)庫進(jìn)行檢索然后把符合查詢要求的數(shù)據(jù)庫按照一定的策略進(jìn)行分級排列并且返回給用戶。
2.2.3 Web服務(wù)器
客戶一般通過瀏覽器進(jìn)行查詢,這就需要系統(tǒng)提供Web服務(wù)器并且與索引數(shù)據(jù)庫進(jìn)行連接??蛻粼跒g覽器中輸入查詢條件,Web服務(wù)器接收到客戶的查詢條件后在索引數(shù)據(jù)庫中進(jìn)行查詢、排列然后返回給客戶端。
2.3搜索引擎的主要指標(biāo)及分析
搜索引擎的主要指標(biāo)有響應(yīng)時間、召回率、準(zhǔn)確率、相關(guān)度等。這些指標(biāo)決定了搜索引擎的技術(shù)指標(biāo)。搜索引擎的技術(shù)指標(biāo)決定了搜索引擎的評價指標(biāo)。好的搜索引擎應(yīng)該是具有較快的反應(yīng)速度和高召回率、準(zhǔn)確率的,當(dāng)然這些都需要搜索引擎技術(shù)指標(biāo)來保障。
召回率:一次搜索結(jié)果中符合用戶要求的數(shù)目與用戶查詢相關(guān)信息的總數(shù)之比
準(zhǔn)確率:一次搜索結(jié)果中符合用戶要求的數(shù)目與該次搜索結(jié)果總數(shù)之比
相關(guān)度:用戶查詢與搜索結(jié)果之間相似度的一種度量
精確度:對搜索結(jié)果的排序分級能力和對垃圾網(wǎng)頁的抗干擾能力
2.4小節(jié)
以上對基于因特網(wǎng)的搜索引擎結(jié)構(gòu)和性能指標(biāo)進(jìn)行了分析,本人在這些研究的基礎(chǔ)上利用JavaTM技術(shù)和一些Open Source工具實(shí)現(xiàn)了一個簡單的搜索引擎——新聞搜索引擎。在接下來的幾章里將會就本人的設(shè)計(jì)進(jìn)行詳細(xì)的分析。
第三章 網(wǎng)絡(luò)機(jī)器人
3.1什么是網(wǎng)絡(luò)機(jī)器人
網(wǎng)絡(luò)機(jī)器人又稱為Spider程序,是一種專業(yè)的Bot程序。用于查找大量的Web頁面。它從一個簡單的Web頁面上開始執(zhí)行,然后通過其超鏈接在訪問其他頁面,如此反復(fù)理論上可以掃描互聯(lián)網(wǎng)上的所有頁面。
基于因特網(wǎng)的搜索引擎是Spider的最早應(yīng)用。例如搜索巨頭Google公司,就利用網(wǎng)絡(luò)機(jī)器人程序來遍歷Web站點(diǎn),以創(chuàng)建并維護(hù)這些大型數(shù)據(jù)庫。
網(wǎng)絡(luò)機(jī)器人還可以通過掃描Web站點(diǎn)的主頁來得到這個站點(diǎn)的文件清單和層次機(jī)構(gòu)。還可以掃描出中斷的超鏈接和拼寫錯誤等。
3.2網(wǎng)絡(luò)機(jī)器人的結(jié)構(gòu)分析
Internet是建立在很多相關(guān)協(xié)議基礎(chǔ)上的,而更復(fù)雜的協(xié)議又建立在系統(tǒng)層協(xié)議之上。Web就是建立在HTTP ( Hypertext Transfer Protocol ) 協(xié)議基礎(chǔ)上,而HTTP又是建立在TCP/IP ( Transmission Control Protocol / Internet Protocol ) 協(xié)議之上,它同時也是一種Socket協(xié)議。所以網(wǎng)絡(luò)機(jī)器人本質(zhì)上是一種基于Socket的網(wǎng)絡(luò)程序。
3.2.1如何解析HTML
因?yàn)閃eb中的信息都是建立在HTML協(xié)議之上的,所以網(wǎng)絡(luò)機(jī)器人在檢索網(wǎng)頁時的第一個問題就是如何解析HTML。在解決如何解析之前,先來介紹下HTML中的幾種數(shù)據(jù)。
文本:除了腳本和標(biāo)簽之外的所有數(shù)據(jù) 注釋:程序員留下的說明文字,對用戶是不可見的 簡單標(biāo)簽:由單個表示的HTML標(biāo)簽 開始標(biāo)簽和結(jié)束標(biāo)簽:用來控制所包含的HTML代碼
我們在進(jìn)行解析的時候不用關(guān)心所有的標(biāo)簽,只需要對其中幾種重要的進(jìn)行解析即可。
超連接標(biāo)簽
超連接定義了WWW通過Internet鏈接文檔的功能。他們的主要目的是使用戶能夠任意遷移到新的頁面,這正是網(wǎng)絡(luò)機(jī)器人最關(guān)心的標(biāo)簽。
圖像映射標(biāo)簽
圖像映射是另一種非常重要的標(biāo)簽。它可以讓用戶通過點(diǎn)擊圖片來遷移到新的頁面中。
表單標(biāo)簽
表單是Web頁面中可以輸入數(shù)據(jù)的單元。許多站點(diǎn)讓用戶填寫數(shù)據(jù)然后通過點(diǎn)擊按鈕來提交內(nèi)容,這就是表單的典型應(yīng)用。
表格標(biāo)簽
表格是HTML的構(gòu)成部分,通常用來格式化存放、顯示數(shù)據(jù)。
我們在具體解析這些HTMl標(biāo)簽有兩種方法:通過JavaTM中的Swing類來解析或者通過Bot包中的HTMLPage類來解析,本人在實(shí)際編程中采用后者。
Bot包中的HTMLPage類用來從指定URL中讀取數(shù)據(jù)并檢索出有用的信息。下面給出該類幾種重要的方法。
HTMLPage構(gòu)造函數(shù) 構(gòu)造對象并指定用于通訊的HTTP對象
Public HTMLPage(HTTP http)  GetForms方法 獲取最后一次調(diào)用Open方法檢索到的表單清單
Public Vector getForms()  GetHTTP方法 獲取發(fā)送給構(gòu)造函數(shù)的HTTP對象
Public HTTP getHTTP()  GetImage方法 獲取指定頁面的圖片清單
Public Vector getImage()  GetLinks方法 獲取指定頁面的連接清單
Public Vector getLinks()  Open方法 打開一個頁面并讀入該頁面,若指定了回調(diào)對象則給出所有該對象數(shù)據(jù)
Public void open(String url,HTMLEditorKit.ParserCallback a)
3.2.2 Spider程序結(jié)構(gòu)
網(wǎng)絡(luò)機(jī)器人必須從一個網(wǎng)頁遷移到另一個網(wǎng)頁,所以必須找到該頁面上的超連接。程序首先解析網(wǎng)頁的HTML代碼,查找該頁面內(nèi)的超連接然后通過遞歸和非遞歸兩種結(jié)構(gòu)來實(shí)現(xiàn)Spider程序。
遞歸結(jié)構(gòu)
遞歸是在一個方法中調(diào)用自己本身的程序設(shè)計(jì)技術(shù)。雖然比較容易實(shí)現(xiàn)但耗費(fèi)內(nèi)存且不能使用多線程技術(shù),故不適合大型項(xiàng)目。
非遞歸結(jié)構(gòu)
這種方法使用隊(duì)列的數(shù)據(jù)結(jié)構(gòu),當(dāng)Spider程序發(fā)現(xiàn)超連接后并不調(diào)用自己本身而是把超連接加入到等待隊(duì)列中。當(dāng)Spider程序掃描完當(dāng)前頁面后會根據(jù)制定的策略訪問隊(duì)列中的下一個超連接地址。
雖然這里只描述了一個隊(duì)列,但在實(shí)際編程中用到了四個隊(duì)列,他們每個隊(duì)列都保存著同一處理狀態(tài)的URL。
等待隊(duì)列 在這個隊(duì)列中,URL等待被Spider程序處理。新發(fā)現(xiàn)的URL也被加入到這個隊(duì)列中
處理隊(duì)列 當(dāng)Spider程序開始處理時,他們被送到這個隊(duì)列中
錯誤隊(duì)列 如果在解析網(wǎng)頁時出錯,URL將被送到這里。該隊(duì)列中的URL不能被移入其他隊(duì)列中
完成隊(duì)列 如果解析網(wǎng)頁沒有出錯,URL將被送到這里。該隊(duì)列中的URL不能被移入其它隊(duì)列中
同一時間URL只能在一個隊(duì)列中,我們把它稱為URL的狀態(tài)。
以上的圖表示了隊(duì)列的變化過程,在這個過程中,當(dāng)一個URL被加入到等待隊(duì)列中時Spider程序就會開始運(yùn)行。只要等待隊(duì)列中有一個網(wǎng)頁或Spider程序正在處理一個網(wǎng)頁,程序就會繼續(xù)他的工作。當(dāng)?shù)却?duì)列為空并且當(dāng)前沒有任何網(wǎng)頁時,Spider程序就會停止它的工作。
3.2.3如何構(gòu)造Spider程序
在構(gòu)造Spider程序之前我們先了解下程序的各個部分是如何共同工作的。以及如何對這個程序進(jìn)行擴(kuò)展。
流程圖如下所示:
IspiderReportable接口
這是一個必須實(shí)現(xiàn)的接口,可以通過回調(diào)函數(shù)接受Spider所遇到的頁面。接口定義了Spider向他的控制者發(fā)送的幾個事件。通過提供對每個事件的處理程序,可以創(chuàng)建各種Spider程序。下面是他的接口聲明:
public interface IspiderReportable{
public boolean foundInternalLink(String url);
public boolean foundExternalLink(String url);
public boolean foundOtherLink(String url);
public void processPage(HTTP page);
public void completePage(HTTP page,boolean error);
public boolean getRemoveQuery();
public void SpiderComplete(); }
3.2.4如何提高程序性能
Internet中擁有海量的Web頁面,如果開發(fā)出高效的Spider程序是非常重要的。下面就來介紹下幾種提高性能的技術(shù):
Java的多線程技術(shù)
線程是通過程序的一條執(zhí)行路線。多線程是一個程序同時運(yùn)行多個任務(wù)的能力。它是在一個程序的內(nèi)部進(jìn)行分工合作。
優(yōu)化程序的通常方法是確定瓶頸并改進(jìn)他。瓶頸是一個程序中最慢的部分,他限制了其他任務(wù)的運(yùn)行。據(jù)個例子說明:一個Spider程序需要下載十個頁面,要完成這一任務(wù),程序必須向服務(wù)器發(fā)出請求然后接受這些網(wǎng)頁。當(dāng)程序等待響應(yīng)的時候其他任務(wù)不能執(zhí)行,這就影響了程序的效率。如果用多線程技術(shù)可以讓這些網(wǎng)頁的等待時間合在一起,不用互相影響,這就可以極大的改進(jìn)程序性能。
數(shù)據(jù)庫技術(shù)
當(dāng)Spider程序訪問一個大型Web站點(diǎn)時,必須使用一種有效的方法來存儲站點(diǎn)隊(duì)列。這些隊(duì)列管理Spider程序必須維護(hù)大型網(wǎng)頁的列表。如果把他們放在內(nèi)存中將會是性能下降,所以我們可以把他們放在數(shù)據(jù)庫中減少系統(tǒng)資源的消耗。
3.2.5網(wǎng)絡(luò)機(jī)器人的代碼分析
程序結(jié)構(gòu)圖如下:
CMSware::cms_if gte vml 1]><[endif?>
程序代碼實(shí)現(xiàn)如下:
package news; /**  *  新聞搜索引擎 *    版本 1.0  */
import com.heaton.bot.HTTP;
import com.heaton.bot.HTTPSocket;
import com.heaton.bot.ISpiderReportable;
import com.heaton.bot.IWorkloadStorable;
import com.heaton.bot.Spider;
import com.heaton.bot.SpiderInternalWorkload; /**  * 構(gòu)造一個Bot程序  */
public class Searcher     implements ISpiderReportable {
public static void main(String[] args)
throws Exception {     IWorkloadStorable wl = new SpiderInternalWorkload();
Searcher _searcher = new Searcher();
Spider _spider = new Spider(_searcher, "http://127.0.0.1/news.htm", new HTTPSocket(), 100, wl);  _spider.setMaxBody(100);
_spider.start();   } // 發(fā)現(xiàn)內(nèi)部連接時調(diào)用,url表示程序發(fā)現(xiàn)的URL,若返回true則加入作業(yè)中,否則不加入。
public boolean foundInternalLink(String url) {
return false;   } // 發(fā)現(xiàn)外部連接時調(diào)用,url表示程序所發(fā)現(xiàn)的URL,若返回true則把加入作業(yè)中,否則不加入。
public boolean foundExternalLink(String url) {
return false;   } // 當(dāng)發(fā)現(xiàn)其他連接時調(diào)用這個方法。其他連接指的是非HTML網(wǎng)頁,可能是E-mail或者FTP
public boolean foundOtherLink(String url) {
return false;   } // 用于處理網(wǎng)頁,這是Spider程序要完成的實(shí)際工作。
public void processPage(HTTP http) {
System.out.println("掃描網(wǎng)頁:" + http.getURL());
new HTMLParse(http).start();   } // 用來請求一個被處理的網(wǎng)頁。
public void completePage(HTTP http, boolean error) {   } // 由Spider程序調(diào)用以確定查詢字符串是否應(yīng)刪除。如果隊(duì)列中的字符串應(yīng)當(dāng)刪除,方法返回真。
public boolean getRemoveQuery() {
return true;   } // 當(dāng)Spider程序沒有剩余的工作時調(diào)用這個方法。
public void     spiderComplete() {   }
}
3.3小節(jié)
在本章中,首先介紹了網(wǎng)絡(luò)機(jī)器人的基本概念,然后具體分析了Spider程序的結(jié)構(gòu)和功能。在最后還結(jié)合具體代碼進(jìn)行了詳細(xì)說明。
本人在編程中運(yùn)用了JavaTM技術(shù),主要涉及到了net和io兩個包。此外還用了第三方開發(fā)包Bot(由Jeff Heaton提供的開發(fā)包)。
第四章 基于lucene的索引與搜索
4.1什么是Lucene全文檢索
Lucene是Jakarta Apache的開源項(xiàng)目。它是一個用Java寫的全文索引引擎工具包,可以方便的嵌入到各種應(yīng)用中實(shí)現(xiàn)針對應(yīng)用的全文索引/檢索功能。
4.2 Lucene的原理分析
4.2.1全文檢索的實(shí)現(xiàn)機(jī)制
Lucene的API接口設(shè)計(jì)的比較通用,輸入輸出結(jié)構(gòu)都很像數(shù)據(jù)庫的表==>記錄==>字段,所以很多傳統(tǒng)的應(yīng)用的文件、數(shù)據(jù)庫等都可以比較方便的映射到Lucene的存儲結(jié)構(gòu)和接口中。
總體上看:可以先把Lucene當(dāng)成一個支持全文索引的數(shù)據(jù)庫系統(tǒng)。 索引數(shù)據(jù)源:doc(field1,field2...) doc(field1,field2...) \ indexer / _____________ | Lucene Index| -------------- searcher \
結(jié)果輸出:Hits(doc(field1,field2) doc(field1...))
Document:一個需要進(jìn)行索引的“單元”,一個Document由多個字段組成
Field:字段
Hits:查詢結(jié)果集,由匹配的Document組成
4.2.2 Lucene的索引效率
通常書籍后面常常附關(guān)鍵詞索引表(比如:北京:12, 34頁,上海:3,77頁……),它能夠幫助讀者比較快地找到相關(guān)內(nèi)容的頁碼。而數(shù)據(jù)庫索引能夠大大提高查詢的速度原理也是一樣,想像一下通過書后面的索引查找的速度要比一頁一頁地翻內(nèi)容高多少倍……而索引之所以效率高,另外一個原因是它是排好序的。對于檢索系統(tǒng)來說核心是一個排序問題。
由于數(shù)據(jù)庫索引不是為全文索引設(shè)計(jì)的,因此,使用like "%keyword%"時,數(shù)據(jù)庫索引是不起作用的,在使用like查詢時,搜索過程又變成類似于一頁頁翻書的遍歷過程了,所以對于含有模糊查詢的數(shù)據(jù)庫服務(wù)來說,LIKE對性能的危害是極大的。如果是需要對多個關(guān)鍵詞進(jìn)行模糊匹配:like"%keyword1%" and like "%keyword2%" ...其效率也就可想而知了。所以建立一個高效檢索系統(tǒng)的關(guān)鍵是建立一個類似于科技索引一樣的反向索引機(jī)制,將數(shù)據(jù)源(比如多篇文章)排序順序存儲的同時,有另外一個排好序的關(guān)鍵詞列表,用于存儲關(guān)鍵詞==>文章映射關(guān)系,利用這樣的映射關(guān)系索引:[關(guān)鍵詞==>出現(xiàn)關(guān)鍵詞的文章編號,出現(xiàn)次數(shù)(甚至包括位置:起始偏移量,結(jié)束偏移量),出現(xiàn)頻率],檢索過程就是把模糊查詢變成多個可以利用索引的精確查詢的邏輯組合的過程。從而大大提高了多關(guān)鍵詞查詢的效率,所以,全文檢索問題歸結(jié)到最后是一個排序問題。
由此可以看出模糊查詢相對數(shù)據(jù)庫的精確查詢是一個非常不確定的問題,這也是大部分?jǐn)?shù)據(jù)庫對全文檢索支持有限的原因。Lucene最核心的特征是通過特殊的索引結(jié)構(gòu)實(shí)現(xiàn)了傳統(tǒng)數(shù)據(jù)庫不擅長的全文索引機(jī)制,并提供了擴(kuò)展接口,以方便針對不同應(yīng)用的定制??梢酝ㄟ^一下表格對比一下數(shù)據(jù)庫的模糊查詢:
Lucene全文索引引擎
數(shù)據(jù)庫
索引
將數(shù)據(jù)源中的數(shù)據(jù)都通過全文索引一一建立反向索引
對于LIKE查詢來說,數(shù)據(jù)傳統(tǒng)的索引是根本用不上的。數(shù)據(jù)需要逐個便利記錄進(jìn)行GREP式的模糊匹配,比有索引的搜索速度要有多個數(shù)量級的下降。
匹配效果
通過詞元(term)進(jìn)行匹配,通過語言分析接口的實(shí)現(xiàn),可以實(shí)現(xiàn)對中文等非英語的支持。
使用:like "%net%" 會把netherlands也匹配出來, 多個關(guān)鍵詞的模糊匹配:使用like "%com%net%":就不能匹配詞序顛倒的xxx.net..xxx.com
匹配度
有匹配度算法,將匹配程度(相似度)比較高的結(jié)果排在前面。
沒有匹配程度的控制:比如有記錄中net出現(xiàn)5詞和出現(xiàn)1次的,結(jié)果是一樣的。
結(jié)果輸出
通過特別的算法,將最匹配度最高的頭100條結(jié)果輸出,結(jié)果集是緩沖式的小批量讀取的。
返回所有的結(jié)果集,在匹配條目非常多的時候(比如上萬條)需要大量的內(nèi)存存放這些臨時結(jié)果集。
可定制性
通過不同的語言分析接口實(shí)現(xiàn),可以方便的定制出符合應(yīng)用需要的索引規(guī)則(包括對中文的支持)
沒有接口或接口復(fù)雜,無法定制
結(jié)論
高負(fù)載的模糊查詢應(yīng)用,需要負(fù)責(zé)的模糊查詢的規(guī)則,索引的資料量比較大
使用率低,模糊匹配規(guī)則簡單或者需要模糊查詢的資料量少
4.2.3 中文切分詞機(jī)制
對于中文來說,全文索引首先還要解決一個語言分析的問題,對于英文來說,語句中單詞之間是天然通過空格分開的,但亞洲語言的中日韓文語句中的字是一個字挨一個,所有,首先要把語句中按“詞”進(jìn)行索引的話,這個詞如何切分出來就是一個很大的問題。
首先,肯定不能用單個字符作(si-gram)為索引單元,否則查“上?!睍r,不能讓含有“海上”也匹配。但一句話:“北京天安門”,計(jì)算機(jī)如何按照中文的語言習(xí)慣進(jìn)行切分呢?“北京 天安門” 還是“北 京 天安門”?讓計(jì)算機(jī)能夠按照語言習(xí)慣進(jìn)行切分,往往需要機(jī)器有一個比較豐富的詞庫才能夠比較準(zhǔn)確的識別出語句中的單詞。另外一個解決的辦法是采用自動切分算法:將單詞按照2元語法(bigram)方式切分出來,比如:"北京天安門" ==> "北京 京天 天安 安門"。這樣,在查詢的時候,無論是查詢"北京" 還是查詢"天安門",將查詢詞組按同樣的規(guī)則進(jìn)行切分:"北京","天安安門",多個關(guān)鍵詞之間按與"and"的關(guān)系組合,同樣能夠正確地映射到相應(yīng)的索引中。這種方式對于其他亞洲語言:韓文,日文都是通用的。
基于自動切分的最大優(yōu)點(diǎn)是沒有詞表維護(hù)成本,實(shí)現(xiàn)簡單,缺點(diǎn)是索引效率低,但對于中小型應(yīng)用來說,基于2元語法的切分還是夠用的?;?元切分后的索引一般大小和源文件差不多,而對于英文,索引文件一般只有原文件的30%-40%不同,
自動切分
詞表切分
實(shí)現(xiàn)
實(shí)現(xiàn)非常簡單
實(shí)現(xiàn)復(fù)雜
查詢
增加了查詢分析的復(fù)雜程度,
適于實(shí)現(xiàn)比較復(fù)雜的查詢語法規(guī)則
存儲效率
索引冗余大,索引幾乎和原文一樣大
索引效率高,為原文大小的30%左右
維護(hù)成本
無詞表維護(hù)成本
詞表維護(hù)成本非常高:中日韓等語言需要分別維護(hù)。 還需要包括詞頻統(tǒng)計(jì)等內(nèi)容
適用領(lǐng)域
嵌入式系統(tǒng):運(yùn)行環(huán)境資源有限 分布式系統(tǒng):無詞表同步問題 多語言環(huán)境:無詞表維護(hù)成本
對查詢和存儲效率要求高的專業(yè)搜索引擎
4.3 Lucene與Spider的結(jié)合
首先構(gòu)造一個Index類用來實(shí)現(xiàn)對內(nèi)容進(jìn)行索引。
<[endif?> 代碼分析如下: package news; /** * 新聞搜索引擎 * * 版本1.0
*/ import java.io.IOException;
import org.apache.lucene.analysis.cn.ChineseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
public class Index {
IndexWriter _writer = null;
Index() throws Exception {
_writer = new IndexWriter("c:\\News\\index",new ChineseAnalyzer(), true);
} /** * 把每條新聞加入索引中 * @param url 新聞的url * @param title 新聞的標(biāo)題 * @throws java.lang.Exception */
void AddNews(String url, String title) throws Exception {
Document _doc = new Document();
_doc.add(Field.Text("title", title));
_doc.add(Field.UnIndexed("url", url));
_writer.addDocument(_doc); } /**優(yōu)化并且清理資源 @throws java.lang.Exception */ void close() throws Exception {
_writer.optimize();
_writer.close(); }
}
然后構(gòu)造一個HTML解析類,把通過bot程序收集的新聞內(nèi)容進(jìn)行索引。
<[endif?>
代碼分析如下: package news; /** * 新聞搜索引擎 * 版本1.0 */
import java.util.Iterator;
import java.util.Vector;
import com.heaton.bot.HTMLPage;
import com.heaton.bot.HTTP;
import com.heaton.bot.Link;
public class HTMLParse {
HTTP _http = null;
public HTMLParse(HTTP http) { _http = http; } /**對Web頁面進(jìn)行解析后建立索引*/ public void start() {
try { HTMLPage _page = new HTMLPage(_http);
_page.open(_http.getURL(), null);
Vector _links = _page.getLinks();
Index _index = new Index();
Iterator _it = _links.iterator();
int n = 0;
while (_it.hasNext()) {
Link _link = (Link) _it.next();
String _herf = input(_link.getHREF().trim());
String _title = input(_link.getPrompt().trim());
_index.AddNews(_herf, _title);
n++;
}
System.out.println("共掃描到" + n + "條新聞");
_index.close();
}
catch (Exception ex) {
System.out.println(ex); }
} /** * 解決java中的中文問題 * @param str 輸入的中文 * @return 經(jīng)過解碼的中文 */ public static String input(String str) {
String temp = null;
if (str != null) {
try {
temp = new String(str.getBytes("ISO8859_1"));
}
catch (Exception e) { }
}
return temp;
}
}
4.4小節(jié)
在進(jìn)行海量數(shù)據(jù)搜索時,如果使用單純的數(shù)據(jù)庫技術(shù),那將是非常痛苦的。速度將是極大的瓶頸。所以本章提出了使用全文搜索引擎Lucene進(jìn)行索引、搜索。
最后,還結(jié)合了具體代碼說明了如何把Lucene全文搜索引擎和Spider程序互相集合來實(shí)現(xiàn)新聞搜索的功能。
第五章 基于Tomcat的Web服務(wù)器
5.1什么是基于Tomcat的Web服務(wù)器
Web服務(wù)器是在網(wǎng)絡(luò)中為實(shí)現(xiàn)信息發(fā)布、資料查詢、數(shù)據(jù)處理等諸多應(yīng)用搭建基本平臺的服務(wù)器。Web服務(wù)器如何工作:在Web頁面處理中大致可分為三個步驟,第一步,Web瀏覽器向一個特定的服務(wù)器發(fā)出Web頁面請求;第二步,Web服務(wù)器接收到Web頁面請求后,尋找所請求的Web頁面,并將所請求的Web頁面?zhèn)魉徒oWeb瀏覽器;第三步,Web服務(wù)器接收到所請求的Web頁面,并將它顯示出來。
Tomcat是一個開放源代碼、運(yùn)行servlet和JSP Web應(yīng)用軟件的基于Java的Web應(yīng)用軟件容器。Tomcat由Apache-Jakarta子項(xiàng)目支持并由來自開放性源代碼Java社區(qū)的志愿者進(jìn)行維護(hù)。Tomcat Server是根據(jù)servlet和JSP規(guī)范進(jìn)行執(zhí)行的,因此我們就可以說Tomcat Server也實(shí)行了Apache-Jakarta規(guī)范且比絕大多數(shù)商業(yè)應(yīng)用軟件服務(wù)器要好。
5.2用戶接口設(shè)計(jì)
5.3.1客戶端設(shè)計(jì)
一個良好的查詢界面非常重要,例如Googl就以她簡潔的查詢界面而聞名。我在設(shè)計(jì)的時候也充分考慮了實(shí)用性和簡潔性。
<[endif?>查詢界面截圖如下:
搜索結(jié)果截圖如下:
5.3.2服務(wù)端設(shè)計(jì)
主要利用JavaTM Servlet技術(shù)實(shí)現(xiàn),用戶通過GET方法從客戶端向服務(wù)端提交查詢條件,服務(wù)端通過Tomcat的Servlet容器接受并分析提交參數(shù),再調(diào)用lucene的開發(fā)包進(jìn)行搜索操作。最后把搜索的結(jié)果以HTTP消息包的形式發(fā)送至客戶端,從而完成一次搜索操作。
服務(wù)端Servlet程序的結(jié)構(gòu)如下:
<[endif?>
實(shí)現(xiàn)的關(guān)鍵代碼如下: public void Search(String qc, PrintWriter out) throws Exception { // 從索引目錄創(chuàng)建索引 IndexSearcher _searcher = new IndexSearcher("c:\ews\\index"); // 創(chuàng)建標(biāo)準(zhǔn)分析器
Analyzer analyzer = new ChineseAnalyzer(); // 查詢條件
String line = qc; // Query是一個抽象類
Query query = QueryParser.parse(line, "title", analyzer);
out.println("<html>");
out.println("<head><title>搜索結(jié)果</title></head>");
out.println("<body bgcolor=#ffffff>");
out.println("<center>" + "<form action=‘/NewsServer/results‘ method=‘get‘>" + "<font face=‘華文中宋‘ color=‘#3399FF‘>新聞搜索引擎</font>:" + "<input type=‘text‘ name=‘QueryContent‘ size=‘20‘>" + "<input type=‘submit‘ name=‘submit‘ value=‘開始搜索‘>" + "</form></center>" );
out.println("<p>搜索關(guān)鍵字:<font color=red>" + query.toString("title") + "</font></p>");
Hits hits = _searcher.search(query);
out.println(" 總共找到<font color=red>" + hits.length() + "</font>條新聞<br>");
final int HITS_PER_PAGE = 10;
for (int start = 0; start < hits.length(); start += HITS_PER_PAGE) {
int end = Math.min(hits.length(), start + HITS_PER_PAGE);
for (int i = start; i < end; i++) {
Document doc = hits.doc(i);
String url = doc.get("url");
if (url != null) {
out.println( (i + 1) + " <a href=‘" + url + "‘>" +replace(doc.get("title"), qc) +"</a><br>");} else {
System.out.println("沒有找到!");
}
}
}
out.println("</body></html>");
_searcher.close(); };
5.3在Tomcat上部署項(xiàng)目
Tomcat中的應(yīng)用程序是一個WAR(Web Archive)文件。WAR是Sun提出的一種Web應(yīng)用程序格式,與JAR類似,也是許多文件的一個壓縮包。這個包中的文件按一定目錄結(jié)構(gòu)來組織:通常其根目錄下包含有Html和Jsp文件或者包含這兩種文件的目錄,另外還會有一個WEB-INF目錄,這個目錄很重要。通常在WEB-INF目錄下有一個web.xml文件和一個classes目錄,web.xml是這個應(yīng)用的配置文件,而classes目錄下則包含編譯好的Servlet類和Jsp或Servlet所依賴的其它類(如JavaBean)。通常這些所依賴的類也可以打包成JAR放到WEB-INF下的lib目錄下,當(dāng)然也可以放到系統(tǒng)的CLASSPATH中。
在Tomcat中,應(yīng)用程序的部署很簡單,你只需將你的WAR放到Tomcat的webapp目錄下,Tomcat會自動檢測到這個文件,并將其解壓。你在瀏覽器中訪問這個應(yīng)用的Jsp時,通常第一次會很慢,因?yàn)門omcat要將Jsp轉(zhuǎn)化為Servlet文件,然后編譯。編譯以后,訪問將會很快。
5.4小節(jié)
本章中詳細(xì)介紹了如何構(gòu)架基于Tomcat的Web服務(wù)器,使得用戶通過瀏覽器進(jìn)行新聞的搜索,最后還對Tomcat如何部署進(jìn)行了說明。
第六章 搜索引擎策略
6.1簡介
隨著信息多元化的增長,千篇一律的給所有用戶同一個入口顯然已經(jīng)不能滿足特定用戶更深入的查詢需求。同時,這樣的通用搜索引擎在目前的硬件條件下,要及時更新以得到互聯(lián)網(wǎng)上較全面的信息是不太可能的。針對這種情況,我們需要一個分類細(xì)致精確、數(shù)據(jù)全面深入、更新及時的面向主題的搜索引擎。
由于主題搜索運(yùn)用了人工分類以及特征提取等智能化策略,因此它比上面提到的前三代的搜索引擎將更加有效和準(zhǔn)確,我們將這類完善的主題搜索引擎稱為第四代搜索引擎。
6.2面向主題的搜索策略
6.2.1導(dǎo)向詞
導(dǎo)向詞就是一組關(guān)鍵詞,它們會引導(dǎo)搜索器按照一定順序搜索整個網(wǎng)絡(luò),使得搜索引擎可以在最短的時間里面得到最全面的跟某一個主題相關(guān)的信息。通過設(shè)置導(dǎo)向詞以及它們對應(yīng)的不同權(quán)值,所有標(biāo)題、作者、正文或超連接文本中含有某一導(dǎo)向詞的網(wǎng)頁都會被賦予較高的權(quán)值,在搜索的時候會優(yōu)先考慮。搜索器在向主控程序獲得URL的時候也是按照權(quán)值由高到低的順序。反之,搜索器在向主控程序提交新的URL和它的權(quán)值的時候,主控程序會按照權(quán)值預(yù)先排序,以便下一次有序的發(fā)給搜索器。
6.2.2網(wǎng)頁評級
在考慮一個網(wǎng)頁被另一個網(wǎng)頁的引用時候,不是單純的將被引用網(wǎng)頁的Hit Number加一,而是將引用網(wǎng)頁的連接數(shù)作為權(quán),同時將該引用網(wǎng)頁的重要性也考慮進(jìn)來(看看上面提到的例子,Yahoo!引用的網(wǎng)頁顯然比個人網(wǎng)站引用的網(wǎng)頁重要,因?yàn)閅ahoo!本身很重要),就可以得到擴(kuò)展后的網(wǎng)頁評分。
最早提出網(wǎng)頁評分的計(jì)算方法是Google。它們提出了一個“隨機(jī)沖浪”模型來描述網(wǎng)絡(luò)用戶對網(wǎng)頁的訪問行為。模型假設(shè)如下:
1) 用戶隨機(jī)的選擇一個網(wǎng)頁作為上網(wǎng)的起始網(wǎng)頁;
2) 看完這個網(wǎng)頁后,從該網(wǎng)頁內(nèi)所含的超鏈內(nèi)隨機(jī)的選擇一個頁面繼續(xù)進(jìn)行瀏覽;
3) 沿著超鏈前進(jìn)了一定數(shù)目的網(wǎng)頁后,用戶對這個主題感到厭倦,重新隨機(jī)選擇一個網(wǎng)頁進(jìn)行瀏覽,并重復(fù)2和3。
按照以上的用戶行為模型,每個網(wǎng)頁可能被訪問到的次數(shù)就是該網(wǎng)頁的鏈接權(quán)值。如何計(jì)算這個權(quán)值呢?PageRank采用以下公式進(jìn)行計(jì)算:
<[endif?> <[endif?>
其中Wj代表第j個網(wǎng)頁的權(quán)值;lij只取0、1值,代表從網(wǎng)頁i到網(wǎng)頁j是否存在鏈接;ni代表網(wǎng)頁i有多少個鏈向其它網(wǎng)頁的鏈接;d代表“隨機(jī)沖浪”中沿著鏈接訪問網(wǎng)頁的平均次數(shù)。選擇合適的數(shù)值,遞歸的使用以上公式,即可得到理想的網(wǎng)頁鏈接權(quán)值。該方法能夠大幅度的提高簡單檢索返回結(jié)果的質(zhì)量,同時能夠有效的防止網(wǎng)頁編寫者對搜索引擎的欺騙。因此可以將其廣泛的應(yīng)用在檢索器提供給用戶的網(wǎng)頁排序上,對于網(wǎng)頁評分越高的網(wǎng)頁,就排的越前。
6.2.3權(quán)威網(wǎng)頁和中心網(wǎng)頁
權(quán)威網(wǎng)頁
顧名思義,是給定主題底下的一系列重要的權(quán)威的網(wǎng)頁。其重要性和權(quán)威性主要體現(xiàn)在以下兩點(diǎn):
2) 從單個網(wǎng)頁來看,它的網(wǎng)頁內(nèi)容本身對于這個給定主題來說是重要的;
3) 從這個網(wǎng)頁在整個互聯(lián)網(wǎng)重的地位來看,這個網(wǎng)頁是被其他網(wǎng)頁承認(rèn)為權(quán)威的,這主要體現(xiàn)在跟這個主題相關(guān)的很多網(wǎng)頁都有鏈接指向這個網(wǎng)頁。
由此可見,權(quán)威網(wǎng)頁對于主題搜索引擎的實(shí)現(xiàn)有很重大的意義。主題搜索引擎一個很關(guān)鍵的任務(wù)就是從互聯(lián)網(wǎng)上無數(shù)的網(wǎng)頁之中最快最準(zhǔn)的找出這些可數(shù)的權(quán)威網(wǎng)頁,并為他們建立索引。這也是有效區(qū)別主題搜索引擎和前三代傳統(tǒng)通用搜索引擎的重要特征。
中心網(wǎng)頁
是包含很多指向權(quán)威網(wǎng)頁的超鏈接的網(wǎng)頁。最典型中心網(wǎng)頁的一個例子是Yahoo!,它的目錄結(jié)構(gòu)指向了很多主題的權(quán)威網(wǎng)頁,使得它兼任了很多主題的中心網(wǎng)頁。由中心網(wǎng)頁出發(fā),輕而易舉的就會到達(dá)大量的權(quán)威網(wǎng)頁。因此,它對于主題搜索引擎的實(shí)現(xiàn)也起了很大的意義。
權(quán)威網(wǎng)頁和中心網(wǎng)頁之間是一種互相促進(jìn)的關(guān)系:一個好的中心網(wǎng)頁必然要有超鏈接指向多個權(quán)威網(wǎng)頁;一個好的權(quán)威網(wǎng)頁反過來也必然被多個中心網(wǎng)頁所鏈接。
6.3小節(jié)
本章介紹了面向主題的搜索策略,并作了詳細(xì)闡述。雖然在新聞搜索中并沒有應(yīng)用到搜索策略,但是對于WWW搜索引擎來說,搜索策略是極其重要的。他直接關(guān)系到搜索的質(zhì)量以及匹配度等性能。
參考文獻(xiàn)
文獻(xiàn)資料
1 《Programming Spiders,Bots,and Aggregator in Java》[美]Jeff Heaton著
2 《搜索引擎與信息獲取技術(shù)》徐寶文、張衛(wèi)豐著
3 《基于Java的全文搜索引擎Lucene》車東著
4 《主題搜索引擎的設(shè)計(jì)與實(shí)現(xiàn)》羅旭著
5 《Thinking in Java 》[美]Bruce Eckel著
開發(fā)工具、平臺及資源:
1 Borland Jbuilder 9
2 Sun JDK 1.4.1
3 Jakarta Tomcat 4.1
4 Jakarta Lucene
5 Package Bot
From:http://www.kissjava.com/doc/j2se/hardin/2005-04-19/4986.html 2005-9
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
NUTCH介紹--抓?。?)
開源爬蟲Labin,Nutch,Neritrix介紹和對比
SEO之搜索引擎爬蟲
網(wǎng)絡(luò)爬蟲講解(附j(luò)ava實(shí)現(xiàn)的實(shí)例)
爬蟲原理與數(shù)據(jù)抓取
爬蟲技術(shù)(一):概述
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服