前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >elasticsearch-py 无法解析复杂的自定义类的解决方案

elasticsearch-py 无法解析复杂的自定义类的解决方案

作者头像
Venyo
发布2018-03-15 13:31:01
1.7K0
发布2018-03-15 13:31:01
举报
文章被收录于专栏:Venyo 的专栏Venyo 的专栏

今天在测试插入操作的时候,定义了一个拥有嵌套类的自定义类型

代码语言:javascript
复制
class A:
    pass

class B:
    pass

b = B()
b.a = A()

大致如以上代码,当然是有字段的

直接调用

代码语言:javascript
复制
es.index(index=index, doc_type=doc_type, body=b)

会报出 elasticsearch.exceptions.SerializationError Unable to serialize B 的错误

看到以上错误后,猜测 elasticsearch-py 无法解析复杂的自定义类型,于是打算自己解析成 json

代码语言:javascript
复制
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

定义以上自定义处理方法后,调用

代码语言:javascript
复制
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 的源代码搜出来了,又刚好看到它自定义的解析方法,于是把它的解析方式复制粘贴过来,问题解决。

代码语言:javascript
复制
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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档