Elasticsearch:如何創建搜索引擎

作者:Jessica Taylor

搜索引擎是生活中我們認為理所當然的事情之一。 每當我們尋找某些東西時,我們都會將一個單詞或短語放入搜索引擎,就像魔術一樣,它會為我們提供一個匹配結果列表。 現在可能感覺不那么神奇了,因為這是我們每天都在做的事情。 但任何記得 Alta Vista 時代的人都應該明白我們現在的情況有多好。

當我說 “搜索引擎” 時,很容易想到流行的網絡搜索引擎,例如 Google 以及在較小程度上上的 Bing。 但搜索引擎的應用遠遠超出了搜索網絡的范圍。 Uber 和 Tinder 等熱門應用程序包含強大的搜索引擎,可利用其平臺獨有的地理位置和其他特征將用戶與司機和日期進行匹配。 這對于流媒體應用程序、學術網站甚至內部網來說都是一樣的。 事實上,如果你查看任何主要網站的導航欄,你很可能會看到一個搜索欄,可以幫助你從該特定網站找到你需要的內容。

搜索引擎的潛在用例數量巨大,這可能就是你閱讀本文的原因。 也許你是一名開發人員,希望構建你的第一個搜索引擎。 或者你可能意識到搜索通過檢索增強生成來增強生成式 AI 體驗,并且想了解更多信息。 為了使這盡可能簡單,我們將本指南分為三個部分:

  • 搜索引擎的定義和概念
  • 創建你自己的搜索引擎
  • 使用 Elastic? 輕松構建搜索引擎

讀完本文后,你將掌握使用 Web 服務器、數據攝取和索引構建第一個搜索引擎所需的所有知識,并由 Elastic 的搜索平臺提供支持。

搜索引擎的定義和概念

將搜索引擎視為圖書管理員,幫助你找到所需的信息。 你告訴他們你要解決的問題或你要回答的問題,圖書管理員可以向你推薦最有可能對你有幫助的書籍和資源。 他們可能并不總是能做對,但這比盲目地翻閱書籍以期獲得幸運要有效得多。

搜索引擎由四個主要組件組成:網絡服務器數據攝取索引結果頁面。 在構建搜索引擎之前,了解它們各自的作用非常重要。

網絡服務器

如果搜索引擎是圖書館員,那么網絡服務器就是圖書館本身。 你可以在此處存儲向用戶返回有意義的結果所需的所有數據。 這些 Web 服務器通常基于云,因為它們為你提供了可擴展性、可訪問性、安全性和性能。 對于網絡搜索引擎來說,這將是跨不同網站的 HTML 頁面、圖像、視頻和其他資產的位置。 對于社交媒體網站,這將是該平臺上內容所需的標題、描述、元數據和其他信息。

數據攝取

就像圖書館需要整理和收集不同的書籍一樣,搜索引擎需要從某個地方收集數據。 這就是為什么數據攝取是構建搜索引擎如此重要的一部分。 對于網絡搜索引擎,此數據攝取是使用網絡爬蟲完成的。 爬蟲使用復雜的算法來掃描網站并識別內容是什么以及在哪里可以找到內容。

通過 API 與其他服務集成是另一種類型的數據攝取。 這些集成使你可以選擇數據的來源,從而使你的搜索引擎能夠更好地查找特定數據。 例如,如果你正在構建視頻搜索引擎,你可能希望顯示來自多個提供商(例如 YouTube、Netflix 和 Disney+)的結果。

同樣,你可以使用連接器從一個或多個數據源引入信息。 這些通常是預構建的模塊或代碼片段,可用于連接到特定的數據庫、應用程序或 API。 它們為你提供了足夠的靈活性,而無需將你的范圍擴大得太遠。

索引

就像在圖書館一樣,你需要有一個內容索引,否則將不可能知道所有內容在哪里。 索引通過組織和存儲數據源中的信息來實現此目的,以確保可以有效地檢索這些信息。 為了讓你的搜索引擎正常工作,它需要能夠快速識別、排名和提供內容。

因為你可能嘗試對大量數據建立索引,所以不能簡單地從源逐字復制該索引。 相反,索引需要處理這些內容,將其分解為關鍵元素,例如:

  • 關鍵詞:頁面上找到的單詞和短語
  • 嵌入:表示文本數據的多維向量
  • 元數據:標題、描述和頁面中嵌入的其他結構化數據
  • 內容分析:了解頁面的主題、實體和整體含義
  • 反向鏈接:來自其他網站的指向內容的鏈接

搜索引擎結果頁面 (search enginer results pages - SERP)

這個難題的最后一部分實際上是向用戶顯示搜索結果。 搜索引擎結果頁面承擔了你在服務器、數據攝取和索引方面所做的所有艱苦工作,最終形成一個有用結果列表供用戶選擇。

