Elasticsearch:升级到 elasticsearch-py 8.x 的 10 个理由

作者:来自 Elastic 公司 Quentin_Pradet

早在 2022 年 2 月,当 Elasticsearch 8.0 发布时,Python 客户端也发布了 8.0 版本。 它是 7.x 客户端的部分重写,并附带了许多不错的功能(概述如下),但也有弃用警告和重大更改。 如今,7.17 版客户端仍然相对受欢迎,每月下载量超过 100 万次,约占 8.x 下载量的 50%。

作为 Elasticsearch Python 客户端的新维护者,我希望我们的社区能够从我们在客户端中所做的改进中受益,通过帮助所有 elasticsearch-py 用户:

  • 帮助 7.17 用户迁移到 8.x,
  • 帮助 8.x 用户利用新功能。

根据我作为 urllib3 维护者的经验,我知道投资 urllib3 2.0 迁移指南 并帮助用户迁移是有回报的。 同样,我们现在正在努力通过删除弃用警告和重大更改来使 elasticsearch-py 8.x 更易于使用。 这篇文章重点介绍了升级到 8.x 的充分理由:这些理由在近两年内都是如此,但最近的理由也是如此。 顺便说一句,如果你已经确信,请查看我们的迁移指南(如果你遇到困难,请务必联系我们!):

Migrating to 8.0 | Elasticsearch Python Client [8.11] | Elastic

话不多说,以下是使用 elasticsearch-py 8.x 的十个理由。

1. 支持最新的 Elasticsearch API

Elasticsearch 8 是 Elasticsearch 的最佳版本,全面进行了许多改进,并大大增加了可扩展性。更重要的是,对于我们对 Python 客户端的讨论,添加了各种新的 API:

  • 使用 _search API 的 knn 选项进行向量搜索(8.5,替换 8.0 中引入的 _knn_search API)
  • 执行模型推理 API (8.11) 和训练模型 API (8.5)
  • 搜索应用程序 (8.8)、查询规则 (8.10) 和同义词 API (8.10)

由于客户端是根据 Elasticsearch 规范生成的,因此可以保证获得最新、最好的 API。

2. Elasticsearch DSL 客户端 8.x

Elasticsearch DSL 客户端  是一个高级库,其目的是帮助以更简洁的方式编写和运行针对 Elasticsearch 的查询。 使用与之前文章相同的 christmas_characters 索引作为示例:

response = client.search(index="christmas_characters",query={"bool": {"must": [{"match": {"behavior": "good"}}]}}
)for hit in response['hits']['hits']:print(hit['_score'], hit['_source']['title'])

变成:

s = Search(using=client, index="christmas_characters").query("match", behavior="good")for hit in s.execute():print(hit.meta.score, hit.title)

你要么喜欢它的简洁性,要么讨厌学习新的 DSL,但这个客户端非常受欢迎,每月下载量超过 300 万次,并拥有专门的用户群。 它过去维护得很差,一直停留在 7.4.1 版本,但我在 9 月份发布了 8.9.0 版本,这是第一个与主要 Python 客户端版本 8 兼容的版本。

我致力于维护它,并于上个月发布了 8.11.0,以支持 Python 3.12 并允许折叠(collapsing queries)查询(相关 GitHub 问题已累积 38 票!)。

3. 种类型提示和更多 Pythonic API

从 Elasticsearch Python 客户端的早期(早在 2013 年 7 月起!)开始,body 参数就是为接受它的请求指定请求正文的方法。 使用 body 的 API 调用如下所示:

es.search(index="christmas_characters",body={"query": {"match_all": {}},"size": 50,}
)

然而,这个参数是一个无类型的 Python 字典,没有经过客户端验证,这意味着在将请求发送到服务器之前你无法判断你的请求是否正确。 但你不想了解生产中的基本问题! 因此,elasticsearch-py 8.0 利用 Elasticsearch 规范引入了更好的 API,该规范提供了每个 API 的完整类型。 第一层主体键可以使用 Python 参数指定:

es.search(index="christmas_characters",query={"match_all": {}},size=50,
)

这具有多种优点,包括更好的自动完成和类型检查。 例如,如果 size 不是整数,mypy 将引发错误。 因为我们意识到我们可以将 body unpack 为类型化参数,如下所示:

es.search(index="christmas_characters",**{"query": {"match_all": {}}, "size": 50}
)

我们决定在 elasticsearch-py 8.0 中完全弃用 body 参数。

4. 恢复 body 参数

然而,弃用 body 有以下缺点:

  • 过去十年编写的许多代码现在都触发了弃用警告
  • 未知参数(例如 sub_searches 或 Elasticsearch 规范中的无意遗漏)被拒绝,导致查询彻底失败,不必要地强制使用原始请求。
  • 诸如传递已编码主体以避免支付序列化 JSON 成本之类的优化已不再可能。

客户端的原作者 Honza Král 指出了这些问题 ,我们决定让 body 与新 API 一起像以前一样工作,没有任何警告。 这将在 elasticsearch-py 8.12 中提供,我们希望这将有助于 elasticsearch-py 8.x 的采用。

