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

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

在 Amazon OpenSearch 服务中搜索数据

在 Amazon S OpenSearch ervice 中搜索文档有几种常用的方法,包括 URI 搜索和请求正文搜索。 OpenSearch 服务提供了可改善搜索体验的其他功能,例如自定义软件包、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,特别是对于深度分页。您可以将 PIT 与 OpenSearch 服务版本 2.5 及更高版本一起使用。有关 PIT 的更多信息,请参阅 在 Amazon OpenSearch 服务中搜索时间点

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}