1 回答

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個贊
我建立搜索引擎。
我將為您提供 6 個探索技巧,以便您可以繼續(xù)學(xué)習(xí)如何編程并在需要時(shí)繼續(xù)進(jìn)行。
提示#1:專注!
首先定義你想要完成的事情。在嘗試從頭開始構(gòu)建搜索引擎之前,想想你真正想做什么。這可能不是您的最終目標(biāo),也就是您真正想做的事情。
你真的想用這個想法爬網(wǎng)嗎:“使用 PHP CURL 從 sitemap.xml 中提取所有 url”?
或者您只是想在您的網(wǎng)站上添加一個搜索框,從您的產(chǎn)品數(shù)據(jù)庫中獲取產(chǎn)品數(shù)據(jù)并在您的網(wǎng)站上顯示該產(chǎn)品數(shù)據(jù),想法是:“我想在我的網(wǎng)站中實(shí)現(xiàn)我自己的搜索功能”?
這很難說。
如果您想向您的網(wǎng)站添加基于產(chǎn)品的“搜索功能”,則無需從XML 站點(diǎn)地圖中提取內(nèi)容。您只需從以下數(shù)據(jù)庫中檢索它:MySQL、PosgreSQL、Oracle、SQL Server等...,然后將結(jié)果顯示在您的搜索結(jié)果頁面上。當(dāng)人們想在他們的網(wǎng)站中添加“搜索功能”時(shí),這通常是人們想要做的。
提示#2:對于搜索,越簡單越快。
在編寫代碼時(shí)最好記住這一點(diǎn):簡單永遠(yuǎn)贏。它被稱為“SAW 原理”。
首先,讓我們看看您的 SQL。它有 2 個 select 語句,用關(guān)鍵字連接在一起UNION
。
SELECT * FROM search_engine
WHERE soundex(keyword) LIKE soundex('%$q%')
UNION
SELECT * FROM search_engine
WHERE title LIKE '%$q%' OR link LIKE '%$q%'
ORDER BY `clicks` DESC
由于這看起來像是來自同一個數(shù)據(jù)庫表,因此您可以按如下方式組合它......其中更改替換UNION SELECT * FROM search_engine WHERE為OR:
SELECT * FROM search_engine
WHERE soundex(keyword) LIKE soundex('%$q%')
OR title LIKE '%$q%' OR link LIKE '%$q%'
ORDER BY `clicks` DESC
因此,如果您可以刪除 UNION 關(guān)鍵字并將 2 個 select 語句合并為 1 個 select 語句,那么數(shù)據(jù)庫引擎可以做更少的工作來完成搜索查詢請求。
如果您使用 2 個不同的表,那么您需要做一些功課來查找稱為倒排索引的概念。概念是一樣的:讓搜索盡可能簡單……讓數(shù)據(jù)庫服務(wù)器做盡可能少的工作……讓搜索體驗(yàn)運(yùn)行得盡可能快!
盡管更簡單意味著更快,但并不意味著更準(zhǔn)確。
提示#3:準(zhǔn)確性使搜索引擎與用戶更相關(guān)。將此視為準(zhǔn)確性 =“強(qiáng)大”。
讓我們看看這些頁面標(biāo)題以及搜索查詢?nèi)绾闻c它們一起使用:
使用 PHP CURL 從 sitemap.xml 中提取所有 url
如何使用 PHP CURL 從 sitemap.xml 中提取所有 url
為了使這些結(jié)果準(zhǔn)確匹配,您必須在數(shù)據(jù)庫中包含第二頁的完整標(biāo)題。如果您只有第一頁的標(biāo)題(沒有“如何”),那么對第二頁標(biāo)題的查詢將找不到第一頁標(biāo)題的結(jié)果。這就是您在網(wǎng)站的搜索功能中注意到的問題。
原因是對第一頁標(biāo)題的查詢是第二頁標(biāo)題內(nèi)的部分完全匹配。然而,對第二頁標(biāo)題的查詢不是完全匹配,甚至也不是第一頁標(biāo)題的部分匹配。
為了解決這個問題,搜索引擎以關(guān)鍵字為基礎(chǔ)工作。
提示 #4:了解關(guān)鍵字與停用詞以及如何在搜索查詢中解析它們。
在搜索查詢中,既有稱為關(guān)鍵字的相關(guān)關(guān)鍵字,也有稱為停用詞的不相關(guān)垃圾詞。您可能想研究停用詞的概念以及搜索引擎如何使用它們,或者最常見的是,在實(shí)際執(zhí)行搜索查詢之前將它們丟棄。
因此,在您的查詢中,這些是您獨(dú)特且有意義的關(guān)鍵字。當(dāng)您單獨(dú)考慮每個詞時(shí),它們具有獨(dú)立的具體含義。
array('extract', 'url', 'sitemap.xml', 'PHP', 'CURL')
具體含義:
Extract = 拉、抓住、從一組中抓取某物。
URL = 超鏈接。
sitemap.xml = XML 站點(diǎn)地圖文件。
PHP = 編程語言名稱。
CURL = 命令行 URL 提取。
這些很可能是停用詞,它們本身沒有意義或含義模糊。
array('How', 'to', 'all', 'from', 'with');
含糊的意思:
How = 問題的簡單引導(dǎo)。那么搜索引擎用這個做什么呢?它把它扔掉了。
To = 連接詞。它指向一組東西。也許有用。也許不會。扔了它。
全部 = 一組所有的東西??赡苡杏?,但對搜索引擎來說似乎很模糊。扔了它。
From = 另一個連接詞。它指向一組其他東西。又是含糊不清。扔了它。
有=包括。另一個連接詞。也很模糊。計(jì)算機(jī)不知道在 with 關(guān)鍵字后添加“PHP”或“PHP CURL”。無賴!扔了它。
搜索引擎通常會去除停用詞并查詢有意義的關(guān)鍵字以獲得結(jié)果。相關(guān)性得分是搜索結(jié)果的準(zhǔn)確程度。
這是一個假設(shè)的例子(我在寫這篇文章時(shí)憑空想出來的):如果一個查詢發(fā)現(xiàn)一個頁面包含 5 個唯一關(guān)鍵字中的 1 個,那么相關(guān)性得分將為 20%。如果它找到一個包含 5 個唯一關(guān)鍵字中的 4 個的頁面,則相關(guān)性分?jǐn)?shù)將為 80%。這是假設(shè)的,因?yàn)檫@不是任何特定搜索引擎當(dāng)前的工作方式。它只是一個基本概念,用一個簡單的例子來解釋一個觀點(diǎn)。
相關(guān)性算法和分?jǐn)?shù)實(shí)際上取決于搜索引擎設(shè)計(jì)者/構(gòu)建者來創(chuàng)建。相關(guān)性算法可以像搜索引擎設(shè)計(jì)者和/或構(gòu)建者想要的那樣簡單或復(fù)雜。搜索引擎開發(fā)人員可能會花費(fèi)大量時(shí)間來微調(diào)相關(guān)性算法和評分。它還取決于所使用的搜索算法以及搜索機(jī)器人為這些算法找到數(shù)據(jù)的效果。
提示 #5:探索構(gòu)建搜索機(jī)器人!
如果你真的想完成這個,你應(yīng)該考慮構(gòu)建搜索機(jī)器人:“使用 PHP CURL 從 sitemap.xml 中提取所有 url”。
我也寫了一個搜索機(jī)器人。它已經(jīng)抓取了超過 100 萬個 URL!
PHP Curl 不是提取鏈接的工具。這是從 1 個 URL 獲取內(nèi)容的原因。必須編寫搜索機(jī)器人來解析返回的 HTML,以便它可以找出從這些搜索結(jié)果中提取的內(nèi)容。
只是一個警告:人們不會在他們的 URL 中編寫完美的 HTML 語法。因此,您的搜索機(jī)器人需要進(jìn)行大量微調(diào)才能檢測草率的編程,這會使您的搜索機(jī)器人崩潰。這是一個巨大的時(shí)間承諾!如果您決定繼續(xù)構(gòu)建自己的搜索機(jī)器人,請準(zhǔn)備好在這個項(xiàng)目上花費(fèi)數(shù)年甚至數(shù)十年。構(gòu)建搜索引擎是一個漫長的旅程!您的搜索機(jī)器人將崩潰數(shù)百至數(shù)千次,然后您才能讓它抓取數(shù)百萬個 URL。
所以...您真的要“從 sitemap.xml 中提取所有 url”還是要查詢駐留在數(shù)據(jù)庫中的以前上傳的產(chǎn)品數(shù)據(jù)列表?后一種數(shù)據(jù)庫查詢的想法構(gòu)建起來要快得多,而且將來更容易維護(hù)!
提示 #6:如果您不想花很多時(shí)間從頭開始構(gòu)建搜索引擎,從頭開始構(gòu)建搜索機(jī)器人,從頭開始構(gòu)建相關(guān)性評分算法,那么請查看一些預(yù)構(gòu)建的搜索引擎解決方案。這里有一些流行的。和他們一起玩會很有趣!
結(jié)論:搜索引擎不容易建立!他們可能需要數(shù)年時(shí)間才能建成。如果您真的想實(shí)現(xiàn)這個目標(biāo):“我想以所有可能的方式向用戶展示結(jié)果”,請準(zhǔn)備好投入大量時(shí)間(很簡單是幾個月,實(shí)際上是幾年,可能是幾十年)。
- 1 回答
- 0 關(guān)注
- 120 瀏覽
添加回答
舉報(bào)