

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

# 在亚马逊 OpenSearch 服务中搜索数据
<a name="searching"></a>

在 Amazon S OpenSearch ervice 中搜索文档有几种常用的方法，包括 URI 搜索和请求正文搜索。 OpenSearch 服务提供了可改善搜索体验的其他功能，例如自定义软件包、SQL 支持和异步搜索。如需全面的 OpenSearch 搜索 API 参考，请参阅[OpenSearch文档](https://docs.opensearch.org/latest/opensearch/query-dsl/full-text/)。

**注意**  
以下示例请求适用于 OpenSearch APIs。某些请求可能不适用于旧 Elasticsearch 版本。

**Topics**
+ [URI 搜索](#searching-uri)
+ [请求正文搜索](#searching-dsl)
+ [对搜索结果进行分页](#searching-paginating)
+ [控制面板查询语言](#DashboardsQueryLanguages)
+ [在 Amazon OpenSearch 服务中导入和管理包裹](custom-packages.md)
+ [使用 SQL 查询您的亚马逊 OpenSearch 服务数据](sql-support.md)
+ [在 Amazon OpenSearch 服务中进行跨集群搜索](cross-cluster-search.md)
+ [学习如何使用 Amazon OpenSearch 服务进行排名](learning-to-rank.md)
+ [亚马逊 OpenSearch 服务中的异步搜索](asynchronous-search.md)
+ [在 Amazon OpenSearch 服务中搜索时间点](pit.md)
+ [在 Amazon OpenSearch 服务中进行代理搜索](agentic-search.md)
+ [Amazon OpenSearch 服务中的语义搜索](semantic-search.md)
+ [在 Amazon OpenSearch 服务中进行并行区段搜索](concurrent-segment-search.md)
+ [在 Amazon OpenSearch 服务中生成自然语言查询](natural-language-query.md)

## URI 搜索
<a name="searching-uri"></a>

统一资源标识符 (URI) 搜索是最简单的搜索形式。在 URI 搜索中，可以指定查询作为 HTTP 请求参数：

```
GET https://search-my-domain.us-west-1.es.amazonaws.com/_search?q=house
```

示例响应可能与以下内容下类似：

```
{
  "took": 25,
  "timed_out": false,
  "_shards": {
    "total": 10,
    "successful": 10,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 85,
      "relation": "eq",
    },
    "max_score": 6.6137657,
    "hits": [
      {
        "_index": "movies",
        "_type": "movie",
        "_id": "tt0077975",
        "_score": 6.6137657,
        "_source": {
          "directors": [
            "John Landis"
          ],
          "release_date": "1978-07-27T00:00:00Z",
          "rating": 7.5,
          "genres": [
            "Comedy",
            "Romance"
          ],
          "image_url": "http://ia.media-imdb.com/images/M/MV5BMTY2OTQxNTc1OF5BMl5BanBnXkFtZTYwNjA3NjI5._V1_SX400_.jpg",
          "plot": "At a 1962 College, Dean Vernon Wormer is determined to expel the entire Delta Tau Chi Fraternity, but those troublemakers have other plans for him.",
          "title": "Animal House",
          "rank": 527,
          "running_time_secs": 6540,
          "actors": [
            "John Belushi",
            "Karen Allen",
            "Tom Hulce"
          ],
          "year": 1978,
          "id": "tt0077975"
        }
      },
      ...
    ]
  }
}
```

默认情况下，此查询在所有索引的所有字段中搜索 *house* 一词。要缩小搜索范围，请在 URI 中指定索引 (`movies`) 和文档字段 (`title`)：

```
GET https://search-my-domain.us-west-1.es.amazonaws.com/movies/_search?q=title:house
```

您可以在请求中包含其他参数，但支持的参数仅提供一小部分 OpenSearch 搜索选项。以下请求将返回 20 个（而不是默认的 10 个）结果并按年（而不是按 `_score`）对这些结果进行排序：

```
GET https://search-my-domain.us-west-1.es.amazonaws.com/movies/_search?q=title:house&size=20&sort=year:desc
```

## 请求正文搜索
<a name="searching-dsl"></a>

要执行更复杂的搜索，请对查询使用 HTTP 请求正文和特定于 OpenSearch 域的语言 (DSL)。利用查询 DSL，您可以指定所有的 OpenSearch 搜索选项。

**注意**  
不能在文本字段值中包括 Unicode 特殊字符，否则该值将被解析为由特殊字符分隔的多个值。这种错误的解析可能会导致无意中筛选文档，并可能影响对其访问的控制。有关更多信息，请参阅 OpenSearch文档中[关于文本字段中 Unicode 特殊字符的注释](https://opensearch.org/docs/latest/opensearch/query-dsl/index/#a-note-on-unicode-special-characters-in-text-fields)。

以下 `match` 查询类似于最终 [URI 搜索](#searching-uri)示例：

```
POST https://search-my-domain.us-west-1.es.amazonaws.com/movies/_search
{
  "size": 20,
  "sort": {
    "year": {
      "order": "desc"
    }
  },
  "query": {
    "query_string": {
      "default_field": "title",
      "query": "house"
    }
  }
}
```

**注意**  
对于请求正文搜索，`_search` API 接受 HTTP `GET` 和 `POST`，但并非所有 HTTP 客户端都支持将请求正文添加到 `GET` 请求。`POST` 是更普遍的选择。

在许多情况下，您可能想搜索多个字段，而不是全部字段。使用 `multi_match` 查询：

```
POST https://search-my-domain.us-west-1.es.amazonaws.com/movies/_search
{
  "size": 20,
  "query": {
    "multi_match": {
      "query": "house",
      "fields": ["title", "plot", "actors", "directors"]
    }
  }
}
```

### 提升字段
<a name="searching-dsl-boost"></a>

可以通过“提升”某些字段来增强搜索相关性。提升是一种倍增器，它使一个字段中的匹配项的权重高于其他字段中的匹配项的权重。在以下示例中，*john* 在 `title` 字段中的匹配项对 `_score` 的影响是 `plot` 字段中匹配项的两倍，并且是 `actors` 或 `directors` 字段中匹配项的四倍。其结果是，*John Wick* 和 *John Carter* 等电影在搜索结果中接近榜首，而由 John Travolta 主演的电影则接近底部。

```
POST https://search-my-domain.us-west-1.es.amazonaws.com/movies/_search
{
  "size": 20,
  "query": {
    "multi_match": {
      "query": "john",
      "fields": ["title^4", "plot^2", "actors", "directors"]
    }
  }
}
```

### 搜索结果突出显示
<a name="searching-dsl-highlighting"></a>

该`highlight`选项告诉 OpenSearch 如果查询匹配一个或多个字段，则在`hits`数组内返回一个额外的对象：

```
POST https://search-my-domain.us-west-1.es.amazonaws.com/movies/_search
{
  "size": 20,
  "query": {
    "multi_match": {
      "query": "house",
      "fields": ["title^4", "plot^2", "actors", "directors"]
    }
  },
  "highlight": {
    "fields": {
      "plot": {}
    }
  }
}
```

如果查询与 `plot` 字段的内容匹配，则命中的内容可能与以下类似：

```
{
  "_index": "movies",
  "_type": "movie",
  "_id": "tt0091541",
  "_score": 11.276199,
  "_source": {
    "directors": [
      "Richard Benjamin"
    ],
    "release_date": "1986-03-26T00:00:00Z",
    "rating": 6,
    "genres": [
      "Comedy",
      "Music"
    ],
    "image_url": "http://ia.media-imdb.com/images/M/MV5BMTIzODEzODE2OF5BMl5BanBnXkFtZTcwNjQ3ODcyMQ@@._V1_SX400_.jpg",
    "plot": "A young couple struggles to repair a hopelessly dilapidated house.",
    "title": "The Money Pit",
    "rank": 4095,
    "running_time_secs": 5460,
    "actors": [
      "Tom Hanks",
      "Shelley Long",
      "Alexander Godunov"
    ],
    "year": 1986,
    "id": "tt0091541"
  },
  "highlight": {
    "plot": [
      "A young couple struggles to repair a hopelessly dilapidated <em>house</em>."
    ]
  }
}
```

默认情况下，将匹配的字符串 OpenSearch 包装在`<em>`标签中，为匹配项提供最多 100 个字符的上下文，并通过识别标点符号、空格、制表符和换行符将内容分成句子。所有这些设置均可自定义：

```
POST https://search-my-domain.us-west-1.es.amazonaws.com/movies/_search
{
  "size": 20,
  "query": {
    "multi_match": {
      "query": "house",
      "fields": ["title^4", "plot^2", "actors", "directors"]
    }
  },
  "highlight": {
    "fields": {
      "plot": {}
    },
    "pre_tags": "<strong>",
    "post_tags": "</strong>",
    "fragment_size": 200,
    "boundary_chars": ".,!? "
  }
}
```

### 计数 API
<a name="searching-dsl-count"></a>

如果您对文档内容不感兴趣，只是想知道匹配项的数量，则可使用 `_count` API 而非 `_search` API。以下请求使用 `query_string` 查询来标识浪漫喜剧：

```
POST https://search-my-domain.us-west-1.es.amazonaws.com/movies/_count
{
  "query": {
    "query_string": {
      "default_field": "genres",
      "query": "romance AND comedy"
    }
  }
}
```

示例响应可能与以下内容下类似：

```
{
  "count": 564,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  }
}
```

## 对搜索结果进行分页
<a name="searching-paginating"></a>

如果您需要显示大量搜索结果，可使用几种不同的方法对结果进行分页。

### 时间点
<a name="pag-pit"></a>

时间点 (PIT) 功能是一种搜索类型，可让您对固定时间的数据集运行不同的查询。这是中首选的分页方法 OpenSearch，特别是对于深度分页。您可以将 PIT 与 OpenSearch 服务版本 2.5 及更高版本一起使用。有关 PIT 的更多信息，请参阅 [在 Amazon OpenSearch 服务中搜索时间点](pit.md)。

### `from` 和 `size` 参数
<a name="pag-from-size"></a>

最简单的分页方法是使用 `from` 和 `size` 参数。以下请求返回从零开始编制索引的搜索结果列表中的 20-39 个结果：

```
POST https://search-my-domain.us-west-1.es.amazonaws.com/movies/_search
{
  "from": 20,
  "size": 20,
  "query": {
    "multi_match": {
      "query": "house",
      "fields": ["title^4", "plot^2", "actors", "directors"]
    }
  }
}
```

有关搜索分页的更多信息，请参阅文档中的[分页结果](https://opensearch.org/docs/latest/opensearch/search/paginate/)。 OpenSearch 

## 控制面板查询语言
<a name="DashboardsQueryLanguages"></a>

您可以使用[仪表板查询语言 (DQL)](https://opensearch.org/docs/latest/dashboards/dql/#terms-query) 在仪表板中 OpenSearch 搜索数据和可视化效果。DQL 使用四种主要查询类型：*术语*、*布尔*、*日期和范围*和*嵌套字段*。

**术语查询**

术语查询要求您指定要搜索的术语。

要执行术语查询，请输入以下内容：

```
host:www.example.com
```

**布尔查询**

您可以使用布尔运算符 `AND`、`or` 和 `not` 组合多个查询。

要执行布尔查询，请粘贴以下内容：

```
host.keyword:www.example.com and response.keyword:200
```

**日期和范围查询**

您可以使用日期和范围查询来查找查询之前或之后的日期。
+ `>` 表示搜索指定日期之后的日期。
+ `<` 表示搜索指定日期之前的日期。

`@timestamp > "2020-12-14T09:35:33"`

**嵌套字段查询**

如果您具有包含嵌套字段的文档，则必须指定要检索文档的哪些部分。以下是一个包含嵌套字段的示例文档：

```
{"NBA players":[
    {"player-name": "Lebron James",
      "player-position": "Power forward",
      "points-per-game": "30.3"
    },
    {"player-name": "Kevin Durant",
      "player-position": "Power forward",
      "points-per-game": "27.1"
    },
    {"player-name": "Anthony Davis",
      "player-position": "Power forward",
      "points-per-game": "23.2"
    },
    {"player-name": "Giannis Antetokounmpo",
      "player-position": "Power forward",
      "points-per-game":"29.9"
    }
  ]
}
```

要使用 DQL 检索特定字段，请粘贴以下内容：

```
NBA players: {player-name: Lebron James}
```

要检索嵌套文档中的多个对象，请粘贴以下内容：

```
NBA players: {player-name: Lebron James} and NBA players: {player-name: Giannis Antetokounmpo}
```

要在某个范围内搜索，请粘贴以下内容：

```
NBA players: {player-name: Lebron James} and NBA players: {player-name: Giannis Antetokounmpo and < 30}
```

如果您的文档中有一个对象嵌套在另一个对象中，您仍然可以通过指定所有级别来检索数据。要进行此检索，请粘贴以下内容：

```
Top-Power-forwards.NBA players: {player-name:Lebron James}
```