其外觀因搜索引擎而異,但你可能會在 SERP 上有標題、鏈接、描述和某種分頁。 你可能還擁有更高級的過濾和分面,因此用戶可以根據常用參數輕松優化結果。 但重要的是結果會清晰顯示,因此很容易找到最佳、最相關的選擇。

你的搜索相關性很重要,因為它可以通過向用戶展示你了解他們的意圖來培養信任,并確保他們走在正確的道路上。 這最終引導他們無縫地獲取他們想要的信息 —— 這種結合可以建立忠誠度并促進持久的參與。

使用 Elastic 創建你自己的搜索引擎

現在你已經更好地了解了搜索引擎的關鍵組件,讓我們深入了解構建你自己的搜索引擎的過程以及你可能面臨的挑戰。

首先,你需要考慮搜索引擎的規模。 瞄準明星并嘗試建立新的谷歌可能很誘人。 但抓取數十億個網頁需要大量的基礎設施和計算能力,更不用說存儲所有數據的能力了。

在開始構建之前,你還應該牢記你現有的知識和技能。 你對數據源了解得越多,就越容易將其用于搜索引擎。 同樣,嘗試堅持使用你已經有經驗的技術堆棧。 如果你精通 Python,請考慮使用它來構建你的搜索引擎。

第 1 步:定義你的搜索要求

構建搜索引擎的第一步是確定搜索引擎要解決的問題。 這個決定將影響你要構建的所有其他內容,從數據源到索引,再到顯示結果的方式。 因此,請考慮一下你正在為誰構建搜索引擎,并問自己以下問題:

  • 他們為什么要尋找這些信息/內容?
  • 你需要了解哪些信息才能確定某件事是否相關?
  • 你將如何決定哪些結果比其他結果更好?
  • 你將如何呈現結果以使其盡可能有用?

一旦回答了這些問題,你將能夠更好地在整個構建過程中做出關鍵決策 - 從使用哪些數據源到是否應該在搜索引擎結果頁面上顯示圖像。 你心中的這些答案越清晰,你就越能滿足用戶的需求和期望。

第 2 步:抓取網絡以提取數據

一旦你知道搜索引擎的要求是什么,下一步就是獲取你需要的數據。 如果你計劃使用集成或連接器,則需要訪問這些源并確保你可以在需要索引時訪問數據。 如果數據源屬于你,那么這應該不成問題。 但請記住,任何外部數據源都會帶來一些風險。 數據源的所有者可以隨時撤銷訪問權限或對數據進行更改,這可能會導致出現一些問題。 你可以安排數據刷新來解決此問題,但如果數據的結構或體系結構發生更改,仍然可能會導致問題。

如果你要創建網絡搜索引擎,則需要使用網絡爬蟲來獲取要索引的數據。 這所需的時間完全取決于你的搜索引擎的范圍。 理論上,你可以構建自己的爬蟲,但這需要大量工作。 相反,使用現有工具(例如 Elastic 網絡爬蟲)會更快、更容易。 這將掃描你喜歡的任何網站,并且你可以安排自動重新爬網,以便你的搜索引擎始終保持最新。

第三步:存儲收集到的信息

無論你使用爬蟲程序、API 還是連接器,都沒有關系 — 你仍然需要某個地方來存儲收集到的信息。 但你不應該急于選擇任何舊數據庫。 你需要考慮數據量和增長、性能要求、數據結構、可擴展性、可靠性、安全性和分析等因素。 你還需要考慮短期和長期存儲這些數據的成本。

正如我們之前提到的,考慮你自己的技能也很有用。 例如,如果你之前在開發中主要使用 Elasticsearch?,那么這可能是你現在的最佳選擇。 但是,如果你對幾種不同類型的數據庫感到滿意,則應該根據上面列出的因素做出決定。

步驟 4:索引頁面

你需要做的下一件事是對你收集和存儲的數據建立索引。 這將讓你為用戶提供與其查詢最相關的結果。 幸運的是,索引是 Elastic 網絡爬蟲的一部分,這將使你的生活更輕松。 但在配置索引結構時,你仍然需要考慮數據粒度、屬性索引和數據壓縮等問題。

過程中可能會出現一些嘗試和錯誤,但目標應該是幫助用戶:

  • 快速查找相關信息
  • 優化搜索和過濾結果
  • 發現相關內容

使用開箱即用的搜索 UI 將使這一切變得更加容易,因為你可以快速啟動并運行搜索引擎 UI。 這使你能夠測試你的搜索引擎、檢查索引并進行調整和更改以改進你的搜索引擎。 這包括過濾和排序、分頁和鍵入時搜索等功能。

第 5 步:優化搜索結果

構建任何搜索引擎的最終目標是提供最有用和最相關的結果。 但你不太可能一開始就能做到這一點。 相反,你需要不斷努力完善你的搜索引擎,以更接近實現該目標。 關鍵詞匹配、向量數據庫、混合搜索技術、相關性評分、鏈接分析和同義詞等都可以帶來很大的改進。

