You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用Python Elasticsearch库以不同内容类型执行索引请求

问题说明
  • 我们能否使用Python elasticsearch库的index方法发送不同内容类型的数据?
  • ingest-attachment插件文档提到,使用CBOR编码可以避免对附件文件进行BASE64编解码操作。但问题撰写时,官方给出的使用示例均通过requests库而非Elasticsearch客户端发送请求,参考示例代码如下:
import cbor2
import requests

file = 'my-file'
headers = {'content-type': 'application/cbor'}

with open(file, 'rb') as f:
  doc = {
    'data': f.read()
  }
  requests.put(
    'http://localhost:9200/my-index-000001/_doc/my_id?pipeline=cbor-attachment',
    data=cbor2.dumps(doc),
    headers=headers
  )
实现方案

可以直接通过elasticsearch库实现该操作,不需要额外依赖requests库:

  • elasticsearch库默认会将传入的文档自动序列化为JSON格式,并默认设置content-type: application/json的请求头。要发送CBOR格式的二进制内容,核心逻辑和官方requests示例完全一致:提前把文档序列化为CBOR二进制流,手动指定对应内容类型的请求头,跳过客户端的自动序列化步骤即可。
  • 参考实现代码:
from elasticsearch import Elasticsearch
import cbor2

# 初始化连接客户端
es = Elasticsearch("http://localhost:9200")

# 提前构造CBOR编码的请求payload
with open("my-file", "rb") as f:
    doc = {"data": f.read()}
cbor_payload = cbor2.dumps(doc)

# 调用index接口发送请求
es.index(
    index="my-index-000001",
    id="my_id",
    pipeline="cbor-attachment",
    body=cbor_payload,
    headers={"content-type": "application/cbor"}
)
  • 注意事项:部分较早版本的elasticsearch库会强制覆盖请求的content-type头为application/json,遇到这种情况可以在客户端初始化时自定义全局序列化配置,或调用客户端底层的perform_request方法绕开上层封装,即可达到和原生requests请求完全一致的效果。

内容的提问来源于stack exchange,提问作者Czyzby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 19:24:03