Elasticsearch:使用 Open Crawler 和 semantic text 进行语义搜索

作者:来自 Elastic Jeff Vestal

了解如何使用开放爬虫与 semantic text 字段结合来轻松抓取网站并使其可进行语义搜索。

Elastic Open Crawler 演练

我们在这里要做什么?

Elastic Open Crawler 是 Elastic 托管爬虫的后继者。

Semantic text 是 Elastic 的简单入门数据类型,用于启动和运行语义搜索。

两者结合,就像是搜索领域的 “新锐组合”。

接下来,我们将学习如何轻松配置并运行 Open Crawler 来爬取一个网站(以 Search Labs 的博客为例),自动分块并使用 ELSER 为这些网页内容(博客文本)生成稀疏向量嵌入,并运行一些示例搜索,确保一切正常运行。

选择你自己的冒险

  • 如果你想在免费的、按需的研讨会环境中完成这个 —— 请点击此处。
  • 如果你更愿意观看此演练的视频 ——请点击此链接。
  • 如果你不熟悉 Open Crawler,请在测试版公告博客中阅读。
    • 或者在我们的讨论论坛上阅读一篇很棒的文章 —— 2024 年 12 月 12 日:[EN] 像超级英雄一样浏览网页内容
  • 如果你喜欢阅读博客,请继续阅读!

Elasticsearch

项目或集群

你首先需要的是 Elasticsearch 集群或无服务器项目。如果你没有,没关系;你可以在 cloud.elastic.co 注册免费试用

创建映射模板。

如果你不想自定义任何映射,Open Crawler 将使用合理的默认值将其在网络上抓取的所有数据索引到 Elasticsearch 中。但是,在我们的例子中,我们希望增强默认映射,以便我们的一些文本可以为其生成稀疏向量。

我们将为索引中的两个关键字段创建一个新的索引模板。其余字段默认设置。

  • 创建一个名为 `body_semantic` 的 `semantic_text` 字段
    • 这将:
      • 从博客正文生成块
      • 使用 ELSER 从块生成稀疏向量
    • 注意:语义文本字段需要 inference API,它告诉 Elasticsearch 如何在提取和搜索时生成嵌入。由于我们在此示例中使用无服务器,因此我们将在 Elasticsearch 中使用默认的 ELSER 推理端点。
      • 如果你不使用 serverless 或想要设置自己的推理端点,ELSER 的文档页面有一个创建新推理端点的示例。
  • 为 “body” 字段添加映射,以包含 “copy_to” 参数,从而将正文复制到我们的语义文本字段。
    • body 字段通常会自动映射到文本。

PUT 索引模板

PUT _index_template/search-labs-template
{"index_patterns": ["search-labs-blogs","search-labs-blogs*"],"template": {"settings": {"index": {"default_pipeline": "parse_author_and_publish_date"}},"mappings": {"properties": {"first_author": {"type": "keyword"},"publish_date": {"type": "date"},"body": {"type": "text","copy_to": "body_semantic"},"body_semantic": {"type": "semantic_text","inference_id": "elser-endpoint"},"last_crawled_at": {"type": "date"}}}}
}

创建空索引

PUT search-labs-blogs

创建摄取管道

爬虫程序在抓取网页时可以提取一些信息。但是,当你需要额外的解析时,你可以配置摄取管道。

我们将配置一个管道来提取以下信息:

  • 从 author 字段中提取发布日期并将其存储在新的 posted_date 字段中
  • 从 list_of_authors 中提取第一作者并将其存储在新的 first_author 字段中
  • 删除 raw_author 和 raw_publish_date

PUT 摄取管道

PUT _ingest/pipeline/parse_author_and_publish_date
{"processors": [{"script": {"source": """// If raw_author is null or empty array, set default unknownif (ctx.raw_author == null || ctx.raw_author.size() == 0) {ctx.list_of_authors = [];ctx.first_author = "Unknown";} else {// raw_author is already an array from crawlerctx.list_of_authors = ctx.raw_author;ctx.first_author = ctx.raw_author[0];  // The first element}"""}},{"script": {"source": """// If raw_publish_date is null or empty array, set default to January 1, 1970if (ctx.raw_publish_date == null || ctx.raw_publish_date.trim().length() == 0) {ctx.raw_publish_date = "January 1, 1970";} else {ctx.raw_publish_date = ctx.raw_publish_date.trim();}"""}},{"date": {"field": "raw_publish_date","target_field": "publish_date","formats": ["MMMM d, yyyy"],"timezone": "UTC"}},{"remove": {"field": "raw_publish_date","ignore_missing": true}},{"remove": {"field": "raw_author","ignore_missing": true}}]
}

