能否使用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
相关产品推荐
相关产品推荐

