

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# AWS AppSync 的解析器映射模板参考 OpenSearch
<a name="resolver-mapping-template-reference-elasticsearch"></a>

**注意**  
我们现在主要支持 APPSYNC\$1JS 运行时系统及其文档。请考虑使用 APPSYNC\$1JS 运行时系统和[此处](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)的指南。

亚马逊 OpenSearch 服务的 AWS AppSync 解析器使您能够使用 GraphQL 存储和检索账户中 OpenSearch 现有服务域中的数据。此解析器的工作原理是允许您将传入的 GraphQL 请求映射到服务请求，然后将 OpenSearch 服务响应映射 OpenSearch 回 GraphQL。本节介绍支持的 OpenSearch 服务操作的映射模板。

## 请求映射模板
<a name="request-mapping-template"></a>

大多数 OpenSearch 服务请求映射模板都有一个共同的结构，其中只有几个部分会发生变化。以下示例针对 OpenSearch 服务域运行搜索，其中文档组织在名为的索引下`post`。搜索参数在 `body` 部分定义，而许多常用查询子句在 `query` 字段中定义。此示例将搜索在文档的 `"Nadia"` 字段中包含 `"Bailey"` 和/或 `author` 的文档。

```
{
    "version":"2017-02-28",
    "operation":"GET",
    "path":"/post/_search",
    "params":{
        "headers":{},
        "queryString":{},
        "body":{
            "from":0,
            "size":50,
            "query" : {
                "bool" : {
                    "should" : [
                        {"match" : { "author" : "Nadia" }},
                        {"match" : { "author" : "Bailey" }}
                    ]
                }
            }
        }
    }
}
```

## 响应映射模板
<a name="response-mapping-template"></a>

与其他数据源一样， OpenSearch 服务会向发送需要转换为 GraphQL 的响应。 AWS AppSync 

大多数 GraphQL 查询都是从 OpenSearch 服务响应中查找该`_source`字段。由于您可以通过搜索返回单个文档或文档列表，因此 S OpenSearch ervice 中使用了两个常见的响应映射模板：

 **结果列表** 

```
[
    #foreach($entry in $context.result.hits.hits)
      #if( $velocityCount > 1 ) , #end
        $utils.toJson($entry.get("_source"))
    #end
]
```

 **单个项目** 

```
$utils.toJson($context.result.get("_source"))
```

## `operation` 字段
<a name="operation-field"></a>

**注意**  
这仅适用于请求映射模板。

 AWS AppSync 发送到 OpenSearch 服务域的 HTTP 方法或动词（GET、POST、PUT、HEAD 或 DELETE）。键和值都必须是字符串。

```
"operation" : "PUT"
```

## `path` 字段
<a name="path-field"></a>

**注意**  
这仅适用于请求映射模板。

来自的 OpenSearch 服务请求的搜索路径 AWS AppSync。这构成了操作的 HTTP 谓词的 URL。键和值都必须是字符串。

```
"path" : "/<indexname>/_doc/<_id>"
"path" : "/<indexname>/_doc"
"path" : "/<indexname>/_search"
"path" : "/<indexname>/_update/<_id>
```

评估映射模板时，此路径将作为 HTTP 请求的一部分发送，包括 OpenSearch 服务域。例如，上一个示例可能会转换为：

```
GET https://opensearch-domain-name.REGION.es.amazonaws.com/indexname/type/_search
```

## `params` 字段
<a name="params-field"></a>

**注意**  
这仅适用于请求映射模板。

用于指定搜索执行的操作，最常见的是在**正文**中设置**查询**值。但是，可以配置若干其他功能，如响应的格式设置。
+  **headers** 

  标头信息（为键值对）。键和值都必须是字符串。例如：

  ```
  "headers" : {
      "Content-Type" : "application/json"
  }
  ```
**注意**  
AWS AppSync 目前仅支持 JSON 作为`Content-Type`。
+  **queryString** 

  指定常用选项的键值对，如 JSON 响应的代码格式设置。键和值都必须是字符串。例如，如果您要获得格式正确的 JSON，应使用：

  ```
  "queryString" : {
      "pretty" : "true"
  }
  ```
+  **body** 

  这是您请求的主要部分， AWS AppSync 允许您针对您的 OpenSearch 服务域名起草格式良好的搜索请求。键必须是组成对象的一个字符串。下面介绍了几个演示。

 **示例 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"]
        }
    }
}
```

## 传递变量
<a name="passing-variables"></a>

**注意**  
这仅适用于请求映射模板。

还可以在 VTL 语句中作为评估的一部分传递变量。例如，假设您具有以下 GraphQL 查询，如下所示：

```
query {
    searchForState(state: "washington"){
        ...
    }
}
```

映射模板可能将状态作为参数：

```
"body":{
    "from":0,
    "size":50,
    "query" : {
        "multi_match" : {
            "query" : "$context.arguments.state",
            "fields" : ["city", "state"]
        }
    }
}
```

有关可以包含在 VTL 中的实用工具的列表，请参阅[访问请求标头](resolver-context-reference.md#aws-appsync-resolver-context-reference-util)。