你還可以利用機器學習和人工智能來增強你的搜索能力。 這可以使你的搜索引擎更加強大,因為它可以從用戶行為中學習,包括更高級的個性化,甚至可以更好地理解用戶的意圖和語氣。 不過,這確實也帶來了挑戰。 你需要確保偏見不會滲透到你的搜索引擎中,并且你需要非常重視隱私和安全。

構建搜索引擎變得容易

構建你的第一個搜索引擎可能感覺像是一項艱巨的任務,但希望這些步驟已經向你表明它實際上是可以實現的。 Elastic 可以幫助完成該過程的每一步。 它通過網絡爬蟲等工具簡化了數據攝取,通過其可擴展且靈活的架構增強了索引功能,并通過其機器學習功能增強了相關性。

無論你是構建網站搜索還是專門的搜索引擎,Elasticsearch 都會為你提供一套全面的工具,幫助你從頭開始創建高效且用戶友好的搜索體驗。

接下來你應該做什么

只要你準備好,我們可以通過以下四種方式幫助你為你的企業帶來更好的搜索體驗:

  • 開始免費試用,看看 Elastic 如何幫助你的業務。
  • 瀏覽我們的解決方案,了解 Elasticsearch 平臺的工作原理以及我們的解決方案如何滿足你的需求。
  • 通過我們 45 分鐘的網絡研討會,了解如何設置 Elasticsearch 集群并開始數據收集和攝取。
  • 通過電子郵件、LinkedIn、Twitter 或 Facebook 與你認識的愿意閱讀本文的人分享本文。

原文:How to create a search engine | Elastic Blog

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717932.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717932.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717932.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Go-知識struct

Go-知識struct 1. struct 的定義1.1 定義字段1.2 定義方法 2. struct的復用3. 方法受體4. 字段標簽4.1 Tag是Struct的一部分4.2 Tag 的約定4.3 Tag 的獲取 githupio地址:https://a18792721831.github.io/ 1. struct 的定義 Go 語言的struct與Java中的class類似&am…

第二十三章 :Docker 部署 Redis

第二十三章 :Docker Redis 部署 Docker version 25.0.3, build 4debf41 ,Docker Compose version v2.24.2Redis-6.0.6 鏡像 redis:6.0.6-alpineRedis-6.0.6版本 部署規劃 服務器IP192.168.92.105端口6379安裝目錄/home/work/docker-redis-6.0.6數據映射目錄/home/work/do…

最簡單的基于 FFmpeg 的收流器(以接收 RTMP 為例)

最簡單的基于 FFmpeg 的收流器(以接收 RTMP 為例) 最簡單的基于 FFmpeg 的收流器(以接收 RTMP 為例)正文結果工程文件下載參考鏈接 最簡單的基于 FFmpeg 的收流器(以接收 RTMP 為例) 參考雷霄驊博士的文章…

藍凌OA frpt_listreport_definefield.aspx接口存在SQL注入漏洞

免責聲明:文章來源互聯網收集整理,請勿利用文章內的相關技術從事非法測試,由于傳播、利用此文所提供的信息或者工具而造成的任何直接或者間接的后果及損失,均由使用者本人負責,所產生的一切不良后果與文章作者無關。該…

DevStack 部署 OpenStack

Devstack 簡介 DevStack 是一系列可擴展的腳本,用于基于 git master 的最新版本快速調出完整的 OpenStack 環境。devstack 以交互方式用作開發環境和 OpenStack 項目大部分功能測試的基礎。 devstack 透過執行 stack.sh 腳本,搭建 openstack 環境&…

lv20 QT主窗口4

