首頁  >  文章  >  後端開發  >  使用 Elasticsearch 在 Go 中建立 Web 搜尋引擎

使用 Elasticsearch 在 Go 中建立 Web 搜尋引擎

Susan Sarandon
Susan Sarandon原創
2024-11-05 10:33:02420瀏覽

網路搜尋引擎對於索引大量線上資訊至關重要,可以在幾毫秒內存取這些資訊。在這個專案中,我用 Go (Golang) 建立了一個名為 RelaxSearch 的搜尋引擎。它透過與強大的搜尋和分析引擎 Elasticsearch 集成,將網頁抓取、定期資料索引和搜尋功能結合在一起。在這篇部落格中,我將帶您了解 RelaxSearch 的主要元件、架構,以及它如何有效地抓取和索引數據,以實現基於關鍵字的快速搜尋。

RelaxSearch 概述

RelaxSearch 圍繞著兩個主要模組建構:

  1. RelaxEngine:由 cron 作業提供支援的網頁抓取工具,它定期抓取指定的網站、提取內容並在 Elasticsearch 中為其建立索引。
  2. 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:根據資料時間戳記過濾結果。

Building a Web Search Engine in Go with Elasticsearch

關鍵組件和程式碼片段

以下是一些來自 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

  1. 克隆儲存庫
   git clone https://github.com/Ravikisha/RelaxSearch.git
   cd RelaxSearch
  1. 配置

    使用 Elasticsearch 憑證更新 RelaxEngine 和 RelaxWeb 的 .env 檔案。

  2. 使用 Docker 運行

    RelaxSearch 使用 Docker 來輕鬆設定。只要運行:

   docker-compose up --build

Building a Web Search Engine in Go with Elasticsearch

Building a Web Search Engine in Go with Elasticsearch

Building a Web Search Engine in Go with Elasticsearch

挑戰與改進

  • 可擴展性:Elasticsearch 可以很好地擴展,但是處理大量連結的大量抓取需要針對更大規模的部署進行最佳化。
  • 強大的錯誤處理:增強錯誤處理和重試機制將提高彈性。

結論

RelaxSearch 是基本搜尋引擎的教育和實踐演示。雖然它仍然是一個原型,但該專案對於理解 Web 抓取、全文搜尋以及使用 Go 和 Elasticsearch 進行高效資料索引的基礎知識很有幫助。它為可擴展環境中的改進和實際應用開闢了途徑。

探索 GitHub 儲存庫,親自嘗試 RelaxSearch!

以上是使用 Elasticsearch 在 Go 中建立 Web 搜尋引擎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn