書名: 自己動(dòng)手寫搜索引擎作者名: 羅剛編著本章字?jǐn)?shù): 1631字更新時(shí)間: 2018-12-28 22:52:09
1.6 搜索引擎基本技術(shù)
一個(gè)基本的搜索包括采集數(shù)據(jù)的爬蟲和索引庫管理以及搜索頁面展現(xiàn)等部分。本書的第2章到第6章將分別詳細(xì)介紹這些內(nèi)容。
1.6.1 網(wǎng)絡(luò)蜘蛛
網(wǎng)絡(luò)蜘蛛(Spider)又被稱作網(wǎng)絡(luò)機(jī)器人(Robot),或者Crawler,它的主要目的是為獲取互聯(lián)網(wǎng)上的信息。網(wǎng)絡(luò)蜘蛛利用主頁中的超文本鏈接遍歷Web,通過URL引用從一個(gè)HTML文檔爬行到另一個(gè)HTML文檔。http://dmoz.org是整個(gè)互聯(lián)網(wǎng)抓取的入口。網(wǎng)絡(luò)蜘蛛收集信息可有多種用途,如建立索引、HTML文件的驗(yàn)證、URL鏈接驗(yàn)證、獲取更新信息、站點(diǎn)鏡像等。網(wǎng)絡(luò)蜘蛛建立的頁面數(shù)據(jù)庫包含根據(jù)頁面內(nèi)容生成的文摘,這是一個(gè)重要特色。
在抓取網(wǎng)頁時(shí),大部分網(wǎng)絡(luò)機(jī)器人會(huì)遵循Robot.txt協(xié)議。
網(wǎng)站本身可以聲明不想被搜索引擎收入的內(nèi)容。可以有兩種實(shí)現(xiàn)方式:第一種方式是在你的站點(diǎn)上增加一個(gè)純文本文件http://www.yourdomain.com/robots.txt;另外一種方式是直接在HTML頁面中使用robots的meta標(biāo)簽。
1.6.2 全文索引結(jié)構(gòu)
有如下兩個(gè)文檔:
● Doc1:When in Rome, do as the Romans do.
● Doc2:When do you come back from Rome?
文檔經(jīng)過如下停用詞表的過濾:
in as the from
在Lucene中形成的索引結(jié)構(gòu)如圖1-5所示。

圖1-5 Lucene中形成的索引結(jié)構(gòu)
在Lucene的索引文件中,以tis為后綴的文件中包含了term信息;以frq為后綴的文件包含term的文檔編號(hào)和在文檔中出現(xiàn)的頻率信息;以prx為后綴的文件包含了term出現(xiàn)的位置。
折半查找Term。對于特別大的順序集合可以用插值查找的方法提高查找速度。
1.6.3 Lucene全文檢索引擎
Lucene是一個(gè)開放源代碼的全文索引庫。經(jīng)過十多年的發(fā)展,Lucene擁有了大量的用戶和活躍的開發(fā)團(tuán)隊(duì)。如果說Google是擁有最多用戶訪問的搜索引擎網(wǎng)站,那么擁有最多開發(fā)人員支持的搜索包也許是Lucene。它最初由Java開發(fā)而成,現(xiàn)在有了C#和C++等移植版本。
它的官方網(wǎng)站地址是http://lucene.apache.org/。
下面我們結(jié)合第1.1節(jié)中的代碼介紹Lucene中的相關(guān)概念。
● 第一個(gè)概念是Index,也就是索引庫,在Lucene中并不存在Index的類。通過IndexWriter來寫索引,通過IndexReader來讀索引。
● 一段有意義的文字需要通過Analyzer分割成一個(gè)個(gè)詞語后才能按關(guān)鍵詞搜索。Analyzer就是分析器,StandardAnalyzer是Lucene中最常用的分析器。為了達(dá)到更好的搜索效果,不同的語言可以使用不同的分析器,例如CnAnalyzer就是一個(gè)主要處理中文的分析器。
● Analyzer返回的結(jié)果就是一串Token。Token包含一個(gè)代表詞本身含義的字符串和該詞在文章中相應(yīng)的起止偏移位置,Token還包含一個(gè)用來存儲(chǔ)詞類型的字符串。
● 一個(gè)Document代表索引庫中的一條記錄。要搜索的信息封裝成Document后通過IndexWriter寫入索引庫。調(diào)用Searcher接口按關(guān)鍵詞搜索后,返回的也是一個(gè)封裝后的Document列表。
● 一個(gè)Document可以包含多個(gè)列,叫做field。例如一篇文章可以包含“標(biāo)題”、“正文”、“修改時(shí)間”等field,創(chuàng)建這些列對象以后,可以通過Document的add方法增加這些列。
● Term是搜索語法的最小單位,復(fù)雜的搜索語法會(huì)分解成一個(gè)個(gè)的Term查詢。它表示文檔的一個(gè)詞語,Term由兩部分組成:它表示的詞語和這個(gè)詞語所出現(xiàn)的field。
【作者提示】Lucene中的API相對于數(shù)據(jù)庫來說比較靈活,沒有類似數(shù)據(jù)庫先定義表結(jié)構(gòu)后使用的過程。如果前后兩次寫索引時(shí)定義的列名稱不一樣,Lucene會(huì)自動(dòng)創(chuàng)建新的列,所以field的一致性需要我們自己掌握。
1.6.4 Nutch網(wǎng)絡(luò)搜索軟件
Nutch是構(gòu)架于Lucene索引庫基礎(chǔ)上的網(wǎng)絡(luò)搜索引擎。按照Nutch的設(shè)計(jì),它可以搜索的范圍可以是本地的局域網(wǎng)、Intranet、垂直的行業(yè)信息或者是整個(gè)互聯(lián)網(wǎng)。抓取部分和搜索部分是它的兩個(gè)基本組成部分。其基本結(jié)構(gòu)如圖1-6所示。

