Как выполнить операцию массового эластичного поиска из преобразователя AppSync?

#elasticsearch #aws-appsync #resolver #vtl

#elasticsearch #aws-appsync #преобразователь #vtl

Вопрос:

Я пытаюсь выполнить массовую операцию над индексом ElasticSearch из преобразователя VTL AppSync.

В частности, эта мутация:

 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",
  "operation": "POST",
  "path": "/topic-en/doc/_bulk",
  "params": {
    "headers" : [ { "Content-Type" : "application/x-ndjson" } ],
    "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 entriesn 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]"
    }
  ]
}
  

Есть идея?

Ответ №1:

я немного поиграл и понял, что вам нужно будет

  • заключите свои двойные кавычки
  • запишите все в одну строку, разделенную символом «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",
 "method": "POST",
 "resourcePath": "/_msearch/template",
 "params": {
   "headers": {
     "Content-Type": "application/x-ndjson"
   },
   "body": "#foreach ($line in $ndjson)$util.escapeJavaScript($util.toJson($line))n#end"
 }
}
  

(Возможно) проблемной частью может быть экранирование JavaScript. Не уверен, как выглядят ваши данные, но это может привести к появлению дополнительных данных в кавычках по мере необходимости.

P.s: я переключил свою реализацию на последний упомянутый пример, и он отлично работает для множественного поиска.

Комментарии:

1. Я получаю «Невозможно преобразовать для тела: $ [params] [body]». с вашим подходом..