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.mzph.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…

最简单的基于 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…

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所引起的 错误解析…

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;各种宏观经济挑战可能进一步提升比特币、黄金和白银等资产的避险…

Google Dremel和parquet的复杂嵌套数据结构表征方法解析

转载请注明出处。作者&#xff1a;archimekai 核心参考文献&#xff1a; Dremel: Interactive Analysis of Web-Scale Datasets 文章目录 引言复杂嵌套数据结构的无损表征问题Dremel论文中提出的表征方法parquet备注 引言 Dremel是Google的交互式分析系统。Google大量采用prot…

搭建服务器及跨域处理

使用内置的模块搭建服务器 自己电脑: 域名:localhost ip:127.0.0.1 http模块搭建服务器 const http = require(http)// 创建一个http对应的服务器,每次改完服务器的代码后都需要重新启动下服务器 /*方式一: const server = http.createServer((request,response)=>{…

铁路关基保护新规发布!铁路软件供应链安全洞察与治理思路

近日&#xff0c;国家铁路局发布《铁路关键信息基础设施安全保护管理办法》&#xff0c;《办法》第十四条提到&#xff1a;“运营者应当加强铁路关键信息基础设施供应链安全保护&#xff0c;优先采购安全可信的网络产品和服务。运营者采购网络产品和服务&#xff0c;应当预判该…

Intel FPGA IP之LVDS SerDes IP学习

FPGA 视频数据输入输出直通工程&#xff1a; 屏&#xff1a;13.2吋8bit色深&#xff0c;屏幕分辨率为1440*192060&#xff0c;具有两个Port&#xff0c;每个Port有4个差分数据对与1个差分时钟对&#xff0c;差分对均支持LVDS协议芯片&#xff1a;Cyclone V系列FPGA目的&#x…

Noise Conditional Score Networks(NCSN)学习

参考&#xff1a; [1] https://zhuanlan.zhihu.com/p/597490389 [2] https://www.zhangzhenhu.com/aigc/Score-Based_Generative_Models.html TOC 1 基于分数的生成模型1.1 简介和动机1.2 Score Matching及其改进1.2.1 Score Matching1.2.2 Sliced score matching&#xff08;不…

XSS_lab(level1-level5)

level1 直接输入页面没有发现输入框&#xff0c;观察url发现有传参 尝试修改传参为&#xff1a;<script>alert(1)</script> 过啦&#xff01; level2 页面中有输入框&#xff0c;尝试构建语句&#xff1a;<script>alert(1)</script>,传输后查看源代…

国际心理学导师-叶子文JeffreyYip的《意识地图》

“物质就是能量。” ---爱因斯坦 “時常保持觉知&#xff0c;有意识地发现情绪起伏 你随时都能翻转人生 做自己人生的导演 当你频率高时&#xff0c;万事万物为你而来” ---大卫霍金斯 叶子文-《意识地图》&#xff1a;高阶心理学课程 宇宙间万物的本质是能量。一切都靠能量…

Java基础---lambda表达式

一、为什么要引入lambda表达式 lambda 表达式是一个可传递的代码块 &#xff0c; 可以在以后执行一次或多次 。 在介绍lambda表达式之前&#xff0c;我们看一下&#xff0c;以前&#xff0c;我们对于一个问题的通常写法。 假设你已经了解了如何按指定时间间隔完成工作&#xf…

js字符串转json的3种方法

1.eval方式解析 function strToJson(str){var json eval("(" str ")");return json;}console.log(strToJson("{int:1, string:demo}")); 运行截图&#xff1a; 注&#xff1a; 记得别忘了str两旁的小括号。 永远不要使用 eval !!! eval() 是一…