在 Amazon OpenSearch Service 中搜索数据 - 亚马逊 OpenSearch 服务
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

在 Amazon OpenSearch Service 中搜索数据

有几种在 Amazon OpenSearch Service 中搜索文档的常见方法,包括 URI 搜索和请求正文搜索。OpenSearch Service 提供了可改进搜索体验的其他功能,例如自定义软件包、SQL 支持和异步搜索。有关全面 OpenSearch 搜索 API 引用,请参阅 OpenSearch 文档

注意

以下示例请求与 OpenSearch API 一起使用。某些请求可能不适用于旧 Elasticsearch 版本。

URI 搜索

统一资源标识符 (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

请求正文搜索

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

注意

不能在文本字段值中包括 Unicode 特殊字符,否则该值将被解析为由特殊字符分隔的多个值。这种错误的解析可能会导致无意中筛选文档,并可能影响对其访问的控制。有关更多信息,请参阅 OpenSearch 文档中的关于文本字段中 Unicode 特殊字符的注释

以下 match 查询类似于最终 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 GETPOST,但并非所有 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"] } } }

提升字段

可以通过“提升”某些字段来增强搜索相关性。提升是一种倍增器,它使一个字段中的匹配项的权重高于其他字段中的匹配项的权重。在以下示例中,johnplot 字段中的匹配项的影响是 title 字段中匹配项的影响的_score两倍,并且是 actorsdirectors 字段中匹配项的影响的四倍。其结果是,John WickJohn 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"] } } }

搜索结果突出显示

如果查询与一个或多个字段匹配,则 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

如果您对文档内容不感兴趣,只是想知道匹配项的数量,则可使用 _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 } }

对搜索结果进行分页

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

时间点

时间点 (PIT) 功能是一种搜索类型,可让您对固定时间的数据集运行不同的查询。这是 OpenSearch 的首选分页方法,尤其适合深度分页。您可以在 OpenSearch Service 版本 2.5 及更高版本中使用 PIT。有关 PIT 的更多信息,请参阅 Amazon OpenSearch Service 中的时间点搜索

fromsize 参数

最简单的分页方法是使用 fromsize 参数。以下请求返回从零开始编制索引的搜索结果列表中的 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"] } } }

有关搜索分页的更多信息,请参阅 OpenSearch 文档中的对结果进行分页

控制面板查询语言

您可以使用控制面板查询语言(DQL)在 OpenSearch 控制面板中搜索数据和可视化效果。DQL 使用四种主要查询类型:术语布尔日期和范围嵌套字段

术语查询

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

要执行术语查询,请输入以下内容:

host:www.example.com

布尔查询

您可以使用布尔运算符 ANDornot 组合多个查询。

要执行布尔查询,请粘贴以下内容:

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}