Recherche de données dans Amazon OpenSearch Service - Amazon OpenSearch Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Recherche de données dans Amazon OpenSearch Service

Il existe plusieurs méthodes courantes pour rechercher des documents dans Amazon OpenSearch Service, notamment les recherches par URI et les recherches dans le corps des requêtes. OpenSearch Le service offre des fonctionnalités supplémentaires qui améliorent l'expérience de recherche, telles que les packages personnalisés, le support SQL et la recherche asynchrone. Pour une référence complète OpenSearch sur l'API de recherche, consultez la OpenSearch documentation.

Note

Les exemples de requêtes suivants fonctionnent avec des OpenSearch API. Certaines demandes peuvent ne pas fonctionner avec des versions antérieures d'Elasticsearch.

Recherches d'URI

Les recherches d'URI (Universal Resource Identifier, Identificateur de ressource uniforme) constituent la méthode de recherche la plus simple. Dans une recherche d'URI, vous spécifiez la requête en tant que paramètre de demande HTTP :

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

Un exemple de réponse peut ressembler à ce qui suit :

{ "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" } }, ... ] } }

Par défaut, cette requête recherche le mot house dans tous les champs de tous les index. Pour limiter la recherche, spécifiez un index (movies) et un champ de document (title) dans l'URI :

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

Vous pouvez inclure des paramètres supplémentaires dans la demande, mais les paramètres pris en charge ne fournissent qu'un petit sous-ensemble des options de OpenSearch recherche. La demande suivante renvoie 20 résultats (au lieu de la valeur par défaut de 10) et trie les résultats par année (plutôt que par _score) :

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

Recherches dans le corps de la demande

Pour effectuer des recherches plus complexes, utilisez le corps de la requête HTTP et le langage OpenSearch spécifique au domaine (DSL) pour les requêtes. La requête DSL permet de définir la gamme complète des options de OpenSearch recherche.

Note

Vous ne pouvez pas inclure de caractères spéciaux Unicode dans la valeur d'un champ de texte, sinon la valeur sera analysée sous la forme de plusieurs valeurs séparées par le caractère spécial. Cette analyse incorrecte peut entraîner un filtrage involontaire des documents et potentiellement compromettre le contrôle de leur accès. Pour plus d'informations, consultez la section Remarque sur les caractères spéciaux Unicode dans les champs de texte de la OpenSearch documentation.

La requête match suivante est similaire à l'exemple de recherche d'URI final :

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" } } }
Note

L'API _search accepte les demandes GET et POST HTTP pour les recherches dans le corps des demandes, mais tous les clients HTTP ne prennent pas en charge l'ajout d'un corps de demande à une demande GET. POST constitue le choix le plus universel.

Dans de nombreux cas, il se peut que vous vouliez effectuer une recherche dans plusieurs champs, mais pas dans tous. Utilisez la requête 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"] } } }

Optimisation des champs

Vous pouvez améliorer la pertinence des recherches en « optimisant » certains champs à l'aide de multiplicateurs qui affectent plus de poids aux correspondances se trouvant dans un champ qu'à celles se trouvant dans d'autres champs. Dans l'exemple suivant, une correspondance pour john dans le champ title influence _score deux fois plus qu'une correspondance dans le champ plot et quatre fois plus qu'une correspondance dans les champs actors ou directors. Résultat : des films tels que John Wick et John Carter figurent dans les premiers résultats de recherche, tandis que des films avec John Travolta figurent dans les derniers résultats.

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"] } } }

Mise en évidence des résultats de recherche

L'highlightoption indique OpenSearch de renvoyer un objet supplémentaire à l'intérieur du hits tableau si la requête correspond à un ou plusieurs champs :

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": {} } } }

Si la requête correspond au contenu du champ plot, le résultat peut ressembler à ce qui suit :

{ "_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>." ] } }

Par défaut, OpenSearch place la chaîne correspondante dans des <em> balises, fournit jusqu'à 100 caractères de contexte autour de la correspondance et divise le contenu en phrases en identifiant les signes de ponctuation, les espaces, les tabulations et les sauts de ligne. Tous ces paramètres sont personnalisables :

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

Si vous n'êtes pas intéressé par le contenu de vos documents et voulez simplement connaître le nombre de correspondances, vous pouvez utiliser l'API _count au lieu de l'API _search. La demande suivante utilise la requête query_string pour identifier les comédies romantiques :

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

Un exemple de réponse peut ressembler à ce qui suit :

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

Pagination des résultats de recherche

Si vous devez afficher un grand nombre de résultats de recherche, vous pouvez implémenter la pagination en utilisant différentes méthodes.

Point dans le temps

La fonction point dans le temps (PIT) est un type de recherche qui vous permet d'exécuter différentes requêtes sur un ensemble de données fixe dans le temps. Il s'agit de la méthode de pagination préférée OpenSearch, en particulier pour la pagination profonde. Vous pouvez utiliser PIT avec la version OpenSearch de service 2.5 ou ultérieure. Pour plus d'informations sur le PIT, voirRecherche ponctuelle dans le temps dans Amazon OpenSearch Service.

Les size paramètres from et

Le moyen le plus simple de paginer est d'utiliser les size paramètres from et. La demande suivante renvoie les résultats 20 à 39 de la liste des résultats de recherche indexée sur zéro :

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"] } } }

Pour plus d'informations sur la pagination de recherche, voir Paginer les résultats dans la OpenSearch documentation.

Langage de requête Dashboards

Vous pouvez utiliser le langage de requête des tableaux de bord (DQL) pour rechercher des données et des visualisations dans les tableaux de bord. OpenSearch DQL utilise quatre principaux types de requêtes : termes, booléens, date et plage, et champ imbriqué.

Requête de termes

Une requête de termes nécessite que vous spécifiiez le terme que vous recherchez.

Pour effectuer une requête de termes, saisissez ce qui suit :

host:www.example.com

Requête booléenne

Vous pouvez utiliser les opérateurs booléens AND, or, et not pour combiner plusieurs requêtes.

Pour effectuer une requête booléenne, collez ce qui suit :

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

Requête de date et plage

Vous pouvez utiliser une requête de date et plage pour trouver une date avant ou après votre requête.

  • > indique une recherche d'une date postérieure à la date spécifiée.

  • < indique une recherche d'une date antérieure à la date spécifiée.

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

Requête de champ imbriqué

Si vous avez un document avec des champs imbriqués, vous devez spécifier les parties du document que vous voulez récupérer. Voici un exemple de document qui contient des champs imbriqués :

{"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" } ] }

Pour récupérer un champ spécifique à l'aide de DQL, collez ce qui suit :

NBA players: {player-name: Lebron James}

Pour récupérer plusieurs objets du document imbriqué, collez ce qui suit :

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

Pour effectuer une recherche dans une plage, collez ce qui suit :

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

Si votre document comporte un objet imbriqué dans un autre objet, vous pouvez toujours récupérer les données en spécifiant tous les niveaux. Pour ce faire, collez ce qui suit :

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