

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

# 教程：在 Amazon OpenSearch 服务中创建和搜索文档
<a name="quick-start"></a>

在本教程中，您将学习如何在亚马逊 OpenSearch 服务中创建和搜索文档。您可以以 JSON 文档的形式向索引添加数据。 OpenSearch 服务会围绕您添加的第一个文档创建索引。

本教程介绍如何发出 HTTP 请求以创建文档、自动生成文档 ID 以及如何对文档执行基本搜索和高级搜索。

**注意**  
本教程使用具有开放访问权限的域。为了获得最高级别的安全性，我们建议您将域置于虚拟私有云（VPC）内。

## 先决条件
<a name="quick-start-prereqs"></a>

本教程包含以下先决条件：
+ 你必须有一个 AWS 账户.
+ 您必须有一个有效的 OpenSearch 服务域。

## 将文档添加到索引
<a name="quick-start-create"></a>

要将文档添加到索引，您可以使用任何 HTTP 工具，例如 P [ostman](https://www.getpostman.com/)、curl 或 OpenSearch 仪表板控制台。这些示例假设您在 OpenSearch 仪表板中使用开发者控制台。如果您使用其他工具，请提供完整的 URL 和凭证（如有必要）进行相应调整。

**将文档添加到索引**

1. 导航到您的域名的 OpenSearch 控制面板网址。您可以在 OpenSearch 服务控制台的域名控制面板上找到该网址。URL 遵循以下格式：

   ```
   domain-endpoint/_dashboards/
   ```

1. 使用您的主用户名和密码登录。

1. 打开左侧导航面板，然后选择 **Dev Tools**（开发人员工具）。

1. 用于创建新资源的 HTTP 动词是 PUT，您将使用它创建新文档和索引。在控制台中，输入以下命令：

   ```
   PUT fruit/_doc/1
   {
     "name":"strawberry",
     "color":"red"
   }
   ```

   `PUT` 请求创建一个名为 *fruit*（水果）的索引，并使用 ID 1 将单个文档添加到索引。它将生成以下响应：

   ```
   {
     "_index" : "fruit",
     "_type" : "_doc",
     "_id" : "1",
     "_version" : 1,
     "result" : "created",
     "_shards" : {
       "total" : 2,
       "successful" : 2,
       "failed" : 0
     },
     "_seq_no" : 0,
     "_primary_term" : 1
   }
   ```

## 创建自动生成 IDs
<a name="quick-start-id"></a>

OpenSearch 服务可以自动为您的文件生成 ID。要生成的命令 IDs 使用 POST 请求而不是 PUT 请求，并且不需要文档 ID（与之前的请求相比）。

在开发人员控制台中，输入以下请求：

```
POST veggies/_doc
{
  "name":"beet",
  "color":"red",
  "classification":"root"
}
```

此请求将创建一个名为 *veggies*（蔬菜）的索引，并将文档添加到索引。它将生成以下响应：

```
{
  "_index" : "veggies",
  "_type" : "_doc",
  "_id" : "3WgyS4IB5DLqbRIvLxtF",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}
```

请注意，响应中其他 `_id` 字段表示自动创建的 ID。

**注意**  
您无需在 URL 中 `_doc` 之后提供任何内容，ID 通常位于该位置。因为您使用生成的 ID 创建文档，所以您无需提供 ID。这是为更新预留的。

## 使用 POST 命令更新文档
<a name="quick-start-update"></a>

要更新文档，您可以通过 ID 号码使用 HTTP `POST` 命令。

首先，创建 ID 为 `42` 的文档：

```
POST fruits/_doc/42
{
  "name":"banana",
  "color":"yellow"
}
```

然后，使用该 ID 更新文档：

```
POST fruits/_doc/42
{
  "name":"banana",
  "color":"yellow",
  "classification":"berries"
}
```

此命令使用新字段 `classification` 更新文档。它将生成以下响应：

```
{
  "_index" : "fruits",
  "_type" : "_doc",
  "_id" : "42",
  "_version" : 2,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}
```

**注意**  
如果您尝试更新不存在的文档，则 OpenSearch 服务会创建该文档。

## 执行批量操作
<a name="quick-start-bulk"></a>

您可以在一个请求中使用 `POST _bulk` API 操作对一个或多个索引执行多个操作。批量操作命令采用以下形式：

```
POST /_bulk
<action_meta>\n
<action_data>\n
<action_meta>\n
<action_data>\n
```

每个操作都需要两行 JSON。首先，您需要提供操作描述或元数据。在下一行中，您需要提供数据。每个部分使用换行符（\$1n）分隔。插入的操作描述可能如下所示：

```
{ "create" : { "_index" : "veggies", "_type" : "_doc", "_id" : "7" } }
```

包含数据的下一行可能如下所示：

```
{ "name":"kale", "color":"green", "classification":"leafy-green" }
```

总的来说，元数据和数据表示批量操作中的单个操作。您可以在一个请求中执行许多操作，如下所示：

```
POST /_bulk
{ "create" : { "_index" : "veggies", "_id" : "35" } }
{ "name":"kale", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_id" : "36" } }
{ "name":"spinach", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_id" : "37" } }
{ "name":"arugula", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_id" : "38" } }
{ "name":"endive", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_id" : "39" } }
{ "name":"lettuce", "color":"green", "classification":"leafy-green" }
{ "delete" : { "_index" : "vegetables", "_id" : "1" } }
```

请注意，最后一个操作是 `delete`。`delete` 操作之后将没有数据。

## 搜索文档
<a name="quick-start-search"></a>

现在，您的集群中已存在数据，您可以搜索这些数据。例如，您可能想要搜索所有根茎类蔬菜，或获取所有绿叶蔬菜的数量，亦或是查找每小时记录的错误数量。

**基本搜索**

基本搜索如下所示：

```
GET veggies/_search?q=name:l*
```

此请求生成包含生菜文档的 JSON 响应。

**高级搜索**

您可以在请求正文中以 JSON 形式提供查询选项，从而执行更高级的搜索：

```
GET veggies/_search
{
  "query": {
    "term": {
      "name": "lettuce"
    }
  }
}
```

此示例还使用生菜文档生成 JSON 响应。

**排序**

您可以使用排序执行更多此类查询。首先，您需要重新创建索引，因为自动字段映射默认选择无法排序的类型。发送以下请求以删除和重新创建索引：

```
DELETE /veggies

PUT /veggies
{
   "mappings":{
      "properties":{
         "name":{
            "type":"keyword"
         },
         "color":{
            "type":"keyword"
         },
         "classification":{
            "type":"keyword"
         }
      }
   }
}
```

然后，使用数据重新填充索引：

```
POST /_bulk
{ "create" : { "_index" : "veggies", "_id" : "7"  } }
{ "name":"kale", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_id" : "8" } }
{ "name":"spinach", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_id" : "9" } }
{ "name":"arugula", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_id" : "10" } }
{ "name":"endive", "color":"green", "classification":"leafy-green" }
{ "create" : { "_index" : "veggies", "_id" : "11" } }
{ "name":"lettuce", "color":"green", "classification":"leafy-green" }
```

现在，您可以使用排序进行搜索。此请求按分类添加升序排序：

```
GET veggies/_search
{
  "query" : {
    "term": { "color": "green" }
  },
  "sort" : [
      "classification"
  ]
}
```

## 相关资源
<a name="quick-start-resources"></a>

有关更多信息，请参阅以下资源：
+ [亚马逊 OpenSearch 服务入门](gsg.md)
+ [在 Amazon OpenSearch 服务中为数据编制索引](indexing.md)
+ [在亚马逊 OpenSearch 服务中搜索数据](searching.md)