

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# OpenSearch 的AWS AppSync JavaScript 解析程式函數參考
<a name="resolver-reference-elasticsearch-js"></a>

Amazon OpenSearch Service 的 AWS AppSync 解析程式可讓您使用 GraphQL 在帳戶中現有的 OpenSearch Service 網域中存放和擷取資料。此解析程式的運作方式是允許您將傳入的 GraphQL 請求映射至 OpenSearch Service 請求，然後將 OpenSearch Service 回應映射回 GraphQL。本節說明支援的 OpenSearch Service 操作的函數請求和回應處理常式。

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

大多數 OpenSearch Service 請求物件都有共同的結構，其中只有幾個部分變更。下列範例會根據 OpenSearch Service 網域執行搜尋，其中文件類型為 ，`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 Service 會將回應傳送至需要轉換為 GraphQL 的 AWS AppSync。

大多數 GraphQL 查詢正在從 OpenSearch Service 回應中尋找 `_source` 欄位。由於您可以執行搜尋以傳回個別文件或文件清單，因此 OpenSearch Service 中有兩種常用的回應模式：

 **結果清單** 

```
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 Service 網域的 HTTP 方法或動詞 (GET、POST、PUT、HEAD 或 DELETE)。金鑰與值皆必須為字串。

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

## `path` 欄位
<a name="path-field"></a>

**注意**  
這僅適用於請求處理常式。

來自 AWS AppSync 的 OpenSearch Service 請求的搜尋路徑。這會形成操作的 HTTP 動詞的 URL。金鑰與值皆必須為字串。

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

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

評估請求處理常式時，此路徑會做為 HTTP 請求的一部分傳送，包括 OpenSearch Service 網域。例如，之前的範例可轉譯為：

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

## `params` 欄位
<a name="params-field"></a>

**注意**  
這僅適用於請求處理常式。

用來指定搜尋執行的動作，最常見的方式是設定**內文**內的**查詢**值。不過，有多項其他功能可設定，例如回應的格式。
+  **標頭** 

  標頭資訊，以金鑰值對形式。金鑰與值皆必須為字串。例如：

  ```
  "headers" : {
      "Content-Type" : "application/json"
  }
  ```

   
**注意**  
AWS AppSync 目前僅支援 JSON 做為 `Content-Type`。
+  **queryString** 

  金鑰值對，指定常見的選項，例如 JSON 回應的程式碼格式。金鑰與值皆必須為字串。例如，如果您希望獲得非常完整格式的 JSON，請使用：

  ```
  "queryString" : {
      "pretty" : "true"
  }
  ```
+  **本文** 

  這是請求的主要部分，允許 AWS AppSync 為您的 OpenSearch Service 網域製作格式正確的搜尋請求。金鑰必須是由物件組成的字串。以下顯示幾個示範。

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