#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]». с вашим подходом..