使用 Elasticsearch 在 Go 中建立 Web 搜尋引擎
網路搜尋引擎對於索引大量線上資訊至關重要,可以在幾毫秒內存取這些資訊。在這個專案中,我用 Go (Golang) 建立了一個名為 RelaxSearch 的搜尋引擎。它透過與強大的搜尋和分析引擎 Elasticsearch 集成,將網頁抓取、定期資料索引和搜尋功能結合在一起。在這篇部落格中,我將帶您了解 RelaxSearch 的主要元件、架構,以及它如何有效地抓取和索引數據,以實現基於關鍵字的快速搜尋。
RelaxSearch 概述
RelaxSearch 圍繞著兩個主要模組建構:
- RelaxEngine:由 cron 作業提供支援的網頁抓取工具,它定期抓取指定的網站、提取內容並在 Elasticsearch 中為其建立索引。
- RelaxWeb:一個 RESTful API 伺服器,允許使用者搜尋索引數據,提供分頁、過濾和內容突出顯示,以實現用戶友好的回應。
項目動機
從頭開始建立搜尋引擎專案是了解網頁抓取、資料索引和高效搜尋技術的好方法。我想利用 Go 的效率和 Elasticsearch 強大的索引來創建一個簡單但實用的搜尋引擎,具有快速資料檢索和易於擴展的特點。
主要特點
- 自動抓取:使用 cron 作業,RelaxEngine 可以定期運行,抓取資料並將其儲存在 Elasticsearch 中。
- 全文搜尋:RelaxWeb提供全文搜尋功能,依關鍵字索引內容,檢索速度快。
- REST API:可透過具有分頁、日期過濾和內容突出顯示參數的 RESTful API 進行存取。
- 資料儲存:索引內容儲存在Elasticsearch中,允許可擴展且高度回應的查詢。
RelaxSearch的架構
1.RelaxEngine(網頁抓取器和索引器)
RelaxEngine 是一個用 Go 編寫的網頁抓取工具,用於導航網頁、提取和儲存內容。它會作為 cron 作業運行,因此可以定期(例如每 30 分鐘)運行一次,以保持索引更新為最新的 Web 資料。其工作原理如下:
- 種子 URL:RelaxEngine 開始從指定的種子 URL 進行抓取,然後追蹤網站內的連結直至可設定的深度。
- 內容解析:對於每個頁面,它提取標題、描述和關鍵字,建立資訊資料集。
- Elasticsearch 中的索引:抓取的內容在 Elasticsearch 中建立索引,準備進行全文搜尋。每個頁面的資料都儲存有唯一的識別碼、標題、描述和其他元資料。
2.RelaxWeb(搜尋API)
RelaxWeb 提供 RESTful API 端點,可以輕鬆查詢並檢索 Elasticsearch 中儲存的資料。 API 接受關鍵字、分頁、日期過濾等多個參數,以 JSON 格式傳回相關內容。
- API 端點:/search
-
查詢參數:
- 關鍵字:主要搜尋字詞。
- from 和 size:分頁控制。
- dateRangeStart 和 dateRangeEnd:根據資料時間戳記過濾結果。
關鍵組件和程式碼片段
以下是一些來自 RelaxSearch 的重要元件和程式碼摘錄,以說明其工作原理。
RelaxEngine 的主要 Go 程式碼
核心功能位於 main.go 檔案中,其中 RelaxEngine 使用 gocron 初始化排程器來管理 cron 作業,設定 Elasticsearch 用戶端,並開始從種子 URL 進行爬取。
func main() { cfg := config.LoadConfig() esClient := crawler.NewElasticsearchClient(cfg.ElasticsearchURL) c := crawler.NewCrawler(cfg.DepthLimit, 5) seedURL := "https://example.com/" // Replace with starting URL s := gocron.NewScheduler(time.UTC) s.Every(30).Minutes().Do(func() { go c.StartCrawling(seedURL, 0, esClient) }) s.StartBlocking() }
爬蟲和索引邏輯
crawler.go 檔案處理網頁要求、提取內容並為其建立索引。使用elastic包,每個抓取的頁面都儲存在Elasticsearch中。
func (c *Crawler) StartCrawling(pageURL string, depth int, esClient *elastic.Client) { if depth > c.DepthLimit || c.isVisited(pageURL) { return } c.markVisited(pageURL) links, title, content, description, err := c.fetchAndParsePage(pageURL) if err == nil { pageData := PageData{URL: pageURL, Title: title, Content: content, Description: description} IndexPageData(esClient, pageData) } for _, link := range links { c.StartCrawling(link, depth+1, esClient) } }
在RelaxWeb中搜尋API程式碼
在relaxweb服務中,API端點提供全文搜尋功能。端點 /search 接收請求並查詢 Elasticsearch,根據關鍵字傳回相關內容。
func searchHandler(w http.ResponseWriter, r *http.Request) { keyword := r.URL.Query().Get("keyword") results := queryElasticsearch(keyword) json.NewEncoder(w).Encode(results) }
設定 RelaxSearch
- 克隆儲存庫
git clone https://github.com/Ravikisha/RelaxSearch.git cd RelaxSearch
配置
使用 Elasticsearch 憑證更新 RelaxEngine 和 RelaxWeb 的 .env 檔案。使用 Docker 運行
RelaxSearch 使用 Docker 來輕鬆設定。只要運行:
docker-compose up --build
挑戰與改進
- 可擴展性:Elasticsearch 可以很好地擴展,但是處理大量連結的大量抓取需要針對更大規模的部署進行最佳化。
- 強大的錯誤處理:增強錯誤處理和重試機制將提高彈性。
結論
RelaxSearch 是基本搜尋引擎的教育和實踐演示。雖然它仍然是一個原型,但該專案對於理解 Web 抓取、全文搜尋以及使用 Go 和 Elasticsearch 進行高效資料索引的基礎知識很有幫助。它為可擴展環境中的改進和實際應用開闢了途徑。
探索 GitHub 儲存庫,親自嘗試 RelaxSearch!
以上是使用 Elasticsearch 在 Go 中建立 Web 搜尋引擎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Go語言在構建高效且可擴展的系統中表現出色,其優勢包括:1.高性能:編譯成機器碼,運行速度快;2.並發編程:通過goroutines和channels簡化多任務處理;3.簡潔性:語法簡潔,降低學習和維護成本;4.跨平台:支持跨平台編譯,方便部署。

Golang在並發性上優於C ,而C 在原始速度上優於Golang。 1)Golang通過goroutine和channel實現高效並發,適合處理大量並發任務。 2)C 通過編譯器優化和標準庫,提供接近硬件的高性能,適合需要極致優化的應用。

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。Golang以其并发模型和高效性能著称,Python则以简洁语法和丰富库生态系统著称。

Golang和C 在性能競賽中的表現各有優勢:1)Golang適合高並發和快速開發,2)C 提供更高性能和細粒度控制。選擇應基於項目需求和團隊技術棧。

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

goimpactsdevelopmentpositationality throughspeed,效率和模擬性。 1)速度:gocompilesquicklyandrunseff,IdealforlargeProjects.2)效率:效率:ITScomprehenSevestAndardArdardArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdEcceSteral Depentencies,增強的Depleflovelmentimency.3)簡單性。

C 更適合需要直接控制硬件資源和高性能優化的場景,而Golang更適合需要快速開發和高並發處理的場景。 1.C 的優勢在於其接近硬件的特性和高度的優化能力,適合遊戲開發等高性能需求。 2.Golang的優勢在於其簡潔的語法和天然的並發支持,適合高並發服務開發。

Golang和C 在性能上的差異主要體現在內存管理、編譯優化和運行時效率等方面。 1)Golang的垃圾回收機制方便但可能影響性能,2)C 的手動內存管理和編譯器優化在遞歸計算中表現更為高效。
