ElasticSearch 服务的简单 AWS AppSync 架构和解析器
simple AWS AppSync schema and resolver for ElasticSearch service
我想通过这种方式为 EslasticSearch 服务获取简单的 AppSync 解析器:
架构:
type Query {
searchESIndex(input: ESModelTypeInput!): ESModelRespType
}
input ESModelTypeInput {
es_body: String
es_index_name: String
}
type ESModelRespType {
es_resp: String
}
所以重点是只给出要搜索的索引名称和包含完整的 stingified body 或查询的 body 字符串
return 将 ElasticSearch 的完整响应作为字符串返回(用于进一步解析)
解析器:
{
"version":"2017-02-28",
"operation":"GET",
"path":"/$context.args.es_index_name/_search",
"params":{
"body": $util.toJson("$context.args.es_body")
}
}
}
响应模板:
## i need full result as a string, but how to convert it?
$context.result
查询将是:
query searchESIndex($esinput: ESModelTypeInput!) {
searchESIndex(input: $esinput) {
es_resp
}
}
变量:
{
"esinput": {
"es_index_name": "test2",
"es_body": "{\"size\": 10}"
}
}
我也应该有类似的突变
type Mutation {
insertToESIndex(input: ESModelTypeInput!): ESModelRespType
}
不幸的是,我的所有尝试都失败了。
有可能做到吗?
你能帮我吗?
我觉得有义务更新我的答案,因为@cyberwombat 指出了比我之前发布的更好的解决方案。
您可以通过以下方式将结果转换为字符串化 JSON。
选项 1:
#set($resultMap = {})
#foreach($key in $ctx.result.keySet())
$util.qr($resultMap.put("$key", $ctx.result.get($key)))
#end
#return($util.escapeJavaScript($util.toJson($resultMap)))
选项 2:
您可以将解析器转换为管道,并在 NodeJS 中创建一个简单的 Lambda 函数来对 JSON 对象进行字符串化。这就是您的 lambda 函数的样子:
exports.handler = (event, context, callback) => {
const response = {
statusCode: 200,
body: JSON.stringify(event.input.serviceConfig).replace(/\"/g, '\\"'),
};
callback(null, response)
};
您现在可以轻松地在解析器中使用返回的字符串并获得字符串化 JSON。
我的问题、解释和完整答案。
我想通过这种方式为 EslasticSearch 服务获取简单的 AppSync 解析器:
架构:
type Query {
searchESIndex(input: ESModelTypeInput!): ESModelRespType
}
input ESModelTypeInput {
es_body: String
es_index_name: String
}
type ESModelRespType {
es_resp: String
}
所以重点是只给出要搜索的索引名称和包含完整的 stingified body 或查询的 body 字符串 return 将 ElasticSearch 的完整响应作为字符串返回(用于进一步解析)
解析器:
{
"version":"2017-02-28",
"operation":"GET",
"path":"/$context.args.es_index_name/_search",
"params":{
"body": $util.toJson("$context.args.es_body")
}
}
}
响应模板:
## i need full result as a string, but how to convert it?
$context.result
查询将是:
query searchESIndex($esinput: ESModelTypeInput!) {
searchESIndex(input: $esinput) {
es_resp
}
}
变量:
{
"esinput": {
"es_index_name": "test2",
"es_body": "{\"size\": 10}"
}
}
我也应该有类似的突变
type Mutation {
insertToESIndex(input: ESModelTypeInput!): ESModelRespType
}
不幸的是,我的所有尝试都失败了。 有可能做到吗? 你能帮我吗?
我觉得有义务更新我的答案,因为@cyberwombat 指出了比我之前发布的更好的解决方案。
您可以通过以下方式将结果转换为字符串化 JSON。
选项 1:
#set($resultMap = {})
#foreach($key in $ctx.result.keySet())
$util.qr($resultMap.put("$key", $ctx.result.get($key)))
#end
#return($util.escapeJavaScript($util.toJson($resultMap)))
选项 2:
您可以将解析器转换为管道,并在 NodeJS 中创建一个简单的 Lambda 函数来对 JSON 对象进行字符串化。这就是您的 lambda 函数的样子:
exports.handler = (event, context, callback) => {
const response = {
statusCode: 200,
body: JSON.stringify(event.input.serviceConfig).replace(/\"/g, '\\"'),
};
callback(null, response)
};
您现在可以轻松地在解析器中使用返回的字符串并获得字符串化 JSON。