5. 记录调试请求

elasticsearch-py 8.x 客户端基于 elastic-transport 库,可以作为不同客户端的基础。 该库引入了一个非常有用的功能来调试请求和响应,通过调用 elastic_transport.debug_logging() 来启用。

import elastic_transport
from elasticsearch import Elasticsearch# In this example we're debugging an Elasticsearch client:
client = Elasticsearch(...)
# Use `elastic_transport.debug_logging()` before the request
elastic_transport.debug_logging()client.search(index="christmas_characters",query={"bool": {"must": [{"match": {"behavior": "good"}}]}}
)

上述脚本将输出以下日志:

[2021-11-23T14:11:20] > POST /example-index/_search?typed_keys=true HTTP/1.1
> Accept: application/json
> Accept-Encoding: gzip
> Authorization: Basic <hidden>
> Connection: keep-alive
> Content-Encoding: gzip
> Content-Type: application/json
> User-Agent: elastic-transport-python/8.11.0+dev
> X-Elastic-Client-Meta: es=8.11.0p,py=3.12.0,t=8.11.0p,ur=2.1.0
> {"query":{"match":{"text-field":"value"}}}
< HTTP/1.1 200 OK
< Content-Encoding: gzip
< Content-Length: 165
< Content-Type: application/json;charset=utf-8
< Date: Tue, 12 Dec 2022 20:11:20 GMT
< X-Cloud-Request-Id: ctSE59hPSCugrCPM4A2GUQ
< X-Elastic-Product: Elasticsearch
< X-Found-Handling-Cluster: 40c9b5837c8f4dd083f05eac950fd50c
< X-Found-Handling-Instance: instance-0000000001
< {"hits":{...}}

从我了解到这个功能的那天起,这个功能就成为了我开发工作流程的重要组成部分,现在我在其他客户端中怀念它:它就是那么好!

6. 全链 SSL/TLS 指纹固定

当通过 HTTPS 与 Elasticsearch 通信时(这是从 Elasticsearch 8 开始的默认设置),客户端需要能够验证服务器正在使用的证书,就像你的浏览器在获取单词之前必须验证 discuss.elastic.co 的证书一样 您当前正在阅读。 这是通过跟踪证书链直至根证书颁发机构(根 CA)来实现的。 但是,该根 CA 不一定是已受信任的通用根 CA,而可能是整个公司使用的企业根 CA,甚至可能是 Elasticsearch 为单个集群生成的根 CA。

在这些情况下,有两种方法可以正确验证证书:

  1. 将相关的证书颁发机构存储在文件中,并配置 ca_certs 参数。 然而,存储此文件需要额外的步骤,并且访问公共证书并不总是那么容易。
  2. 指定集群中每个节点的 SSL 指纹,以确保每个节点的证书永远不会改变。 但是,你需要为每个节点执行此操作,这对于较大的集群来说在实践中是不可能的。

值得庆幸的是,作为 Python 信任存储工作的一部分,前 Elasticsearch Python 客户端维护者 Seth Larson 意识到,使用 Python 3.10+ 私有 API ,可以固定根 CA 的指纹,从而允许验证所有节点的证书,从而带来 两全其美的。 请参阅配置| Elasticsearch Python 客户端 [8.11] | Elastic 适用于 Python 客户端中有关 TLS 的所有选项。

7. options() API

在 elasticsearch-py 7.x中,客户端 API 方法中允许使用每个请求选项,例如 api_key 和 ignore。 然而,这很令人困惑,因为它混合了传输级参数和 API 级参数。 现在已弃用,因为 elasticsearch-py 8.x 引入了 options() API,转换:

client.search(index="christmas_characters", request_timeout=10)

为:

client.options(request_timeout=10).search(index="christmas_characters")

有关详细信息,请参阅迁移指南。

8. 改进文档

当前的主要焦点是改进 Python 客户端的文档。

API 参考按命名空间划分,以减少类似名称的 API(如 es.exists 和 es.indices.exists)之间的混淆。

它还包括内联类型提示:

最后,添加了 快速入门 和 交互式示例 页面。

9.无服务器 - serverless

Elastic 的最新产品 Serverless 有一个专用的 Elasticsearch Python 客户端 elasticsearch-serverless-python,其中仅包含 Serverless 支持的 API 和选项。

也就是说,默认的 Python 客户端 elasticsearch-py 也支持 Serverless,这使得你可以轻松地使用现有代码尝试 Serverless!

10. 生成式人工智能

Elastic 在 Generative AI 方面投入了大量资金,Elasticsearch 是下载次数最多的向量数据库! 最好的入门方式是 Elastic Search Labs。它包含适用于 elasticsearch-py 8.x 的每个用例的博客文章和 Python 笔记本。

就是这样! 谢谢阅读。 当你准备好升级时,迁移指南是最好的起点。

