

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

# AWS AppSync JavaScript 的解析器函数参考 OpenSearch
<a name="resolver-reference-elasticsearch-js"></a>

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

## 请求
<a name="request-js"></a>

大多数 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' } },
            ],
          },
        },
      },
    },
  };
}
```

## 响应
<a name="response-mapping-template"></a>

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

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

 **结果列表** 

```
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` 字段
<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/type"

"path" : "/indexname/type/_search"
```

评估请求处理程序时，此路径将作为 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”匹配的所有文档：

```
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'] },
        },
      },
    },
  };
}
```

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

**注意**  
这仅适用于请求处理程序。

您也可以在评估请求处理程序期间传递变量。例如，假设您具有以下 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'] },
        },
      },
    },
  };
}
```