python - ElasticSearch 的 Celery 结果类型
问题描述
我目前正在为我的工作探索 celery,并且正在尝试设置 Elasticsearch 后端。有没有办法将结果值作为字典/JSON而不是文本发送?因此,Elasticsearch 中的结果会正确显示并且可以使用嵌套类型吗?
celery 创建的自动映射
{
"celery" : {
"mappings" : {
"backend" : {
"properties" : {
"@timestamp" : {
"type" : "date"
},
"result" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
}
我尝试使用嵌套字段创建自己的映射,但结果是elasticsearch.exceptions.RequestError: RequestError(400, 'mapper_parsing_exception', 'object mapping for [result] tried to parse field [result] as object, but found a concrete value')
更新
结果已经用 JSON 编码,并且在 Elasticsearch 包装器中 JSON 字符串保存在字典中。添加json.loads(result)
为快速修复实际上会有所帮助。
快速修复新映射出现后:
{
"celery" : {
"mappings" : {
"backend" : {
"properties" : {
"@timestamp" : {
"type" : "date"
},
"result" : {
"properties" : {
"date_done" : {
"type" : "date"
},
"result" : {
"type" : "long"
},
"status" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"task_id" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
}
}
}
有什么方法可以禁用 Celery 中结果的序列化?
我可以为 Elasticsearch 添加一个带有解包 JSON 的拉取请求,但它看起来像一个 hack。
解决方案
从 v4.0 开始,默认result_serializer
值为json
,所以无论如何你都应该得到 JSON 格式的结果。也许您的配置使用了其他东西?- 在这种情况下,我建议你删除它(如果你使用 Celery >=4.0),你应该享受 JSON 格式的结果。我更喜欢 msgpack 但另一方面我不在 Celery 结果上使用 ElasticSearch...
推荐阅读
- typescript - TypeScript,我不能省略
. 为什么? - vue-native - 如何在 vue-native 中制作 webview
- c# - 在 Firebase 上调用带有消息正文的 GET
- javascript - 反序列化json数组以获取值以过滤asp.net mvc中的jqgrid数据
- php - 使用 is_unique 表单验证会导致“用户名字段必须包含唯一值”。错误信息
- python - requests.get() 需要很长时间才能执行
- python - 使用 OpenCV 去除视网膜图像中具有形态学侵蚀的小血管
- angular - 离子组件被路由器打开时调用什么方法?
- javascript - 如何使用可用性 reactstrap 验证禁用表单提交按钮
- javascript - 缩短多重和重复属性