本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
JavaScript 的解析器函数参考 OpenSearch
Amazon Serv OpenSearch ice 的Amazon AppSync 解析器使您能够使用 GraphQL 在账户的现有 OpenSearch 服务域中存储和检索数据。此解析器的工作原理是允许您将传入的 GraphQL 请求映射到 OpenSearch 服务请求,然后将 OpenSearch 服务响应映射回 GraphQL。本节介绍支持的 OpenSearch 服务操作的函数请求和响应处理程序。
请求
大多数 OpenSearch 服务请求对象都有一个共同的结构,其中只有几部分发生变化。以下示例针对 OpenSearch 服务域运行搜索,其中文档的类型为post
,索引属于id
。搜索参数在 body
部分定义,而许多常用查询子句在 query
字段中定义。此示例将搜索在文档的 "Nadia"
字段中包含 "Bailey"
和/或 author
的文档。
export function request(ctx) { return { operation: 'GET', path: '/id/post/_search', params: { headers: {}, queryString: {}, body: { from: 0, size: 50, query: { bool: { should: [ { match: { author: 'Nadia' } }, { match: { author: 'Bailey' } }, ], }, }, }, }, }; }
响应
与其他数据源一样,Ser OpenSearch vice 会发送需要转换为 GraphQL 的响应。Amazon AppSync
大多数 GraphQL 查询都在从 OpenSearch 服务响应中查找_source
字段。由于您可以通过搜索来返回单个文档或文档列表,因此 Serv OpenSearch ice 中使用了两种常见的响应模式:
结果列表
export function response(ctx) { const entries = []; for (const entry of ctx.result.hits.hits) { entries.push(entry['_source']); } return entries; }
单个项目
export function response(ctx) { return ctx.result['_source'] }
operation
field
(仅限请求处理器)
Amazon AppSync 发送到 OpenSearch 服务域的 HTTP 方法或动词(GET、POST、PUT、HEAD 或 DELETE)。键和值都必须是字符串。
"operation" : "PUT"
path
field
(仅限请求处理器)
来自的 OpenSearch 服务请求的搜索路径Amazon AppSync。这构成了操作的 HTTP 谓词的 URL。键和值都必须是字符串。
"path" : "/indexname/type" "path" : "/indexname/type/_search"
评估请求处理程序时,此路径将作为 HTTP 请求的一部分发送,包括 OpenSearch 服务域。例如,上一个示例可能会转换为:
GET https://opensearch-domain-name.REGION.es.amazonaws.com/indexname/type/_search
params
field
(仅限请求处理器)
用于指定搜索执行的操作,最常见的是通过在正文中设置查询值。但是,可以配置若干其他功能,如响应的格式设置。
-
headers
标头信息(为键值对)。键和值都必须是字符串。例如:
"headers" : { "Content-Type" : "application/json" }
注意 Amazon AppSync 目前仅支持 JSON 作为
Content-Type
。 -
queryString
指定常用选项的键值对,如 JSON 响应的代码格式设置。键和值都必须是字符串。例如,如果您要获得格式正确的 JSON,应使用:
"queryString" : { "pretty" : "true" }
-
body
这是您的请求的主要部分,允许您Amazon AppSync 为 OpenSearch 服务域创建格式良好的搜索请求。键必须是组成对象的一个字符串。下面介绍了几个演示。
示例 1
返回城市与“seattle”匹配的所有文档:
export function request(ctx) { return { operation: 'GET', path: '/id/post/_search', params: { headers: {}, queryString: {}, body: { from: 0, size: 50, query: { match: { city: 'seattle' } } }, }, }; }
示例 2
返回将“washington”作为城市或州匹配的所有文档。
export function request(ctx) { return { operation: 'GET', path: '/id/post/_search', params: { headers: {}, queryString: {}, body: { from: 0, size: 50, query: { multi_match: { query: 'washington', fields: ['city', 'state'] }, }, }, }, }; }
传递变量
(仅限请求处理器)
您也可以在请求处理程序中将变量作为评估的一部分传递。例如,假设您具有以下 GraphQL 查询,如下所示:
query { searchForState(state: "washington"){ ... } }
函数请求处理器可能如下:
export function request(ctx) { return { operation: 'GET', path: '/id/post/_search', params: { headers: {}, queryString: {}, body: { from: 0, size: 50, query: { multi_match: { query: ctx.args.state, fields: ['city', 'state'] }, }, }, }, }; }