用于 ElasticSearch 服务的简单 AWS AppSync 架构和解析器

Posted

技术标签:

【中文标题】用于 ElasticSearch 服务的简单 AWS AppSync 架构和解析器【英文标题】:simple AWS AppSync schema and resolver for ElasticSearch service 【发布时间】:2020-09-29 22:25:57 【问题描述】:

我想通过这种方式为 EslasticSearch 服务获取简单的 AppSync 解析器:

架构:

type Query 
  searchESIndex(input: ESModelTypeInput!): ESModelRespType


input ESModelTypeInput 
  es_body: String
  es_index_name: String


type ESModelRespType 
  es_resp: String

所以关键是只给出要搜索的索引名称以及包含完整的 stingified 正文或查询的正文字符串 并将 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

很遗憾,我所有的尝试都失败了。 有可能做到吗? 你能帮我解决这个问题吗?

【问题讨论】:

您的响应将是 JSON,将其转换为字符串的一种方法是使用 $util.dynamodb.toString(...)。你试过这个吗?此外,您定义“ESModelRespType”是否有任何具体原因,而您可以只执行“type Query searchESIndex(input: ESModelTypeInput!): String”?您也可以分享您遇到的错误吗? 另外,我认为您测试查询的方式存在错误。根据您对查询的定义,'es_resp' 嵌套在 'ESModelRespType' 中,因此为了测试它,正确的查询语法应该是 'query searchESIndex($esinput:ESModelTypeInput!) searchESIndex(input: $esinput) ESModelRespType:es_resp'。 $util.dynamodb.toString(...) 导致:“消息”:“在 com.amazonaws.deepdish.transform.util.DynamoDBUtils 类中调用方法 'toString' 引发异常 java。 lang.IllegalArgumentException:速度的参数数量错误[第 15 行,第 16 列]" 【参考方案1】:

我觉得有义务更新我的答案,因为@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:

您可以将解析器转换为 Pipeline,并在 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。

Link我的问题,解释和完整答案。

【讨论】:

以上是关于用于 ElasticSearch 服务的简单 AWS AppSync 架构和解析器的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch+Logstash+Kibana日志采集服务搭建并简单整合应用

MySQL 的 ElasticSearch 用于聚合数千万条非常简单的记录

全文检索(elasticsearch入门)

ELK服务基础

elasticsearch 的使用

ELK日志框架:安装Elasticsearch组建单服务器多节点集群