elasticsearch-py 无法解析复杂的自定义类的解决方案
时间:2022-05-04
本文章向大家介绍elasticsearch-py 无法解析复杂的自定义类的解决方案,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
今天在测试插入操作的时候,定义了一个拥有嵌套类的自定义类型
class A:
pass
class B:
pass
b = B()
b.a = A()
大致如以上代码,当然是有字段的
直接调用
es.index(index=index, doc_type=doc_type, body=b)
会报出 elasticsearch.exceptions.SerializationError Unable to serialize B 的错误
看到以上错误后,猜测 elasticsearch-py 无法解析复杂的自定义类型,于是打算自己解析成 json
def convert_to_builtin_type(obj):
if isinstance(obj, (date, datetime)):
return str(obj)
else:
dic = {}
for att in obj.__dict__:
value = getattr(obj, att)
if value is object:
dic.update(DocumentType.convert_to_builtin_type(value))
else:
dic[att] = value
return dic
定义以上自定义处理方法后,调用
json.dumps(obj, default=convert_to_builtin_type)
这样 json 字符串是生成了,可是将其作为 body 进行插入的时候,又报出一个错误:
TransportError 400, 'mapper_parsing_exception', 'failed to parse datetime
当自定义类型中存在 datetime 类型的字段,经过上面自定义的处理方法后,生成的字符串与 elasticsearch-py 反序列化时的格式不同,就会报出这个错误
用 google 搜索解决方案的时候,不小心把 elasticsearch-py 的源代码搜出来了,又刚好看到它自定义的解析方法,于是把它的解析方式复制粘贴过来,问题解决。
def convert_to_builtin_type(obj):
if isinstance(obj, (date, datetime)):
return obj.isoformat()
elif isinstance(obj, Decimal):
return float(obj)
elif isinstance(obj, uuid.UUID):
return str(obj)
else:
dic = {}
for att in obj.__dict__:
value = getattr(obj, att)
if value is object:
dic.update(DocumentType.convert_to_builtin_type(value))
else:
dic[att] = value
return dic
- 利用Actor实现管道过滤器模式
- SpringBoot整合Quartz定时任务 的简单实例
- 从机器学习学python(一) ——numpy中的shape、tile、argsort
- 剖析响应式编程的本质
- 从机器学习学python(二) ——iteritems、itemgetter、sorted、sort
- 基于MVC理解React+Redux
- JavaScript的IIFE(即时执行方法)
- 从机器学习学python(三) ——数组冒号取值与extend
- 从机器学习学python(四) ——numpy矩阵基础
- 从map函数引发的讨论
- AngularJs中,如何在render完成之后,执行Js脚本
- PHP取得上周一、上周日,下周一
- 代码诊所
- 《编程之美》读书笔记(一)——中国象棋将帅有效位置
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 容器中的隔离与限制:namespace和cgroups
- 行为型设计模式:策略模式
- redis实战第十二篇 redis cluster请求重定向
- 行为型设计模式:责任链模式以及mybatis中的责任链
- java中BigDecimal使用和注意事项
- redis实战第十一篇 redis cluster添加密码
- Linux下docker制作springboot应用镜像
- 行为型设计模式:备忘录模式
- 行为型设计模式:访问者模式
- redis实战第十篇 集群收缩
- redis实战第九篇 集群扩容自动迁移槽(redis-cli)
- 自动化运维| Ansible playbook的逻辑控制语句
- Windows通用应用平台UWP持久化
- redis实战第八篇 集群扩容 手动迁移槽
- Xinetd服务的安装与配置详解