圖1-6 Nutch結(jié)構(gòu)圖
Nutch從0.8版本開始,把分布式計(jì)算處理部分獨(dú)立出來,命名為Hadoop。Hadoop主要包括分布式的文件系統(tǒng)(DFS的實(shí)現(xiàn)在org.apache.hadoop.dfs中)和一個(gè)MapReduce分布式數(shù)據(jù)處理器(MapReduce的實(shí)現(xiàn)在org.apache.hadoop.mapred中)。
1.6.5 用戶界面
搜索用戶界面一般由搜索首頁、搜索結(jié)果顯示頁和高級(jí)搜索頁面組成。如圖1-7所示是一個(gè)搜索首頁,包含一個(gè)搜索輸入提示的效果。

圖1-7 搜索首頁界面
下面是一個(gè)搜索結(jié)果頁面,如圖1-8所示。

圖1-8 搜索結(jié)果頁面
在搜索結(jié)果頁面中會(huì)對搜索詞高亮顯示,在搜索輸入框下面會(huì)給出相關(guān)搜索詞列表。如果用戶搜索錯(cuò)誤,在搜索輸入框下面會(huì)給出可能的查詢詞提示“你是不是要找:XXX”,如圖1-9所示。

圖1-9 查詢詞提示
下面是一個(gè)網(wǎng)站搜索的高級(jí)搜索界面,如圖1-10所示。

圖1-10 高級(jí)搜索界面
如圖1-10所示的界面中包含對“標(biāo)題”、“內(nèi)容”、“作者”和“發(fā)布日期”多個(gè)字段的聯(lián)合查詢,它們之間是“與”的邏輯關(guān)系。
- Extending Jenkins
- Mastering NetBeans
- Spring 5企業(yè)級(jí)開發(fā)實(shí)戰(zhàn)
- FreeSWITCH 1.8
- Learning ELK Stack
- PySide 6/PyQt 6快速開發(fā)與實(shí)戰(zhàn)
- RSpec Essentials
- NoSQL數(shù)據(jù)庫原理
- 響應(yīng)式Web設(shè)計(jì):HTML5和CSS3實(shí)戰(zhàn)(第2版)
- 愛上C語言:C KISS
- Vue.js 3.x高效前端開發(fā)(視頻教學(xué)版)
- HTML5 WebSocket權(quán)威指南
- Arduino Electronics Blueprints
- JavaScript Mobile Application Development
- micro:bit軟件指南