首页 > 解决方案 > 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

更新了 Kibana 视图: 在此处输入图像描述

有什么方法可以禁用 Celery 中结果的序列化?

我可以为 Elasticsearch 添加一个带有解包 JSON 的拉取请求,但它看起来像一个 hack。

标签: pythonjsonelasticsearchcelery

解决方案


从 v4.0 开始,默认result_serializer值为json,所以无论如何你都应该得到 JSON 格式的结果。也许您的配置使用了其他东西?- 在这种情况下,我建议你删除它(如果你使用 Celery >=4.0),你应该享受 JSON 格式的结果。我更喜欢 msgpack 但另一方面我不在 Celery 结果上使用 ElasticSearch...


推荐阅读