部署 ELSER

如果你使用的是 Elastic 的 serverless 项目,则可以使用默认的 ELSER 推理端点 (_inference/.elser-2-elasticsearch)。如果这样做,你需要更新索引模板中 body_semantic 的映射。

我们将创建一个新的推理端点,为其提供更多资源,这样非 serverless 的读者也可以享受乐趣!

PUT 新的推理端点

PUT _inference/sparse_embedding/elser-endpoint
{"service": "elser","service_settings": {"num_allocations": 32,"num_threads": 1}
}

Docker

这里只是简单说明一下。你必须在要运行爬虫的计算机或服务器上安装并运行 Docker。

查看 Docker 的入门指南以获取有关启动和运行的帮助。

Open Crawler

下载 Docker 镜像

你可以使用 Elastic 的官方镜像下载并启动 Open Crawler Docker 镜像。

docker run -i -d \
--name crawler \
docker.elastic.co/integrations/crawler:0.2.0

配置爬虫

我们将爬取 Elastic Search Labs 博客。Search Labs 有很多出色的搜索、ML 和 GenAI 内容。但它也链接到 elastic.co 的其他部分。我们将配置爬虫以限制我们的爬取,确保仅索引博客。

Crawler.yaml

  1. 创建一个新的 crawler.yaml 文件并粘贴以下代码
  2. allow 规则,用于 /search-labs/blog URL 模式下的所有内容(包括)
  3. 一个 “拒绝所有” 的规则,用于拦截所有其他 URL。
  4. 使用提取规则提取作者的姓名并将其分配给字段 “authors”。
    1. 有关提取规则示例的更多详细信息,请查看有关测试版的博客。
  5. 在此示例中,我们使用正则表达式模式作为拒绝规则。

将以下代码粘贴到 crawler.yml 中:

crawler.yml

domains:- url: https://www.elastic.coseed_urls:- https://www.elastic.co/search-labs/blog/crawl_rules:- policy: allowtype: beginspattern: "/search-labs/blog"- policy: denytype: regexpattern: ".*"extraction_rulesets:- url_filters:- type: beginspattern: /search-labs/blog/rules:- action: extractfield_name: raw_authorselector: ".Byline_authorNames__bCmvc a[href*='/search-labs/author/']"join_as: arraysource: html- action: extractfield_name: raw_publish_dateselector: "time.article-published-date"attribute: "datetime"join_as: stringsource: htmloutput_sink: elasticsearch
output_index: search-labs-blogssitemap_discovery_disabled: true
binary_content_extraction_enabled: falseelasticsearch:host: http://kubernetes-vmusername: elasticpassword: changemepipeline: parse_author_and_publish_datepipeline_enabled: truelog_level: debug

注:如果我们想使用自签名的 Elasticsearch 集群来演示,那么我们需要添加 fingerprint。你可以使用如下的命令来获得 fingerprint:

openssl x509 -fingerprint -sha256 -in config/certs/http_ca.crt
##  The SHA256 CA cert fingerprint used to verify SSL connection to Elasticsearch.
##    SSL usage is configured by the presence of `https` in `elasticsearch.host`
#elasticsearch.ca_fingerprint: null

将配置文件复制到正在运行的 docker 容器

运行下面的复制命令:

docker cp crawler.yml crawler:app/config/crawler.yml

启动抓取作业

我们现在可以抓取一些网页了!运行以下命令即可启动它。

docker exec -it crawler bin/crawler crawl config/crawler.yml

注意:你最初可能会在爬虫日志中看到超时。默认情况下,ELSER 部署会缩减为 0 个分配,以减少空闲时的成本。部署需要一分钟才能扩展。

转到文档!

返回 Kibana 中的控制台并输入以下搜索:

GET search-labs-blogs/_search
{"retriever": {"standard": {"query": {"semantic": {"field": "body_semantic","query": "How do I quantize vectors?"}}}},"_source": false,"fields": ["title","body"]
}

我收到的前五个标题是:

  1. Better Binary Quantization vs. Product Quantization - Search Labs
  2. Scalar quantization 101 - Search Labs
  3. RaBitQ binary quantization 101 - Search Labs
  4. Better Binary Quantization (BBQ) in Lucene and Elasticsearch - Search Labs
  5. Understanding Int4 scalar quantization in Lucene - Search Labs

所有查找可以帮助回答我的问题的博客。

Discover

你还可以跳转到 “Discover” 以查看文档表。

设置方法:

  • 单击 “ Data View” 选择器
  • 单击 “Create a data view”
  • 在索引模式框中,输入“search-labs-blogs”
  • 在 “Timestamp” 字段中,选择 “publish_date”
  • 单击 “Save data view to Kibana”

你可能需要更改时间选择器以设置更宽的范围。

  • 单击时间选择器(通常默认为“Last 15 minutes”)
  • 选择 “Last 1 year”

你可以单击左列字段名称旁边的 +,制作一个格式良好的表格,如下所示。

Discover 视图显示了从 Open Crawler 索引的 search labs 博客

按需工作坊

你已经坚持到最后了!为什么不在一个真实的按需工作坊环境中亲自动手实践以上内容呢?
点击此处立即参与。

想要获得 Elastic 认证?了解下一期 Elasticsearch 工程师培训何时举行!

Elasticsearch 包含许多新功能,可帮助您针对自己的用例构建最佳搜索解决方案。深入了解我们的示例笔记本以了解更多信息,开始免费云试用,或立即在本地机器上试用 Elastic。

原文:Semantic search using the Open Crawler and Semantic Text - Elasticsearch Labs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/491822.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫入门教程

安装python 中文网 Python中文网 官网 安装好后打开命令行执行(如果没有勾选添加到Path则注意配置环境变量) python 出现如上界面则安装成功 设置环境变量 右键我的电脑->属性 设置下载依赖源 默认的是官网比较慢,可以设置为清华大…

数据结十大排序之(冒泡,快排,并归)

接上期: 数据结十大排序之(选排,希尔,插排,堆排)-CSDN博客 前言: 在计算机科学中,排序算法是最基础且最重要的算法之一。无论是大规模数据处理还是日常的小型程序开发,…

游戏引擎学习第54天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们现在正专注于在游戏世界中放置小实体来代表所有的墙。这些实体围绕着世界的每个边缘。我们有活跃的实体,这些实体位于玩家的视野中,频繁更新,而那些离玩家较远的实体则以较低的频率运…

网络安全漏洞挖掘之漏洞SSRF