熟悉創建主窗口項目 1 QAction 2 主窗口 菜單欄:fileMenu menuBar()->addMenu(tr("&File")); 工具欄:fileToolBar addToolBar(tr("File")); 浮動窗:QDockWidget *dockWidget new QDockWidget(tr("Dock W…

Threejs之精靈模型Sprite

參考資料 精靈模型Sprite…Sprite模擬下雨、下雪 知識點 注:基于Three.jsv0.155.0 精靈模型Sprite精靈模型標注場景(貼圖)Sprite模擬下雨、下雪 精靈模型Sprite Three.js的精靈模型Sprite和Threejs的網格模型Mesh一樣都是模型對象,父類都是Object3…

【設計者模式】單例模式

文章目錄 1、模式定義2、代碼實現(1)雙重判空加鎖方式兩次判空的作用?volatile 關鍵字的作用?構造函數私有? (2)靜態內部類【推薦】(3)Kotlin中的單例模式lateinit 和 by…

Matlab 最小二乘插值(曲線擬合)

文章目錄 一、簡介二、實現代碼三、實現效果參考資料一、簡介 在多項式插值時,當數據點個數較多時,插值會導致多項式曲線階數過高,帶來不穩定因素。因此我們可以通過固定冪基函數的最高次數 m(m < n),來對我們要擬合的曲線進行降階。之前的函數形式就可以變為: 二、實現…

spring Boot 報錯RedisConnectionFailureException

錯誤描述&#xff1a; 錯誤重點&#xff1a;&#xff08;圖片中藍色區域&#xff09; Unable to connect to Redis; 無法連接到Redis Unable to connect to 127.0.0.1 無法連接到本地服務器 所以&#xff0c;錯誤是本地服務器沒有連接上Redis所引起的 錯誤解析…

vue3中的父傳子,子傳父

在Vue 3中&#xff0c;父組件向子組件傳遞數據和子組件向父組件通信的方式與Vue 2非常相似&#xff0c;但Vue 3提供了Composition API和更多的響應式API&#xff0c;為組件間的通信提供了更多的可能性。下面是父傳子和子傳父的基本方法&#xff1a; ### 父組件傳遞數據給子組件…

【InternLM 實戰營筆記】使用SDK接口上傳模型到OpenXLab

概述 浦源內容平臺-模型中心的Python SDK旨在為開發人員提供編程方式來管理和操作模型中心平臺的功能&#xff0c;以便他們可以輕松地與模型中心進行交互和模型管理。通過Python SDK提供的推理接口&#xff0c;開發人員能夠高效地調用不同的模型&#xff0c;實現模型應用的開發…

遞歸實現排列型枚舉(c++題解)

題目描述 把 1~n 這 n(n<10) 個整數排成一行后隨機打亂順序&#xff0c;輸出所有可能的次序。 輸入格式 一個整數n。 輸出格式 按照從小到大的順序輸出所有方案&#xff0c;每行1個。 首先&#xff0c;同一行相鄰兩個數用一個空格隔開。其次&#xff0c;對于兩個不同的…

Linux——進程控制(二)進程等待

目錄 前言 一、進程等待 二、如何進行進程等待 1.wait 2.waitpid 2.1第二個參數 2.2第三個參數 3. 等待多個進程 三、為什么不用全局變量獲取子進程的退出信息 前言 前面我們花了大量的時間去學習進程的退出&#xff0c;退出并不難&#xff0c;但更深入的學習能為本…

048 異常

什么是異常 異常體系結構 異常的繼承關系 Error Exception 異常處理機制 try&#xff1a;用{}將可能產生異常的代碼包裹catch&#xff1a;與try搭配使用&#xff0c;捕獲try包裹代碼中拋出的異常并進行后續動作finally&#xff1a;跟在try后&#xff0c;在try和catch之后執行…

web3時事粥報

比特幣正成為更具有吸引力的通脹對沖工具 在通脹的宏觀經濟浪潮中&#xff0c;比特幣正逐漸嶄露頭角&#xff0c;成為那些渴望多元化投資組合的投資者眼中的璀璨明星。Kooner 預測&#xff0c;2024年&#xff0c;各種宏觀經濟挑戰可能進一步提升比特幣、黃金和白銀等資產的避險…

3月3日做題總結(C/C++真題)

第一題 參加位運算的數據其類型不能是&#xff08;&#xff09;。 A---int B---char C---float D---long int 正確答案&#xff1a;C 解析&#xff1a;無論是float&#xff0c;還是double&#xff0c;在內存中的存儲分為三部分&#xff1a;符號位、指數位、尾數位&#…

Google Dremel和parquet的復雜嵌套數據結構表征方法解析

轉載請注明出處。作者&#xff1a;archimekai 核心參考文獻&#xff1a; Dremel: Interactive Analysis of Web-Scale Datasets 文章目錄 引言復雜嵌套數據結構的無損表征問題Dremel論文中提出的表征方法parquet備注 引言 Dremel是Google的交互式分析系統。Google大量采用prot…

全量知識系統問題及SmartChat給出的答復 之17 知識系統中的兩個特權類(超類和欠類) :腳本和場景

Q.45 知識系統中的兩個特權類 &#xff1a;腳本和場景 知識系統中的兩個特權類&#xff08;也是集合論中兩個特權集合&#xff09;&#xff1a;腳本script和場景scene 。 一個$Demonstrate類型的腳本script&#xff1a; 表示“值val”&#xff08; 形式上是應用程序的實用工…

如何學習openfoam

學習OpenFOAM的詳細步驟、流程、學習網站、練習案例以及B站學習資源推薦如下&#xff1a; 一、詳細步驟和流程 安裝OpenFOAM&#xff1a;首先&#xff0c;你需要在你的計算機上安裝OpenFOAM。你可以從OpenFOAM的官方網站下載適合你的操作系統的安裝包&#xff0c;然后按照官方提…