Elasticsearch 解析程序映射模板参考
借助 Amazon Elasticsearch Service 的 AWS AppSync 解析程序,您可以使用 GraphQL 在您的账户的现有 Amazon ES 域中存储和检索数据。此解析程序的工作方式是:使您可以将传入的 GraphQL 请求映射到 Amazon ES 请求,然后将 Amazon ES 响应映射回 GraphQL。本节介绍支持的 Amazon ES 操作的映射模板。
请求映射模板
大多数 Amazon ES 请求映射模板都具有共同的结构,其中只有几项变化。以下示例对 Amazon ES 域运行搜索,其中文档属于 post
类型并以 id
编入索引。搜索参数在 body
部分定义,而许多常用查询子句在 query
字段中定义。此示例将搜索在文档的 "Nadia"
字段中包含 "Bailey"
和/或 author
的文档。
{ "version":"2017-02-28", "operation":"GET", "path":"/id/post/_search", "params":{ "headers":{}, "queryString":{}, "body":{ "from":0, "size":50, "query" : { "bool" : { "should" : [ {"match" : { "author" : "Nadia" }}, {"match" : { "author" : "Bailey" }} ] } } } } }
有关查询选项的更多信息,请参阅 Elasticsearch 查询 DSL 参考
响应映射模板
对于其他数据源,Amazon ES 将响应发送到 AWS AppSync,此响应需要转换为 GraphQL。可以在 Elasticsearch 请求正文搜索 DSL 参考
大多数 GraphQL 查询会从 Amazon ES 响应中查找 _source
字段。因为您可以执行搜索以返回单个文档或文档列表,所以 Amazon ES 中使用两个常见的响应映射模板:
结果列表
[ #foreach($entry in $context.result.hits.hits) #if( $velocityCount > 1 ) , #end $utils.toJson($entry.get("_source")) #end ]
单个项目
$utils.toJson($context.result.get("_source"))
operation
field
(仅限 REQUEST 映射模板)
AWS AppSync 发送到 Amazon ES 域的 HTTP 方法或动词(GET、POST、PUT、HEAD 或 DELETE)。键和值都必须是字符串。
"operation" : "PUT"
path
field
(仅限 REQUEST 映射模板)
AWS AppSync 中 Amazon ES 请求的搜索路径。这构成了操作的 HTTP 谓词的 URL。键和值都必须是字符串。
"path" : "/indexname/type" "path" : "/indexname/type/_search"
评估映射模板时,此路径作为 HTTP 请求的一部分发送,包括 Amazon ES 域。例如,上一个示例可能会转换为:
GET https://elasticsearch-domain-name.REGION.es.amazonaws.com/indexname/type/_search
params
field
(仅限 REQUEST 映射模板)
用于指定搜索执行的操作,最常用的方式是设置 body 内的 query 值。但是,可以配置若干其他功能,如响应的格式设置。
-
headers
标头信息(为键值对)。键和值都必须是字符串。例如:
"headers" : { "Content-Type" : "JSON" }
注意:AWS AppSync 目前仅支持 JSON 作为
Content-Type
。 -
queryString
指定常用选项的键值对,如 JSON 响应的代码格式设置。键和值都必须是字符串。例如,如果您要获得格式正确的 JSON,应使用:
"queryString" : { "pretty" : "true" }
-
body
这是请求的主要部分,让 AWS AppSync 可以针对您的 Amazon ES 域创建格式正确的搜索请求。键必须是组成对象的一个字符串。下面介绍了几个演示。
示例 1
返回城市与“seattle”匹配的所有文档:
"body":{ "from":0, "size":50, "query" : { "match" : { "city" : "seattle" } } }
示例 2
返回将“washington”作为城市或州匹配的所有文档。
"body":{ "from":0, "size":50, "query" : { "multi_match" : { "query" : "washington", "fields" : ["city", "state"] } } }
传递变量
(仅限 REQUEST 映射模板)
还可以在 VTL 语句中作为评估的一部分传递变量。例如,假设您具有以下 GraphQL 查询,如下所示:
query { searchForState(state: "washington"){ ... } }
映射模板可能将状态作为参数:
"body":{ "from":0, "size":50, "query" : { "multi_match" : { "query" : "$context.arguments.state", "fields" : ["city", "state"] } } }
有关可以包含在 VTL 中的实用工具的列表,请参阅访问请求标头。