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
- 创建一个新的 crawler.yaml 文件并粘贴以下代码
- allow 规则,用于 /search-labs/blog URL 模式下的所有内容(包括)
- 一个 “拒绝所有” 的规则,用于拦截所有其他 URL。
- 使用提取规则提取作者的姓名并将其分配给字段 “authors”。
- 有关提取规则示例的更多详细信息,请查看有关测试版的博客。
- 在此示例中,我们使用正则表达式模式作为拒绝规则。
将以下代码粘贴到 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"]
}
我收到的前五个标题是:
- Better Binary Quantization vs. Product Quantization - Search Labs
- Scalar quantization 101 - Search Labs
- RaBitQ binary quantization 101 - Search Labs
- Better Binary Quantization (BBQ) in Lucene and Elasticsearch - Search Labs
- 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”
你可以单击左列字段名称旁边的 +,制作一个格式良好的表格,如下所示。

按需工作坊
你已经坚持到最后了!为什么不在一个真实的按需工作坊环境中亲自动手实践以上内容呢?
点击此处立即参与。
想要获得 Elastic 认证?了解下一期 Elasticsearch 工程师培训何时举行!
Elasticsearch 包含许多新功能,可帮助您针对自己的用例构建最佳搜索解决方案。深入了解我们的示例笔记本以了解更多信息,开始免费云试用,或立即在本地机器上试用 Elastic。
原文:Semantic search using the Open Crawler and Semantic Text - Elasticsearch Labs
相关文章:

Elasticsearch:使用 Open Crawler 和 semantic text 进行语义搜索
作者:来自 Elastic Jeff Vestal 了解如何使用开放爬虫与 semantic text 字段结合来轻松抓取网站并使其可进行语义搜索。 Elastic Open Crawler 演练 我们在这里要做什么? Elastic Open Crawler 是 Elastic 托管爬虫的后继者。 Semantic text 是 Elasti…...

Facebook的隐私保护政策:用户数据如何在平台上被管理?
在当今数字化世界,社交平台如何管理用户数据并保护隐私成为了一个热点话题。作为全球最大的社交网络,Facebook(现Meta)在数据隐私方面的政策备受关注。本文将简要介绍Facebook的隐私保护措施,以及用户数据如何在平台上…...
【ETCD】【源码阅读】深入解析 EtcdServer.applySnapshot方法
今天我们来一步步分析ETCD中applySnapshot函数 一、函数完整代码 函数的完整代码如下: func (s *EtcdServer) applySnapshot(ep *etcdProgress, apply *apply) {if raft.IsEmptySnap(apply.snapshot) {return}applySnapshotInProgress.Inc()lg : s.Logger()lg.In…...

HBase是什么,HBase介绍
官方网站:Apache HBase – Apache HBase Home HBase是一个分布式的、面向列的NoSQL数据库,主要用于存储和处理海量数据。它起源于Google的BigTable论文,是Apache Hadoop项目的子项目。HBase设计用于高可靠性、高性能和可伸…...
【Rust自学】3.3. 数据类型:复合类型
3.3.0. 写在正文之前 欢迎来到Rust自学的第三章,一共有6个小节,分别是: 变量与可变性数据类型:标量类型数据类型:复合类型(本文)函数和注释控制流:if else控制流:循环 通过第二章…...

【C++】小乐乐求和问题的高效求解与算法对比分析
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯问题描述与数学模型1.1 题目概述1.2 输入输出要求1.3 数学建模 💯方法一:朴素循环求和法2.1 实现原理2.2 分析与问题2.3 改进方案2.4 性能瓶颈与结论…...

configure错误:“C compiler cannot create executables“
执行./configure命令出现如下奇怪的错误,百思不得姐: ./configure命令的日志文件为config.log,发生错误时,该文件的内容: This file contains any messages produced by compilers while running configure, to aid d…...

PAT乙级 锤子剪刀布 巩固巩固map的使用
主要是想借这题巩固巩固c map的使用方法。 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。 输…...

Webpack学习笔记(1)
1.为什么使用webpack? webpack不仅可以打包js代码,并且那个且支持es模块化和commonjs,支持其他静态资源打包,如图片、字体。。。 2.如何解决作用域问题? 作用域问题:例如loadsh等库,会绑定window对象,会…...

使用xpath规则进行提取数据并存储
下载lxml !pip install lxmlimport requests headers{"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36" } url"https://movie.douban.com/chart" respon…...

【物联网技术与应用】实验3:七彩LED灯闪烁
实验3 七彩LED灯闪烁 【实验介绍】 七彩LED灯上电后,7色动闪光LED模块可自动闪烁内置颜色。它可以用来制作相当吸引人的灯光效果。 【实验组件】 ● Arduino Uno主板* 1 ● USB数据线* 1 ● 7彩LED模块*1 ● 面包板*1 ● 9V方型电池*1 ● 跳线若干 【实验原…...

素数回文数的个数
素数回文数的个数 C语言代码C 代码Java代码Python代码 💐The Begin💐点点关注,收藏不迷路💐 求11到n之间(包括n),既是素数又是回文数的整数有多少个。 输入 一个大于11小于1000的整数n。 输出…...
车辆重识别代码笔记12.18
1、实例归一化(Instance Normalization)和批量归一化(Batch Normalization) 实例归一化(Instance Normalization): 计算步骤: 对于每个输入样本,在每个通道上分别计算均…...

selenium 在已打开浏览器上继续调试
关闭浏览器,终端执行如下指令,--user-data-dir换成自己的User Data路径 chrome.exe --remote-debugging-port9222 --user-data-dir"C:\Users\xxx\AppData\Local\Google\Chrome\User Data" 会打开浏览器,打开百度,如下状…...

Sentry日志管理thinkphp8 tp8 sentry9 sentry8 php8.x配置步骤, tp8自定义异常处理类使用方法
tp8的默认使用的就是composer来管理第三方包, 所以直接使用 composer 来安装 sentry9 即可. 同时tp8和tp5的配置方式不太一样, 这里我们直接使用自定义异常类来处理Sentry的异常. 1. 安装 sentry9 包 # 安装 sentry9 包 composer require "tekintian/sentry9-php" …...

【经验分享】容器云搭建的知识点
最近忙于备考没关注,有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源,但我以交流、交换为主,笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟,为了避免更多人花没必要的钱,所以决定公…...
Java对集合的操作方法
1. 数组转集合 //数组转集合 String[] split quickRechargeAmount.split(","); List<String> stringList Stream.of(split).collect(Collectors.toList()); 2. 对List集合数据内容进行分组 //对List集合数据内容进行分组 Map<String, List<LiveAppGi…...

FreeRTOS--基础知识
FreeRTOS基础知识 裸机与RTOS的特点: 裸机: 裸机又称为前后台系统,前台系统指的是中断服务函数,后台系统指的是大循环,即应用程序。 1、实时性差:应用程序轮流执行 2、delay:空等待ÿ…...

Node的学习以及学习通过Node书写接口并简单操作数据库
Node的学习 Node的基础上述是关于Node的一些基础,总结的还行; 利用Node书写接口并操作数据库 1. 初始化项目 创建新的项目文件夹,并初始化 package.json mkdir my-backend cd my-backend npm init -y2. 安装必要的依赖 安装Express.js&…...

【Linux探索学习】第二十二弹——用户缓冲区:深入解析操作系统中数据交互时的缓冲区机制
Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 前面两章我们已经讲了一些文件操作和文件重定向问题,以及一些相关的知识点,比如文件在内存中的存储位置࿰…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...