Migrating to 8.0 | Elasticsearch Python Client [8.11] | Elastic

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

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

相关文章

SpringBoot请求参数加密、响应参数解密

SpringBoot请求参数加密、响应参数解密 1.说明 在项目开发工程中&#xff0c;有的项目可能对参数安全要求比较高&#xff0c;在整个http数据传输的过程中都需要对请求参数、响应参数进行加密&#xff0c;也就是说整个请求响应的过程都是加密处理的&#xff0c;不在浏览器上暴…

Spark---RDD(Key-Value类型转换算子)

文章目录 1.RDD Key-Value类型1.1 partitionBy1.2 reduceByKey1.3 groupByKeyreduceByKey和groupByKey的区别分区间和分区内 1.4 aggregateByKey获取相同key的value的平均值 1.5 foldByKey1.6 combineByKey1.7 sortByKey1.8 join1.9 leftOuterJoin1.10 cogroup 1.RDD Key-Value…

《罗素论教育》笔记

目录 全书架构 书简介 经典摘录 一、教育的理想 教育的基本原理 教育的目的 二、品性的教育 一岁前的教育 主要是2岁到6岁的教育 三、智力教育 14岁前的课程安排 最后的学年 大学教育 四、结束语 全书架构 书简介 经典摘录 一、教育的理想 教育的基本原理 1、我…

vue3+echarts应用——深度遍历html的dom结构并用树图进行可视化

文章目录 ⭐前言&#x1f496;vue3系列文章 ⭐html数据解析&#x1f496; html字符串转为html对象&#x1f496; 深度遍历html对象内容 ⭐echarts 树图的渲染&#x1f496; 处理html内容为树状结构&#x1f496; 渲染树状图&#x1f496; inscode代码块 ⭐总结⭐结束 ⭐前言 大…

【面试高频算法解析】算法练习5 深度优先搜索

前言 本专栏旨在通过分类学习算法&#xff0c;使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目&#xff0c;帮助您深度理解每种算法&#xff0c;避免出现刷了很多算法题&#xff0c;还是一知半解的状态 专栏导航 二分查找回溯&#xff08;Backtracking&…

湖南大学-数据库系统-2017期末考试解析

【写在前面】 这是2017年的卷子&#xff0c;复习备考的时候做了并与同学校对了答案。答案仅供参考。这张难度不大&#xff0c;比起前一年的并没有增加什么知识点。这一年好像没有简答题。 一、 单选题&#xff08;每小题 2 分&#xff0c;共 20 分&#xff09; 1 、数据库的概…

实战:低代码表单引擎助力文件上传与数据处理

在当今的信息化时代&#xff0c;数据已成为企业的重要资产。为了更好地管理和利用这些数据&#xff0c;许多企业开始采用表单上传组件来导入和处理数据。通过使用表单上传组件&#xff0c;用户可以方便地将文件上传至系统中&#xff0c;然后进行后续的数据处理和分析。这种方式…

局域网IP地址冲突、环路的罪魁祸首是什么?

中午好&#xff0c;我的网工朋友。 这个时代&#xff0c;网络已经贯穿了人们的生活&#xff0c;对企业而言&#xff0c;办公信息化更是离不开网络支持。 为了提高安全管理和信息化水平&#xff0c;很多企业都建立了完善的办公信息系统&#xff0c;但一些企业在网络建设方面还…

varnish的简单使用

varnish的简单使用 安装配置配置启动参数文件配置环境信息文件配置varnish反向代理 配置varnish启动varnish更加直观的查看varnish缓存手动清除缓存清除指定的缓存 varnish配置多后端配置多后端在本地配置域名解析查看测试结果 负载均衡配置导入模块定义负载均衡调度器调用负载…

ADS仿真 之 容差/良率分析

之所以要进行容差分析&#xff0c; 是因为任何电子元器件均存在一定的误差&#xff0c; 如电感、电容的精度等。 例如一个标称为2.0nH0.1nH的电感&#xff0c;代表的意思产品有99.74%的概率落在2.0nH0.1nH范围内&#xff0c; 即满足6σ &#xff0c;σ是标准偏差或者说方差&…

Java虚拟机ART 读书笔记 第2章 深入理解Class文件格式

GitHub - Omooo/Android-Notes: ✨✨✨这有一包小鱼干&#xff0c;确定不要吃嘛&#xff1f;( 逃 深入理解Android&#xff1a;Java虚拟机ART 读书笔记 以下内容均来自书中内容 建议看原书哦 第2章 深入理解Class文件格式 2.1 class文件总览 Class文件格式全貌 u4&#xff…

苹果电脑交互式原型设计软件Axure RP 9 mac特色介绍

Axure RP 9 for Mac是一款交互式原型设计软件&#xff0c;使用axure rp9以最佳的方式展示您的作品&#xff0c;优化现代浏览器并为现代工作流程设计。同时确保您的解决方案正确完整地构建。Axure RP 9 for Mac为您整理笔记&#xff0c;将其分配给UI元素&#xff0c;并合并屏幕注…