SSRF简介 SSRF(Server-Side Request Forgery:服务器端请求伪造是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外…

33. Three.js案例-创建带阴影的球体与平面

33. Three.js案例-创建带阴影的球体与平面 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 3D 场景的核心类。它负责将场景中的对象绘制到画布上。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersObject可选参数…

Go有限状态机实现和实战

Go有限状态机实现和实战 有限状态机 什么是状态机 有限状态机(Finite State Machine, FSM)是一种用于建模系统行为的计算模型,它包含有限数量的状态,并通过事件或条件实现状态之间的转换。FSM的状态数量是有限的,因此称…

iPhone恢复技巧:如何从 iPhone 恢复丢失的照片

在计算机时代,我们依靠手机来捕捉和存储珍贵的回忆。但是,如果您不小心删除或丢失了手机上的照片怎么办?这真的很令人沮丧和烦恼,不是吗?好吧,如果您在 iPhone 上丢失了照片,您不必担心&#xf…

Linux高性能服务器编程 | 读书笔记 | 6. 高性能服务器程序框架

6. 高性能服务器程序框架 《Linux 高性能服务器编程》一书中,把这一章节作为全书的核心,同时作为后续章节的总览。这也意味着我们在经历了前置知识的学习后,正式进入了 Web 服务器项目的核心部分的学习 文章目录 6. 高性能服务器程序框架1.服…

前端的知识(部分)

11 前端的编写步骤 第一步:在HTML的页面中声明方法 第二步:在<script>中定义一个函数,其中声明一个data来为需要的数据 赋值一个初始值 第三步:编写这个方法实现对应的功能

Xcode

info.plist Appearance Light 关闭黑暗模式 Bundle display name 设置app名称&#xff0c;默认为工程名 Location When In Use Usage Description 定位权限一共有3个key 1.Privacy - Location When In Use Usage Description 2.Privacy - Location Always and When In U…

C# 中的Task

文章目录 前言一、Task 的基本概念二、创建 Task使用异步方法使用 Task.Run 方法 三、等待 Task 完成使用 await 关键字使用 Task.Wait 方法 四、处理 Task 的异常使用 try-catch 块使用 Task.Exception 属性 五、Task 的延续使用 ContinueWith 方法使用 await 关键字和异步方法…

【Java 学习】:内部类详解

详谈Java内部类 &#x1f4c3;&#x1f4c3;本文将通过Java内部类 是什么&#xff0c;为什么被广泛使用&#xff0c;以及又该如何去使用这三个方面来详细讲解其相关知识。 文章目录 1. 内部类是什么 2. 为什么要使用内部类 3. 如何使用内部类 &#x1f349;成员内部类 &…

如何解决samba服务器共享文件夹不能粘贴文件

sudo vim /etc/samba/smb.conf在samba的配置文件中增加一个选项 writable yes重启Samba服务以使更改生效&#xff1a; sudo service smbd restart

PyTorch3D 可视化

PyTorch3D是非常好用的3D工具库。但是PyTorch3D对于可用于debug&#xff08;例如调整cameras参数&#xff09;的可视化工具并没有进行系统的介绍。这篇文章主要是想介绍我觉得非常使用的PyTorch3D可视化工具。 1. 新建一个Mesh 从hugging face上下载一个glb文件&#xff0c;例…

RabbitMQ的核心组件有哪些?

大家好&#xff0c;我是锋哥。今天分享关于【RabbitMQ的核心组件有哪些&#xff1f;】面试题。希望对大家有帮助&#xff1b; RabbitMQ的核心组件有哪些&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RabbitMQ是一个开源的消息代理&#xff08;Messag…

SM4笔记整理

文章目录 1. 介绍2. 算法定义3. 迭代运算3.1 轮函数F3.2 合成置换T 4. SM4秘钥生成4.1 具体步骤4.2 系统参数FK4.2 固定参数CK 5. 参考资料 以下内容为信息安全开发过程中&#xff0c;SM4对称加密算法的笔记。 对称加密算法汇总介绍&#xff1a;对称加密算法和模式 1. 介绍 …

如何使用Git or SVN--可视化工具

不会吧 现在还有人不会Git可视化工具 &#xff0c;作为一个从命令行转为可视化的开发者&#xff0c;深知这个可视化工具的重要性&#xff0c;之前在命令行去维护我们的工程是一个很头疼的事情 &#xff0c;后面也就有了可视化工具&#xff0c;市面上的工具的教程都不是很详细哥…

基于Clinical BERT的医疗知识图谱自动化构建方法,双层对比框架

基于Clinical BERT的医疗知识图谱自动化构建方法&#xff0c;双层对比框架 论文大纲理解1. 确认目标2. 目标-手段分析3. 实现步骤4. 金手指分析 全流程核心模式核心模式提取压缩后的系统描述核心创新点 数据分析第一步&#xff1a;数据收集第二步&#xff1a;规律挖掘第三步&am…

《Time Ghost》的制作:使用 DOTS ECS 制作更为复杂的大型环境

*基于 Unity 6 引擎制作的 demo 《Time Ghost》 开始《Time Ghost》项目时的目标之一是提升在 Unity 中构建大型户外环境的构建标准。为了实现这一目标&#xff0c;我们要有处理更为复杂的场景的能力、有足够的工具支持&#xff0c;同时它对引擎的核心图形、光照、后处理、渲染…

华为大数据_unittest单元测试框架解析与应用

一、引言 随着软件开发的复杂度日益增加&#xff0c;单元测试在软件质量保证体系中扮演着越来越重要的角色。unittest作为Python的标准单元测试框架&#xff0c;以其简单、易用和强大的特性&#xff0c;受到了广大开发者的青睐。本文旨在深入解析unittest框架的核心原理&#…