要想實現乙個搜尋引擎,首先要了解什麼是搜尋引擎。簡單地理解,搜尋引擎是乙個系統,它可以幫助使用者去網際網路上蒐集與其檢索內容相關的資訊。
通常,乙個搜尋引擎由搜尋器、索引器、檢索器以及使用者介面組成,其中各個部分的含義如下:
由於爬蟲知識不是本節學習的重點,這裡不再做深入介紹,我們假設搜尋樣本就存在於本地磁碟中。為了方便,這裡只提供五個用於檢索的檔案,各檔案存放的內容分別如下:
# 1.txt
c語言中文網
c語言中文網成立於 2012 年初,目前已經運營了將近 7 年,我們致力於分享精品教程,幫助對程式設計感興趣的讀者。
# 5.txt
堅持做好一件事情,做到極致,讓自己感動,讓使用者心動,這就是足以傳世的作品!
下面,根據以上知識,我們先實現乙個最基本的搜尋引擎:
class
searchenginebase
:def
__init__
(self)
:pass
#搜尋器
defadd_corpus
(self, file_path)
:with
open
(file_path,
'rb'
)as fin:
text = fin.read(
).decode(
'utf-8'
) self.process_corpus(file_path, text)
#索引器
defprocess_corpus
(self,
id, text)
:raise exception(
'process_corpus not implemented.'
)#檢索器
defsearch
(self, query)
:raise exception(
'search not implemented.'
)#使用者介面
defmain
(search_engine)
:for file_path in
['1.txt'
,'2.txt'
,'3.txt'
,'4.txt'
,'5.txt']:
search_engine.add_corpus(file_path)
while
true
: query =
input()
results = search_engine.search(query)
print
('found {} result(s):'
.format
(len
(results)))
for result in results:
print
(result)
以上**僅是建立了搜尋引擎的乙個基本框架,它可以作為基類被其他類繼承,那麼繼承自此類的類將分別代表不同的搜尋引擎,它們應該各自實現基類中的 process_corpus() 和 search() 方法。
整個**的執行過程是這樣的,首先將各個檢索檔案中包含的內容連同該檔案所在的路徑一起傳遞給索引器,索引器會以該檔案的路徑建立索引,等待使用者檢索。
在searchenginebase類的基礎上,下面實現了乙個基本可以工作的搜尋引擎:
#繼承searchenginebase類,並重寫了 process_corpus 和 search 方法
class
******engine
(searchenginebase)
:def
__init__
(self)
:super
(******engine, self)
.__init__(
)#建立索引時使用
self.__id_to_texts =
defprocess_corpus
(self,
id, text)
:#以檔案路徑為鍵,檔案內容為值,形成鍵值對,儲存在字典中,由此建立索引
self.__id_to_texts[id]
= text
defsearch
(self, query)
: results =
#依次檢索字典中的鍵值對,如果檔案內容中包含使用者要搜尋的資訊,則將此檔案的檔案路徑儲存在 results 列表中
forid
, text in self.__id_to_texts.items():
if query in text:id)
return results
search_engine = ******engine(
)main(search_engine)
執行結果為:
c語言中文網
found 3 result(s):
1.txt
3.txt
4.txt
可以看到,使用者搜尋與「c語言中文網」有關的內容,最終檢索到了1.txt、3.txt和4.txt檔案中包含與之相關的內容。由此,只需要短短十來行**就可以實現乙個基礎的搜尋引擎。 搜尋引擎 索引
正排索引 文件編號,單詞編號,單詞的數量,單詞出現的位置。倒排索引 1,單詞詞典,儲存單詞以及統計資訊,單詞在記錄表中的便宜,可常駐記憶體,用雜湊表儲存。2,記錄表,單詞對應的文件集合,記錄單詞出現的數目 位置。文件採用差分變長編碼。其中文件可按編號公升序排列 可利用差分編碼 也可按出現次數排列,可...
MySQL搜尋引擎程式 mysql搜尋引擎
mysql是我們比較常用的一種資料庫軟體。它有著諸多的優點,如開源的,免費的等等。其實它還有乙個很好的特點,那就是有多種引擎可以供你選擇。如果賽車手能根據不同的路況,地形隨手更換與之最適宜的引擎,那麼他們將創造奇蹟。然而目前他們還做不到那樣便捷的更換引擎,但是我們卻可以 所謂知己知彼方可百戰不殆,要...
利用搜尋引擎蜘蛛繞過waf
我們在寫 防火牆規則的時候可能都會做一件事 永遠不遮蔽那些主流搜尋引擎機械人的爬取 如,google,bing,yahoo,baidu等 至今,我們覺得這樣很好,但是現在我們時不時地碰到一些奇怪的現象,不得不讓我們思考乙個問題,如果乙個合法的搜尋引擎機械人被用來攻擊 那會怎樣?難道我們仍然讓這樣的攻...