1 回答

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