微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从AppSync解析器执行批量ElasticSearch操作?

如何解决如何从AppSync解析器执行批量ElasticSearch操作?

我正在尝试通过VTL AppSync解析器对ElasticSearch索引执行批量操作。

特别是这种突变:

input CreatetopicsInput {
  language: String!
  texts: [String!]!
}

type Mutation {
  createtopics(input: CreatetopicsInput!): [Topic!]
}

我创建了以下解析器: Mutation.createtopics.req.vtl

#set( $body = "" )
#set( $q = '"' )
#foreach( $text in $ctx.args.input.texts )
  #set( $body = $body.concat("{ ${q}index${q}: { ${q}_id${q}: ${q}${text}${q} } }
") )
  #set( $body = $body.concat("{ ${q}text${q}: ${q}$text${q},${q}suggest${q}: { ${q}input${q}: ${q}$text${q} } }
") )
#end
{
  "version": "2017-02-28","operation": "POST","path": "/topic-${ctx.args.input.language}/doc/_bulk","params": {
    "headers" : [ { "Content-Type" : "application/x-ndjson" } ],"body": "$body"
  }
}

例如在执行以下数据时:

mutation Createtopic {
  createtopics(input: {
    language: "en",texts: [ "COVID","Election" ]}) {
    text
  }
}

似乎输出正确的调用

{
  "version": "2017-02-28","path": "/topic-en/doc/_bulk","body": "{ "index": { "_id": "COVID" }
{ "text": "COVID" }
{ "index": { "_id": "Election" }
{ "text": "Election" }
"
  }
}

但不起作用。具体来说会抛出:

{
  "data": {
    "createtopics": null
  },"errors": [
    {
      "path": [
        "createtopics"
      ],"data": null,"errorType": "MappingTemplate","errorInfo": null,"locations": [
        {
          "line": 2,"column": 3,"sourceName": null
        }
      ],"message": "Unexpected character ('i' (code 105)): was expecting comma to separate Object entries\n at [Source: (String)\"{\n  \"version\": \"2017-02-28\",\n  \"operation\": \"POST\",\n  \"path\": \"/topic-en/doc/_bulk\",\n  \"params\": {\n    \"headers\" : { \"Content-Type\" : \"application/x-ndjson\" },\n    \"body\": \"{ \"index\": { \"_id\": \"CODID\" } }\n{ \"text\": \"CODID\",\"suggest\": { \"input\": \"CODID\" } }\n{ \"index\": { \"_id\": \"Election\" } }\n{ \"text\": \"Election\",\"suggest\": { \"input\": \"Election\" } }\n\"\n  }\n}\n\"; line: 7,column: 18]"
    }
  ]
}

有什么主意吗?

解决方法

我玩了一会儿,发现你需要

  • 引用双引号
  • 全部写成一行,并用“ \ n”除
  • 该行的最后一部分需要再次为“ \ n”

例如:

{
 "version": "2018-05-29","method": "POST","resourcePath": "/_msearch/template","params": {
   "headers": {
     "Content-Type": "application/x-ndjson"
   },"body": "{ \"index\": { \"_id": \"COVID\" }\n{ \"text\": \"COVID\" }\n"
 }
}

当然,这并不是很令人信服,对于您的用例,它可能会更好地工作:

#set($ndjson = [])
$util.qr($ndjson.add({ "index": "COVID" }))
$util.qr($ndjson.add({ "text": "COVID","Param2": "vaccine" } }))
 
 
{
 "version": "2018-05-29","body": "#foreach ($line in $ndjson)$util.escapeJavaScript($util.toJson($line))\n#end"
 }
}

(也许)有问题的部分可能是JavaScript转义。不确定数据的外观如何,但可能会根据需要生成更多引用的数据。

P.s:我将实现方式切换到上一个提到的示例,并且在多重搜索中效果很好。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。