Elasticsearch 索引客户端
适用于 Python 3.13,依赖为 elasticsearch==9.2.0。ElasticsearchIndexClient 是示例定义的类,一个实例绑定一个索引。连接地址、认证、超时和重试由调用方创建的官方 Elasticsearch 客户端管理。
| 接口 | 作用 | 返回值 |
|---|---|---|
create_index(mappings, settings=None) | 按字段定义和设置创建新索引 | 官方创建响应;索引已存在时报错 |
bulk_index(records, chunk_size=500, refresh=False) | 分批新增文档,同 ID 整条替换 | 全部批次成功时返回写入数 |
search(query, size=10, **options) | 执行 Query DSL,传入排序、返回字段或聚合等选项 | 完整搜索响应 |
get(document_id) | 按 ID 读取文档 | 含 _source 的完整响应 |
update(document_id, fields, refresh=False) | 合并给定字段,不存在时报错 | 官方更新响应 |
delete(document_id, refresh=False) | 删除指定文档 | 官方删除响应 |
close() | 关闭传入客户端的连接 | 无返回值 |
search() 保留原生 Query DSL。query 填查询条件;source、sort、from_、aggs 等选项使用官方 Python 客户端的参数名。返回的完整响应保留总数、聚合和分片执行情况;命中文档位于 ["hits"]["hits"],聚合结果位于 ["aggregations"]。
批量写入中的 id 是文档 ID,doc 是完整正文。 两个键是这个示例的调用约定,封装将它们转成 Bulk API 的 _id 和 _source。id 不会自动成为正文里的字段。
| |
bulk_index() 使用官方 helpers.bulk(),每批最多 chunk_size 条,较大的文档还受 helper 的批次字节数限制。同 ID 的 index 操作会替换整条文档:新 doc 没有的旧字段会消失。只修改几个字段时调用 update();该方法不会为不存在的 ID 新建文档。
批量写入不是整体事务。 某批包含失败项时,helper 默认抛出 BulkIndexError,错误详情在异常的 errors 属性中;同批和之前批次已成功的文档仍然保留,尚未发送的批次不再执行。请求级异常同样交给调用方,封装不吞掉错误,也不额外重试。底层请求是否重试取决于创建官方客户端时的配置。
refresh=False不等待写入对搜索可见;refresh="wait_for"会等待受影响分片刷新。批量 helper 为每一批传入这个参数,多批依次等待会延长导入时间。运行示例需要立即检查搜索结果,因而显式传入"wait_for"。按 ID 的get()默认实时读取,不依赖搜索刷新。
常驻服务在每个工作进程中创建官方客户端,请求间复用。停止接收请求、进行中的操作全部完成后关闭连接。多个索引封装共享同一个官方客户端时,调用其中任意实例的 close() 都会关闭这组共享连接,应由同一处管理关闭时机。
request_timeout是单次底层请求的等待时限,不是整个批量任务的总时限。认证信息、证书和连接重试参数均传给官方Elasticsearch构造函数,封装不修改它们。
将代码作为 elasticsearch_client.py 放在调用脚本同目录或 Python 可导入路径中。文件末尾的独立示例连接正文部署的本地服务,环境变量名是示例约定:
| |
直接运行会创建 client_example_es 索引,写入三条文档,修改其中一条并删除另一条。 示例保留索引和剩余文档,重复运行前更换一个未使用的索引名。它设置一个主分片、零副本,与本地单节点服务对应;已有索引的查询方式见正文第 8 节。
接口参数与批量操作参考:官方 Python API、官方 Bulk helpers。
| |