

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 en texte intégral dans Amazon Neptune à l'aide d'Amazon Service OpenSearch
<a name="full-text-search"></a>

Neptune s'intègre à [Amazon OpenSearch Service (OpenSearch Service)](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/) pour prendre en charge la recherche en texte intégral dans les requêtes Gremlin et SPARQL.

À partir de la [version 1.3.0.0 du moteur](engine-releases-1.3.0.0.md), Amazon Neptune prend en charge l'utilisation d'[ OpenSearch Amazon Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless.html) Serverless pour la recherche en texte intégral dans les requêtes Gremlin et SPARQL.

**Note**  
Lors de l'intégration à Amazon OpenSearch Service, Neptune nécessite la version 7.1 ou supérieure d'Elasticsearch et fonctionne avec les versions OpenSearch 2.3, 2.5 et supérieures. [Neptune fonctionne également avec OpenSearch Serverless.](full-text-search-serverless.md)

Vous pouvez utiliser Neptune avec un cluster de OpenSearch services existant qui a été renseigné conformément au. [Modèle de données Neptune pour les données OpenSearch](full-text-search-model.md) Vous pouvez également créer un domaine de OpenSearch service lié à Neptune à l'aide d'une AWS CloudFormation pile.

**Important**  
Le processus de OpenSearch réplication Neptune décrit ici ne réplique pas les nœuds vides. Il s'agit d'une limite importante à noter.  
En outre, si vous activez [le contrôle d'accès détaillé](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html) sur votre OpenSearch cluster, vous devez également [activer l'authentification IAM dans votre base](iam-auth-enable.md) de données Neptune.

![\[Disposition de l'architecture de Neptune Open Search Stream Poller.\]](http://docs.aws.amazon.com/fr_fr/neptune/latest/userguide/images/poller-architecture.PNG)


**Topics**
+ [

# Neptune-to-OpenSearchRéplication Amazon
](full-text-search-cfn-setup.md)
+ [

# Réplication vers le mode OpenSearch sans serveur
](full-text-search-serverless.md)
+ [

# Interrogation depuis un OpenSearch cluster sur lequel le contrôle d'accès détaillé (FGAC) est activé
](full-text-search-fgac.md)
+ [

# Utilisation de la syntaxe de requête Apache Lucene dans les requêtes de recherche en texte intégral Neptune
](full-text-search-lucene.md)
+ [

# Modèle de données Neptune pour les données OpenSearch
](full-text-search-model.md)
+ [

# Paramètres de recherche en texte intégral Neptune
](full-text-search-parameters.md)
+ [

# OpenSearch Indexation sans chaîne dans Amazon Neptune
](full-text-search-non-string-indexing.md)
+ [

# Full-text-search exécution de requêtes dans Amazon Neptune
](full-text-search-query-execution.md)
+ [

# Exemples de requêtes SPARQL utilisant la recherche en texte intégral dans Neptune
](full-text-search-sparql-examples.md)
+ [

# Utilisation de la recherche en texte intégral Neptune dans des requêtes Gremlin
](full-text-search-gremlin.md)
+ [

# Résolution des problèmes liés à la recherche Neptune en texte intégral
](streams-consumer-troubleshooting.md)

# Neptune-to-OpenSearchRéplication Amazon
<a name="full-text-search-cfn-setup"></a>

Amazon Neptune prend en charge la recherche en texte intégral dans les requêtes Gremlin et SPARQL à l'aide d' OpenSearch Amazon Service (Service). OpenSearch Vous pouvez utiliser une AWS CloudFormation pile pour lier un domaine OpenSearch de service à Neptune. Le CloudFormation modèle crée une instance d'application streams-consumer qui assure Neptune-to-OpenSearch la réplication.

Avant de commencer, vous avez besoin d'un cluster de base de données Neptune existant sur lequel les flux sont activés pour servir de source, et d'un domaine de OpenSearch service pour servir de cible de réplication.

Si vous disposez déjà d'un domaine de OpenSearch service cible accessible par Lambda dans le VPC où se trouve votre cluster de base de données Neptune, le modèle peut utiliser celui-ci. Sinon, vous devez en créer un nouveau.

**Note**  
Le OpenSearch cluster et la fonction Lambda que vous créez doivent être situés dans le même VPC que votre cluster de base de données Neptune, et le cluster OpenSearch doit être configuré en mode VPC (et non en mode Internet).

Nous vous recommandons d'utiliser une instance Neptune nouvellement créée pour l'utiliser avec OpenSearch le Service. Si vous utilisez une instance existante qui contient déjà des données, vous devez effectuer une synchronisation des données de OpenSearch service avant d'effectuer des requêtes, faute de quoi il peut y avoir des incohérences dans les données. Ce GitHub projet fournit un exemple de la manière d'effectuer la synchronisation : [Exporter Neptune vers OpenSearch](https://github.com/awslabs/amazon-neptune-tools/tree/master/export-neptune-to-elasticsearch) (https://github.com/awslabs/amazon-neptune-tools/tree/master/export-neptune-to-elasticsearch).

**Important**  
Lors de l'intégration à Amazon OpenSearch Service, Neptune nécessite la version 7.1 ou supérieure d'Elasticsearch et fonctionne avec les versions OpenSearch 2.3, 2.5 et les futures versions compatibles d'Opensearch.

**Note**  
À partir de la [version 1.3.0.0 du moteur](engine-releases-1.3.0.0.md), Amazon Neptune prend en charge l'utilisation d'[ OpenSearch Amazon Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless.html) Serverless pour la recherche en texte intégral dans les requêtes Gremlin et SPARQL.

**Topics**
+ [

# Utilisation d'un AWS CloudFormation modèle pour démarrer Neptune-to-OpenSearch la réplication
](full-text-search-cfn-create.md)
+ [

# Activation de la recherche en texte intégral dans les bases de données Neptune existantes
](full-text-search-cfn-enabling.md)
+ [

# Mise à jour de l'interrogateur de flux
](full-text-search-cfn-update-poller.md)
+ [

# Désactivation et réactivation du processus d'interrogateur de flux
](full-text-search-using-pausing-poller.md)

# Utilisation d'un AWS CloudFormation modèle pour démarrer Neptune-to-OpenSearch la réplication
<a name="full-text-search-cfn-create"></a>

## Lancez un CloudFormation stack spécifique à votre région
<a name="full-text-search-cfn-by-region"></a>

Chacun des CloudFormation modèles ci-dessous crée une instance d'application streams-consumer dans une région spécifique AWS . Pour lancer la pile correspondante à l'aide de la CloudFormation console, cliquez sur l'un des boutons **Launch Stack** du tableau suivant, en fonction de la AWS région que vous souhaitez utiliser.


| Région | Afficher | Afficher dans Designer | Lancer | 
| --- | --- | --- | --- | 
| USA Est (Virginie du Nord) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=us-east-1&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| USA Est (Ohio) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=us-east-2&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=us-east-2#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=us-east-2#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| USA Ouest (Californie du Nord) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=us-west-1&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=us-west-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=us-west-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| USA Ouest (Oregon) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=us-west-2&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Canada (Centre) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=us-west-2&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=ca-central-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=ca-central-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Amérique du Sud (São Paulo) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=sa-east-1&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=sa-east-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=sa-east-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Europe (Stockholm) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=eu-north-1&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=eu-north-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=eu-north-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Europe (Irlande) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=eu-west-1&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=eu-west-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=eu-west-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Europe (Londres) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=eu-west-2&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=eu-west-2#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=eu-west-2#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Europe (Paris) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=eu-west-3&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=eu-west-3#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=eu-west-3#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Europe (Espagne) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=eu-south-2&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=eu-south-2#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=eu-south-2#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Europe (Francfort) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=eu-central-1&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=eu-central-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=eu-central-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Middle East (Bahrain) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=me-south-1&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=me-south-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=me-south-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Moyen-Orient (EAU) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=me-central-1&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=me-central-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=me-central-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Israël (Tel Aviv) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=il-central-1&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=il-central-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=il-central-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Afrique (Le Cap) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=af-south-1&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=af-south-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=af-south-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Asie-Pacifique (Hong Kong) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=ap-east-1&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=ap-east-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=ap-east-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Asie-Pacifique (Tokyo) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=ap-northeast-1&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Asie-Pacifique (Séoul) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=ap-northeast-2&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-2#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=ap-northeast-2#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Asie-Pacifique (Singapour) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=ap-southeast-1&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=ap-southeast-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=ap-southeast-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Asie-Pacifique (Jakarta) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=ap-southeast-3&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=ap-southeast-3#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=ap-southeast-3#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Asie-Pacifique (Mumbai) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.aws.amazon.com/cloudformation/designer/home?region=ap-south-1&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.aws.amazon.com/cloudformation/home?region=ap-south-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.aws.amazon.com/cloudformation/home?region=ap-south-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Chine (Pékin) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.amazonaws.cn/cloudformation/designer/home?region=cn-north-1&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.amazonaws.cn/cloudformation/home?region=cn-north-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.amazonaws.cn/cloudformation/home?region=cn-north-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| Chine (Ningxia) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.amazonaws.cn/cloudformation/designer/home?region=cn-northwest-1&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.amazonaws.cn/cloudformation/home?region=cn-northwest-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.amazonaws.cn/cloudformation/home?region=cn-northwest-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| AWS GovCloud (US-Ouest) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.amazonaws-us-gov.com/cloudformation/designer/home?region=us-gov-west-1&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.amazonaws-us-gov.com/cloudformation/home?region=us-gov-west-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.amazonaws-us-gov.com/cloudformation/home?region=us-gov-west-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 
| AWS GovCloud (USA Est) | [Afficher](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Afficher dans Designer](https://console.amazonaws-us-gov.com/cloudformation/designer/home?region=us-gov-east-1&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [https://console.amazonaws-us-gov.com/cloudformation/home?region=us-gov-east-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json](https://console.amazonaws-us-gov.com/cloudformation/home?region=us-gov-east-1#/stacks/new?stackName=NeptuneQuickStart&templateURL=https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json)  | 

Sur la page **Créer une pile** choisissez **Suivant**.

## Ajouter des détails sur la nouvelle OpenSearch pile que vous créez
<a name="full-text-search-cfn-stack-details"></a>

Sur la page **Spécifier les détails de la pile**, vous pouvez utiliser de nombreux paramètres pour contrôler la configuration de la recherche en texte intégral :

**Nom de la pile** : nom de la nouvelle CloudFormation pile que vous créez. Vous pouvez généralement utiliser la valeur par défaut, `NeptuneStreamPoller`.

Sous **Paramètres**, indiquez ce qui suit :

**Configuration réseau pour le VPC sur lequel Streams Consumer est exécuté**
+ **`VPC`** : indiquez le nom du VPC où la fonction Lambda d'interrogation sera exécutée.
+ **`List of Subnet IDs`** : sous-réseaux avec lesquels une interface réseau est établie. Ajoutez des sous-réseaux correspondant à votre cluster Neptune.
+ **`List of Security Group Ids`**— Indiquez les groupes IDs de sécurité qui accordent un accès en écriture entrante à votre cluster de base de données Neptune source.
+ **`List of Route Table Ids`** : nécessaire pour créer un point de terminaison Amazon DynamoDB dans votre VPC Neptune, si vous n'en avez pas déjà un. Vous devez fournir une liste séparée par des virgules des tables de routage IDs associées aux sous-réseaux.
+ **`Require to create Dynamo DB VPC Endpoint`** : valeur booléenne qui correspond par défaut à `true`. Vous n'avez besoin de la remplacer par `false` que si vous avez déjà créé un point de terminaison DynamoDB dans votre VPC.
+ **`Require to create Monitoring VPC Endpoint`** : valeur booléenne qui correspond par défaut à `true`. Vous n'avez besoin de la modifier en `false` que si vous avez déjà créé un point de terminaison de surveillance dans votre VPC.

**Interrogateur de flux**
+ **`Application Name`** : vous pouvez généralement conserver la valeur par défaut (`NeptuneStream`). Si vous utilisez un nom différent, il doit être unique.
+ **`Memory size for Lambda Poller`** : utilisé pour définir la taille de mémoire disponible pour la fonction d'interrogateur Lambda. La valeur par défaut est 2 048 mégaoctets.
+ **`Lambda Runtime`** : langage utilisé dans la fonction Lambda qui extrait les éléments du flux Neptune. Vous pouvez définir ce paramètre sur `python3.9` ou sur `java8`.
+ **`S3 Bucket having Lambda code artifacts`** : laissez cette case vide, sauf si vous utilisez une fonction d'interrogation Lambda personnalisée qui se charge à partir d'un compartiment S3 différent.
+ **`S3 Key corresponding to Lambda Code artifacts`** : laissez ce champ vide, sauf si vous utilisez une fonction d'interrogation Lambda personnalisée.
+ **`StartingCheckpoint`** : point de contrôle de départ de l'interrogateur de flux. La valeur par défaut est `0:0`, ce qui signifie que l'interrogateur de flux doit commencer au début du flux Neptune.
+ **`StreamPollerInitialState`** : état initial de l'interrogateur. La valeur par défaut est `ENABLED`, ce qui signifie que la réplication du flux débutera dès que la création complète de la pile sera terminée.
+ **`Logging level for Lambda`** : en général, conservez la valeur par défaut, `INFO`.
+ **`Managed Policies for Lambda Execution`** : en général, laissez ce champ vide sauf si vous utilisez une fonction d'interrogation Lambda personnalisée.
+ **`Stream Records Handler`** : en général, laissez ce champ vide, sauf si vous utilisez un gestionnaire personnalisé pour les enregistrements dans les flux Neptune.
+ **`Maximum records Fetched from Stream`** : vous pouvez utiliser ce paramètre pour ajuster les performances. La valeur par défaut (`100`) est un bon endroit pour commencer. Le maximum autorisé est de 10 000. Plus le nombre est élevé, moins les appels réseau sont nécessaires pour lire les enregistrements du flux, mais plus la mémoire est nécessaire pour traiter les enregistrements.
+ **`Max wait time between two Polls (in Seconds)`** : détermine la fréquence à laquelle l'interrogateur Lambda est appelé pour interroger les flux Neptune. Définissez cette valeur sur 0 pour l'interrogation continue. La valeur maximale est de 3 600 secondes (1 heure). La valeur par défaut (60 secondes) est un bon point de départ, en fonction de la vitesse à laquelle vos données de graphe changent.
+ **`Maximum Continuous polling period (in Seconds)`** : permet de définir un délai d'expiration pour la fonction d'interrogation Lambda. Il doit être compris entre 5 secondes et 900 secondes. La valeur par défaut (600 secondes) est un bon point de départ.
+ **`Step Function Fallback Period`**— Le nombre d' step-function-fallback-periodunités devant attendre le sondeur, après quoi la fonction step est appelée via Amazon CloudWatch Events pour remédier à une panne. La valeur par défaut (5 minutes) est un bon point de départ.
+ **`Step Function Fallback Period Unit`** : unités de temps utilisées pour mesurer l'élément `Step Function Fallback Period` précédent (minutes, heures, jours). La valeur par défaut (minutes) est généralement suffisante.
+ **`Enable/disable creation of Elastic Search Mappings by Lambda`**— Signale la gestion enable/disable automatique des mappages Elastic Search par le stream poller. Les mappages Elastic Search sont essentiels à la conversion entre les types de données Neptune et Elastic Search. Cela ne doit être désactivé que par les utilisateurs avancés qui souhaitent contrôler directement et manuellement tous les mappages de leur index Elastic Search. La valeur par défaut est `true`.
+ **`Data replication scope`**— Détermine s'il faut répliquer à la fois les nœuds et les arêtes, ou uniquement les nœuds vers OpenSearch (cela s'applique uniquement aux données du moteur Gremlin). La valeur par défaut (All) est généralement un bon endroit pour commencer.
+ **`Ignore OpenSearch missing document error`**— Indicateur permettant de déterminer si une erreur liée à un document manquant OpenSearch peut être ignorée. Les erreurs de document manquant se produisent rarement, mais nécessitent une intervention manuelle si elles ne sont pas ignorées.  : la valeur par défaut (`True`) est généralement un bon point de départ.
+ **`Enable Non-String Indexing`** : indicateur permettant d'activer ou de désactiver l'indexation des champs sans contenu de chaîne. Si cet indicateur est défini sur`true`, les champs autres que des chaînes sont indexés OpenSearch, ou si `false` seuls les champs de chaîne sont indexés. La valeur par défaut est `true`.
+ **`Properties to exclude from being inserted into OpenSearch`**— Liste séparée par des virgules de clés de propriété ou de prédicat à exclure de l'indexation. OpenSearch Si cette valeur de paramètre CFN est laissée vide, toutes les clés de propriété sont indexées.
+ **`Datatypes to exclude from being inserted into OpenSearch`**— Liste séparée par des virgules de types de données de propriétés ou de prédicats à exclure de l'indexation. OpenSearch Si cette valeur de paramètre CFN est laissée vide, toutes les valeurs de propriété qui peuvent être converties en toute sécurité en OpenSearch types de données sont indexées.

**Flux Neptune**
+ **`Endpoint of source Neptune Stream`** : (*obligatoire*) prend deux formes :
  + **`https://your DB cluster:port/propertygraph/stream`** (ou son alias, `https://your DB cluster:port/pg/stream`).
  + `https://your DB cluster:port/sparql/stream`
+ **`Neptune Query Engine`** : choisissez Gremlin ou SPARQL.
+ **`Is IAM Auth Enabled?`** : si votre cluster de bases de données Neptune utilise l'authentification IAM, définissez ce paramètre sur `true`.
+ **`Neptune Cluster Resource Id`** : si votre cluster de bases de données Neptune utilise l'authentification IAM, définissez ce paramètre sur l'ID de ressource du cluster. L'ID de ressource n'est pas le même que l'ID de cluster. Elle prend plutôt la forme : `cluster-` suivi de 28 caractères alphanumériques. Vous pouvez le trouver sous **Détails du cluster** dans la console Neptune.

**OpenSearch Cluster cible**
+ **`Endpoint for OpenSearch service`**— (Obligatoire) Indiquez le point de terminaison du OpenSearch service dans votre VPC.
+ **`Number of Shards for OpenSearch Index`** : la valeur par défaut (5) est généralement un bon point de départ.
+ **`Number of Replicas for OpenSearch Index`** : la valeur par défaut (1) est généralement un bon point de départ.
+ **`Geo Location Fields for Mapping`** : si vous utilisez des champs de géolocalisation, répertoriez les clés de propriété ici.

**alerte**
+ **`Require to create Cloud watch Alarm`**— Réglez ce `true` paramètre sur si vous souhaitez créer une CloudWatch alarme pour la nouvelle pile.
+ **`SNS Topic ARN for Cloudwatch Alarm Notifications`**— L'ARN de la rubrique SNS où les notifications CloudWatch d'alarme doivent être envoyées (uniquement nécessaire si les alarmes sont activées).
+ **`Email for Alarm Notifications`** : adresse e-mail à laquelle les notifications d'alarme doivent être envoyées (uniquement si les alarmes sont activées).

Pour la destination de la notification d'alarme, vous pouvez ajouter la rubrique SNS uniquement, l'adresse e-mail uniquement ou les deux.

## Exécuter le CloudFormation modèle
<a name="full-text-search-cfn-complete"></a>

Vous pouvez maintenant terminer le processus de provisionnement d'une instance d'application grand public de flux Neptune comme suit :

1. Dans CloudFormation, sur la page **Spécifier les détails de la pile**, choisissez **Next**.

1. Dans la page **Options**, choisissez **Suivant**.

1. Sur la page **Vérification**, cochez la première case pour accepter que CloudFormation créera des ressources IAM. Cochez la deuxième case pour confirmer `CAPABILITY_AUTO_EXPAND` comme nouvelle pile. 
**Note**  
`CAPABILITY_AUTO_EXPAND` accepte explicitement que les macros soient étendues lors de la création de la pile, sans révision préalable. Les utilisateurs créent souvent un jeu de modifications à partir d'un modèle traité, de sorte que les modifications apportées par les macros puissent être révisées avant la création de la pile. Pour plus d'informations, consultez le fonctionnement de l' CloudFormation [CreateStack](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html)API dans le Guide de *référence des AWS CloudFormation API*.

   Ensuite, choisissez **Créer**.

# Activation de la recherche en texte intégral dans les bases de données Neptune existantes
<a name="full-text-search-cfn-enabling"></a>

 Il s'agit des approches établies pour permettre la recherche en texte intégral dans les bases de données Amazon Neptune existantes. Selon que vous pouvez suspendre vos charges de travail d'écriture ou non, les étapes peuvent varier légèrement. Ce guide décrit les étapes recommandées pour les deux scénarios : quand vous pouvez suspendre les écritures et quand vous ne le pouvez pas. Il couvre l'activation des flux Neptune, la création d'un clone de base de données, la synchronisation des données avec un OpenSearch domaine et la configuration de mises à jour continues. Les conseils s'appuient sur des AWS services et des outils open source pour rationaliser le processus et minimiser les temps d'arrêt. 

## Si vous pouvez suspendre vos charges de travail d'écriture
<a name="full-text-search-cfn-enabling-with-pause"></a>

La méthode la plus adaptée pour activer la recherche en texte intégral dans une base de données Neptune existante est généralement la suivante, à condition que vous puissiez suspendre les charges de travail d'écriture. Elle nécessite de créer un clone, d'activer les flux à l'aide d'un paramètre de cluster et de redémarrer toutes les instances. La création d'un clone étant une opération relativement rapide, le temps d'arrêt requis est limité.

Voici les étapes requises :

1. Arrêtez toutes les charges de travail d'écriture sur la base de données.

1. Activez les flux sur la base de données (voir [Activation de Neptune Streams](streams-using-enabling.md)).

1. Créez un clone de la base de données (voir [Clonage de base de données dans Neptune](manage-console-cloning.md)).

1. Relancez les charges de travail d'écriture.

1. Utilisez l'[export-neptune-to-elasticsearch](https://github.com/awslabs/amazon-neptune-tools/tree/master/export-neptune-to-elasticsearch)outil sur github pour effectuer une synchronisation unique entre la base de données clonée et le OpenSearch domaine.

1. Utilisez le [modèle CloudFormation de votre région](https://docs.aws.amazon.com/neptune/latest/userguide/full-text-search-cfn-create.html#full-text-search-cfn-by-region) pour démarrer la synchronisation à partir de la base de données d'origine avec une mise à jour continue (aucune modification de configuration n'est nécessaire dans le modèle).

1. Supprimez la base de données clonée et la CloudFormation pile créée pour l'`export-neptune-to-elasticsearch`outil.

**Note**  
En cas d'utilisation [export-neptune-to-elasticsearch](https://github.com/awslabs/amazon-neptune-tools/tree/master/export-neptune-to-elasticsearch)avec Opensearch Serverless, les données `LambdaExecutionRole` créées par la pile [export-neptune-to-elasticsearch](https://github.com/awslabs/amazon-neptune-tools/tree/master/export-neptune-to-elasticsearch)Cloudformation doivent être ajoutées à la [politique d'accès aux données d'Opensearch pour que les données](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html) soient correctement répliquées.

## Si vous ne pouvez pas suspendre vos charges de travail d'écriture
<a name="full-text-search-cfn-enabling-without-pause"></a>

Si vous ne pouvez pas vous permettre de suspendre les charges de travail d'écriture sur la base de données, voici une approche qui nécessite encore moins de temps d'arrêt que celle recommandée ci-dessus, mais elle doit être appliquée avec prudence :

1. Activez les flux sur la base de données (voir [Activation de Neptune Streams](streams-using-enabling.md)).

1. Créez un clone de la base de données (voir [Clonage de base de données dans Neptune](manage-console-cloning.md)).

1. Obtenez les derniers `eventID` des flux de la base de données clonée en exécutant une commande de ce type sur le point de terminaison de l'API Streams (voir [Appel de l'API REST Neptune Streams](streams-using-api-call.md) pour plus d'informations) :

   ```
   curl "https://(your neptune endpoint):(port)/(propertygraph or sparql)/stream?iteratorType=LATEST"
   ```

   Notez les valeurs des champs `commitNum` et `opNum` dans l'objet `lastEventId` de la réponse.

1. Utilisez l'[export-neptune-to-elasticsearch](https://github.com/awslabs/amazon-neptune-tools/tree/master/export-neptune-to-elasticsearch)outil sur github pour effectuer une synchronisation unique entre la base de données clonée et le OpenSearch domaine.

1. Utilisez le [modèle CloudFormation de votre région](https://docs.aws.amazon.com/neptune/latest/userguide/full-text-search-cfn-create.html#full-text-search-cfn-by-region) pour démarrer la synchronisation à partir de la base de données d'origine avec une mise à jour continue.

   Apportez la modification suivante lors de la création de la pile : sur la page des détails de la pile, dans la section **Paramètres**, définissez la valeur du `StartingCheckpoint` champ sur **commitNum** : **opnum** en utilisant les `opNum` valeurs `commitNum` et que vous avez enregistrées ci-dessus.

1. Supprimez la base de données clonée et la CloudFormation pile créée pour l'`export-neptune-to-elasticsearch`outil.

# Mise à jour de l'interrogateur de flux
<a name="full-text-search-cfn-update-poller"></a>

 Les informations suivantes décrivent les étapes nécessaires pour mettre à jour le Stream Poller avec les derniers artefacts Lambda à l'aide de AWS la console de gestion. 

## Pour mettre à jour l'interrogateur de flux avec les derniers artefacts Lambda
<a name="full-text-search-cfn-update-poller-lambda"></a>

Pour mettre à jour l'interrogateur de flux avec les derniers artefacts Lambda, procédez comme suit :

1. Dans le AWS Management Console, naviguez jusqu'à la CloudFormation pile parent principale CloudFormation et sélectionnez-la.

1. Sélectionnez l'option **Mettre à jour** correspondant à la pile.

1. Sélectionnez **Remplacer le modèle actuel**.

1. Pour la source du modèle, choisissez **URL Amazon S3** et indiquez l'URL S3 suivante :

   ```
   https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json
   ```

1. Sélectionnez **Next** sans modifier aucun CloudFormation paramètre.

1. Choisissez **Mettre à jour la pile**.

La pile met à jour les artefacts Lambda avec les artefacts les plus récents.

## Extension de l'interrogateur de flux pour prendre en charge les champs personnalisés
<a name="full-text-search-using-custom-fields"></a>

L'interrogateur de flux actuel peut facilement être étendu pour écrire du code personnalisé permettant de gérer des champs personnalisés, comme expliqué en détail dans ce billet de blog : [Capture graph changes using Neptune Streams](https://aws.amazon.com/blogs/database/capture-graph-changes-using-neptune-streams/).

**Note**  
Lorsque vous ajoutez un champ personnalisé OpenSearch, assurez-vous d'ajouter le nouveau champ en tant qu'objet interne d'un prédicat (voir[Modèle de données de recherche en texte intégral Neptune](full-text-search-model.md)).

# Désactivation et réactivation du processus d'interrogateur de flux
<a name="full-text-search-using-pausing-poller"></a>

**Avertissement**  
Soyez prudent lorsque vous désactivez le processus d'interrogateur de flux. Une perte de données peut se produire si le processus est suspendu au-delà de la période d'expiration des flux. La fenêtre par défaut est de 7 jours, mais à partir de la version [1.2.0.0](engine-releases-1.2.0.0.md) du moteur, vous pouvez définir une période d'expiration des flux personnalisée pouvant aller jusqu'à 90 jours.

# Désactivation (interruption) du processus d'interrogateur de flux
<a name="full-text-search-pause-poller"></a>

1. Connectez-vous à la EventBridge console Amazon AWS Management Console et ouvrez-la à l'adresse [https://console.aws.amazon.com/events/](https://console.aws.amazon.com/events/).

1. Dans le volet de navigation, sélectionnez **Règles**.

1. Sélectionnez la règle dont le nom contient le nom que vous avez fourni comme **nom d'application** dans le CloudFormation modèle que vous avez utilisé pour configurer le stream poller.

1. Choisissez **Désactiver**.

1. Ouvrez la console Step Functions à l'adresse [https://console.aws.amazon.com/states/](https://console.aws.amazon.com/states/).

1. Sélectionnez la fonction d'étape en cours d'exécution qui correspond au processus d'interrogateur de flux. Encore une fois, le nom de cette fonction d'étape contient le nom que vous avez fourni comme **nom d'application** dans le CloudFormation modèle que vous avez utilisé pour configurer le stream poller. Vous pouvez effectuer un filtrage par statut d'exécution des fonctions afin de ne voir que les fonctions **en cours d'exécution**.

1. Choisissez **Arrêter**.

# Réactivation du processus d'interrogateur de flux
<a name="full-text-search-re-enable-poller"></a>

1. Connectez-vous à la EventBridge console Amazon AWS Management Console et ouvrez-la à l'adresse [https://console.aws.amazon.com/events/](https://console.aws.amazon.com/events/).

1. Dans le volet de navigation, sélectionnez **Règles**.

1. Sélectionnez la règle dont le nom contient le nom que vous avez fourni comme **nom d'application** dans le CloudFormation modèle que vous avez utilisé pour configurer le stream poller.

1. Sélectionnez **Activer**. La règle d'événement basée sur l'intervalle planifié spécifié déclenche désormais une nouvelle exécution de la fonction d'étape.

# Réplication vers le mode OpenSearch sans serveur
<a name="full-text-search-serverless"></a>

À partir de la [version 1.3.0.0 du moteur](engine-releases-1.3.0.0.md), Amazon Neptune prend en charge l'utilisation d'[ OpenSearch Amazon Service](https://docs.aws.amazon.com//opensearch-service/latest/developerguide/serverless.html) Serverless pour la recherche en texte intégral dans les requêtes Gremlin et SPARQL. L'utilisation de OpenSearch Serverless nécessite que vous [activiez l'authentification IAM](https://docs.aws.amazon.com/neptune/latest/userguide/iam-auth-enable.html) sur votre cluster de base de données Neptune. Les clusters de base de données Neptune dont l'authentification IAM est désactivée ne sont pas pris en charge avec Serverless. OpenSearch 

## Modifications requises pour la fonction AWS Lambda du poller
<a name="full-text-changes-required"></a>

Si vous effectuez une réplication vers OpenSearch Serverless, ajoutez le rôle d'exécution du sondeur de flux Lambda à la politique d'accès aux données pour la collection Serverless. OpenSearch L’ARN du rôle d’exécution du sondeur de flux Lambda a le format suivant :

```
arn:aws:iam::(account ID):role/stack-name-NeptuneOSReplication-NeptuneStreamPollerExecu-(uuid)
```

## Modifications requises pour l'utilitaire d'importation en bloc
<a name="full-text-changes-bulk-import"></a>

 Si vous utilisez [ export-neptune-to-elasticsearch](https://github.com/awslabs/amazon-neptune-tools/tree/master/export-neptune-to-elasticsearch)pour synchroniser des données existantes avec OpenSearch Serverless, ajoutez la politique `LambdaExecutionRole` d'accès aux données de la CloudFormation pile pour la collection OpenSearch Serverless. L'ARN du `LambdaExecutionRole` a le format suivant : 

```
arn:aws:iam::012345678901:role/stack-name-LambdaExecutionRole-(id)
```

Pour plus d'informations, consultez la section [Contrôle d'accès aux données pour Amazon OpenSearch Serverless](https://docs.aws.amazon.com//opensearch-service/latest/developerguide/serverless-data-access.html).

## Modifications nécessaires au rôle IAM utilisé pour interroger Neptune
<a name="full-text-IAM"></a>

L'entité IAM (utilisateur ou rôle) utilisée pour se connecter à la base de données Neptune doit disposer d'autorisations à la fois pour Neptune et pour la collection Serverless. OpenSearch Cela signifie que votre utilisateur ou votre rôle doit disposer d'une politique OpenSearch sans serveur comme celle-ci ci-jointe :

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowOpenSearchServerlessAccess",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
      },
      "Action": "aoss:APIAccessAll",
      "Resource": "arn:aws:aoss:us-east-1:111122223333:collection/collection-id"
    }
  ]
}
```

------

Pour plus d'informations, consultez [Création de déclarations de politique IAM personnalisées pour accéder aux données dans Amazon Neptune](iam-data-access-policies.md).

# Interrogation depuis un OpenSearch cluster sur lequel le contrôle d'accès détaillé (FGAC) est activé
<a name="full-text-search-fgac"></a>

Si vous avez activé le [contrôle d'accès détaillé](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html) sur votre OpenSearch cluster, vous devez également [activer l'authentification IAM dans votre base](iam-auth-enable.md) de données Neptune.

L'entité IAM (utilisateur ou rôle) utilisée pour se connecter à la base de données Neptune doit disposer d'autorisations à la fois pour Neptune et pour le cluster. OpenSearch Cela signifie que votre utilisateur ou votre rôle doit être associé à une politique de OpenSearch service comme celle-ci :

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowFullTextSearchAccess",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-east-1:111122223333:domain/domain-name/*"
    }
  ]
}
```

------

Pour plus d'informations, consultez [Création de déclarations de politique IAM personnalisées pour accéder aux données dans Amazon Neptune](iam-data-access-policies.md).

# Utilisation de la syntaxe de requête Apache Lucene dans les requêtes de recherche en texte intégral Neptune
<a name="full-text-search-lucene"></a>

OpenSearch prend en charge l'utilisation de la [syntaxe Apache Lucene](https://lucene.apache.org/core/8_9_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#package.description) pour les requêtes query\$1string. Elle est particulièrement utile pour transmettre plusieurs filtres dans une même requête.

Neptune utilise une structure imbriquée pour stocker les propriétés d'un OpenSearch document (voir). [Modèle de données de recherche en texte intégral Neptune](full-text-search-model.md) Lorsque vous utilisez la syntaxe Lucene, vous devez utiliser les chemins complets vers les propriétés de ce modèle imbriqué.

Voici un exemple Gremlin :

```
g.withSideEffect("Neptune#fts.endpoint", "es_endpoint")
 .withSideEffect("Neptune#fts.queryType", "query_string")
 .V()
 .has("*", "Neptune#fts predicates.name.value:\"Jane Austin\" AND entity_type:Book")
```

Voici un exemple SPARQL :

```
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
SELECT * WHERE {
  SERVICE neptune-fts:search {
  neptune-fts:config neptune-fts:endpoint 'http://localhost:9200 (http://localhost:9200/)' .
  neptune-fts:config neptune-fts:queryType 'query_string' .
  neptune-fts:config neptune-fts:query "predicates.\\*foaf\\*name.value:Ronak AND predicates.\\*foaf\\*surname.value:Sh*" .
  neptune-fts:config neptune-fts:field '*' .
  neptune-fts:config neptune-fts:return ?res .
}
```

# Modèle de données Neptune pour les données OpenSearch
<a name="full-text-search-model"></a>

Amazon Neptune utilise une structure de document JSON unifiée pour stocker les données SPARQL et Gremlin dans Service. OpenSearch Chaque document OpenSearch correspond à une entité et stocke toutes les informations pertinentes pour cette entité. Pour Gremlin, les sommets et les arêtes sont considérés comme des entités. Les OpenSearch documents correspondants contiennent donc des informations sur les sommets, les étiquettes et les propriétés. Pour SPARQL, les sujets peuvent être considérés comme des entités, de sorte que les OpenSearch documents correspondants contiennent des informations sur toutes les paires prédicat-objet dans un seul document.

**Note**  
L'implémentation de Neptune-to-OpenSearch réplication ne stocke que des données sous forme de chaîne. Toutefois, vous pouvez le modifier pour stocker d'autres types de données.

La structure de document JSON unifiée ressemble à ce qui suit.

```
{
  "entity_id": "Vertex Id/Edge Id/Subject URI",
  "entity_type": [List of Labels/rdf:type object value],
  "document_type": "vertex/edge/rdf-resource"
  "predicates": {
    "Property name or predicate URI": [
      {
        "value": "Property Value or Object Value",
        "graph": "(Only for Sparql) Named Graph Quad is present"
        "language": "(Only for Sparql) rdf:langString"
      },
      {
        "value": "Property Value 2/ Object Value 2",
      }
    ]
  }
}
```

****
+ `entity_id` : ID unique d'entité représentant le document.
  + Pour SPARQL, il s'agit de l'URI de sujet.
  + Pour Gremlin, c'est le `Vertex_ID` ou `Edge_ID`.
+ `entity_type` : représente une ou plusieurs étiquettes pour un sommet ou une arête, ou zéro ou plusieurs valeurs de prédicat `rdf:type` pour un sujet.
+ `document_type` : permet de spécifier si le document actuel représente un sommet, une arête ou une ressource RDF.
+ `predicates` : pour Gremlin, stocke les propriétés et les valeurs d'un sommet ou d'une arête. Pour SPARQL, il stocke les paires prédicat-objet.

  Le nom de la propriété prend le formulaire `properties.name.value` dans OpenSearch. Pour l'interroger, vous devez le nommer sous cette forme.
+ `value ` : valeur de propriété pour Gremlin ou valeur d'objet pour SPARQL.
+ `graph` : graphe nommé pour SPARQL.
+ `language` : balise de langage pour un littéral `rdf:langString` dans SPARQL.

## Exemple de document SPARQL OpenSearch
<a name="full-text-search-model-sparql-example"></a>

**Données**

```
@prefix dt:   <http://example.org/datatype#> .
@prefix ex:   <http://example.org/> .
@prefix xsd:  <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

ex:simone   rdf:type     ex:Person                    ex:g1
ex:michael  rdf:type     ex:Person                    ex:g1
ex:simone   ex:likes     "spaghetti"                  ex:g1

ex:simone   ex:knows     ex:michael                   ex:g2   # Not stored in ES
ex:simone   ex:likes     "spaghetti"                  ex:g2
ex:simone   ex:status    "La vita è un sogno"@it      ex:g2

ex:simone   ex:age       "40"^^xsd:int                DG      # Not stored in ES
ex:simone   ex:dummy     "testData"^^dt:newDataType   DG      # Not stored in ES
ex:simone   ex:hates     _:bnode                              # Not stored in ES
_:bnode     ex:means     "coding"                     DG      # Not stored in ES
```

**Documents**

```
{
  "entity_id": "http://example.org/simone",
  "entity_type": ["http://example.org/Person"],
  "document_type": "rdf-resource"
  "predicates": {
    "http://example.org/likes": [
      {
        "value": "spaghetti",
        "graph": "http://example.org/g1"
      },
      {
        "value": "spaghetti",
        "graph": "http://example.org/g2"
      }
    ]
    "http://example.org/status": [
      {
        "value": "La vita è un sogno",
        "language": "it"       // Only present for rdf:langString
      }
    ]
  }
}
```

```
{
  "entity_id" : "http://example.org/michael",
  "entity_type" : ["http://example.org/Person"],
  "document_type": "rdf-resource"
}
```

## Exemple de document Gremlin OpenSearch
<a name="full-text-search-model-gremlin-example"></a>

**Données**

```
# Vertex 1
simone   label    Person       <== Label
simone   likes    "spaghetti"  <== Property
simone   likes    "rice"       <== Property
simone   age      40           <== Property

# Vertex 2
michael  label    Person       <== Label

# Edge 1
simone  knows     michael      <== Edge
e1      updated  "2019-07-03"  <== Edge Property
e1      through  "company"     <== Edge Property
e1      since     10           <== Edge Property
```

**Documents**

```
{
  "entity_id": "simone",
  "entity_type": ["Person"],
  "document_type": "vertex",
  "predicates": {
    "likes": [
      {
        "value": "spaghetti"
      },
      {
        "value": "rice"
      }
    ]
  }
}
```

```
{
  "entity_id" : "michael",
  "entity_type" : ["Person"],
  "document_type": "vertex"
}
```

```
{
  "entity_id": "e1",
  "entity_type": ["knows"],
  "document_type": "edge"
  "predicates": {
    "through": [
      {
        "value": "company"
      }
    ]
  }
}
```

# Paramètres de recherche en texte intégral Neptune
<a name="full-text-search-parameters"></a>

Amazon Neptune utilise les paramètres suivants pour spécifier des OpenSearch requêtes en texte intégral dans Gremlin et SPARQL :
+ **`queryType`**— (*Obligatoire*) Type de OpenSearch requête. (Pour une liste des types de requêtes, consultez la [OpenSearch documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/full-text-queries.html)). Neptune prend en charge les types de OpenSearch requêtes suivants :
  + [simple\$1query\$1string](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html) : renvoie les documents en fonction d'une chaîne de requête fournie, en utilisant un analyseur avec une syntaxe Lucene limitée, mais tolérante aux pannes. Il s'agit du type de requête par défaut.

    Cette requête utilise une syntaxe simple pour analyser et diviser la chaîne de requête fournie en termes basés sur des opérateurs spéciaux. La requête analyse ensuite chaque terme indépendamment avant de renvoyer les documents correspondants.

    Bien que sa syntaxe soit plus limitée que la requête `query_string`, la requête `simple_query_string` ne renvoie pas d'erreurs pour la syntaxe non valide. Au lieu de cela, il ignore toutes les parties non valides de la chaîne de requête.
  + [match](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html) : la requête `match` est la requête standard permettant d'effectuer une recherche en texte intégral, y compris les options de correspondance partielle.
  + [prefix](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-prefix-query.html) : renvoie les documents contenant un préfixe spécifique dans un champ fourni.
  + [fuzzy](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html) : renvoie les documents contenant des termes similaires au terme de recherche, tels que mesurés par une distance de modification de Levenshtein.

    Une distance d'édition est le nombre de modifications d'un caractère nécessaires pour transformer un terme en un autre. Ces changements peuvent inclure :
    + Modification d'un caractère (car changé en bar).
    + Suppression d'un caractère (marre changé en mare).
    + Insertion d'un caractère (malade changé en maladie).
    + Transposition de deux caractères adjacents (chien changé en chine).

    Pour trouver des termes similaires, la requête approximative crée un ensemble de toutes les variations et extensions possibles du terme recherché à l'intérieur d'une distance d'édition spécifiée, puis renvoie des correspondances exactes pour chacune de ces variantes.
  + [term](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html)f : renvoie les documents qui contiennent une correspondance exacte avec un terme indiqué dans l'un des champs spécifiés.

    Vous pouvez utiliser la requête `term` pour rechercher des documents en fonction d'une valeur précise telle qu'un prix, un ID de produit ou un nom d'utilisateur.
**Avertissement**  
Évitez d'utiliser la requête de terme pour les champs de texte. Par défaut, OpenSearch modifie les valeurs des champs de texte dans le cadre de son analyse, ce qui peut compliquer la recherche de correspondances exactes entre les valeurs des champs de texte.  
Pour rechercher des valeurs de champ de texte, utilisez plutôt la requête de correspondance.
  + [query\$1string](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html) : renvoie les documents en fonction d'une chaîne de requête fournie, en utilisant un analyseur avec une syntaxe stricte (syntaxe Lucene).

    Cette requête utilise une syntaxe pour analyser et diviser la chaîne de requête fournie en fonction des opérateurs, tels que AND ou NOT. La requête analyse ensuite chaque texte fractionné indépendamment avant de renvoyer les documents correspondants.

    Vous pouvez utiliser la requête `query_string` pour créer une recherche complexe comprenant des caractères génériques, des recherches dans plusieurs champs, etc. Bien qu'elle soit polyvalente, la requête est stricte et renvoie une erreur si la chaîne de requête inclut une syntaxe non valide.
**Avertissement**  
Dans la mesure où elle renvoie une erreur pour toute syntaxe non valide, nous vous déconseillons d'utiliser la requête `query_string` pour les zones de recherche.  
Si vous n'avez pas besoin de prendre en charge une syntaxe de requête, envisagez d'utiliser la requête `match`. Si vous avez besoin des fonctionnalités d'une syntaxe de requête, utilisez la requête `simple_query_string`, qui est moins stricte.
+ **`field`**— Champ OpenSearch dans lequel effectuer la recherche. Ce paramètre ne peut être omis que si le `queryType` l'autorise (comme le font `simple_query_string` et `query_string`), auquel cas la recherche est effectuée par rapport à tous les champs. Dans Gremlin, il est implicite.

  Plusieurs champs peuvent être spécifiés si la requête l'autorise, comme le font `simple_query_string` et `query_string`.
+ **`query`**— (*Obligatoire*) La requête à exécuter OpenSearch. Le contenu de ce champ peut varier en fonction du type de requête (queryType). Les différents types de requête acceptent des syntaxes différentes, comme le fait `Regexp` par exemple. Dans Gremlin, `query` est implicite.
+ **`maxResults`** : nombre maximal de résultats à renvoyer. La valeur par défaut est le `index.max_result_window` OpenSearch paramètre, qui est lui-même défini par défaut sur 10 000. Le paramètre `maxResults` peut spécifier n'importe quel nombre inférieur à cela.
**Important**  
Si vous définissez une valeur supérieure `maxResults` à cette OpenSearch `index.max_result_window` valeur et que vous essayez de récupérer plus que des `index.max_result_window` résultats, cela OpenSearch échoue avec une `Result window is too large` erreur. Cependant, Neptune gère cette situation en douceur sans propager l'erreur. Gardez cela à l'esprit si vous essayez d'obtenir plus `index.max_result_window` résultats.
+ **`minScore`** : score minimum qu'un résultat de recherche doit avoir pour être renvoyé. Consultez [OpenSearchla documentation sur la pertinence](https://www.elastic.co/guide/en/elasticsearch/guide/current/scoring-theory.html) pour une explication de la notation des résultats.
+ **`batchSize`** : Neptune récupère toujours les données par lots (la taille par défaut du lot est de 100). Vous pouvez utiliser ce paramètre pour régler les performances. La taille du lot ne peut pas dépasser le `index.max_result_window` OpenSearch paramètre, qui est par défaut de 10 000.
+ **`sortBy`**— Paramètre facultatif qui permet de trier les résultats renvoyés OpenSearch selon l'une des méthodes suivantes :
  + *Champ de chaîne particulier dans le document* :  

    Par exemple, dans une requête SPARQL, vous pouvez spécifier :

    ```
        neptune-fts:config neptune-fts:sortBy foaf:name .
    ```

    Dans une requête Gremlin similaire, vous pouvez spécifier :

    ```
        .withSideEffect('Neptune#fts.sortBy', 'name')
    ```
  + Champ particulier autre qu'une chaîne (`long`, `double`, etc.) dans le document :  

    Notez que lorsque vous effectuez un tri sur un champ autre qu'une chaîne, vous devez ajouter `.value` au nom de ce champ pour le différencier d'un champ de chaîne.

    Par exemple, dans une requête SPARQL, vous pouvez spécifier :

    ```
        neptune-fts:config neptune-fts:sortBy foaf:name.value .
    ```

    Dans une requête Gremlin similaire, vous pouvez spécifier :

    ```
        .withSideEffect('Neptune#fts.sortBy', 'name.value')
    ```
  + `score` : tri par score de correspondance (valeur par défaut).

    Si le paramètre `sortOrder` est présent mais que `sortBy` ne l'est pas, les résultats sont triés par `score` dans l'ordre spécifié par `sortOrder`.
  + `id` : tri par ID, c'est-à-dire l'URI de sujet SPARQL ou l'ID de sommet ou d'arête Gremlin.

    Par exemple, dans une requête SPARQL, vous pouvez spécifier :

    ```
        neptune-fts:config neptune-fts:sortBy 'Neptune#fts.entity_id' .
    ```

    Dans une requête Gremlin similaire, vous pouvez spécifier :

    ```
        .withSideEffect('Neptune#fts.sortBy', 'Neptune#fts.entity_id')
    ```
  + `label` : tri par étiquette.

    Par exemple, dans une requête SPARQL, vous pouvez spécifier :

    ```
        neptune-fts:config neptune-fts:sortBy 'Neptune#fts.entity_type' .
    ```

    Dans une requête Gremlin similaire, vous pouvez spécifier :

    ```
        .withSideEffect('Neptune#fts.sortBy', 'Neptune#fts.entity_type')
    ```
  + `doc_type` : tri par type de document (SPARQL ou Gremlin).

    Par exemple, dans une requête SPARQL, vous pouvez spécifier :

    ```
        neptune-fts:config neptune-fts:sortBy 'Neptune#fts.document_type' .
    ```

    Dans une requête Gremlin similaire, vous pouvez spécifier :

    ```
        .withSideEffect('Neptune#fts.sortBy', 'Neptune#fts.document_type')
    ```

  Par défaut, les OpenSearch résultats ne sont pas triés et leur ordre n'est pas déterministe, ce qui signifie qu'une même requête peut renvoyer des éléments dans un ordre différent à chaque fois qu'elle est exécutée. Pour cette raison, si le jeu de résultats est supérieur à `max_result_window`, un sous-ensemble tout à fait différent du total des résultats peut être renvoyé chaque fois qu'une requête est exécutée. Cependant, en triant, vous pouvez rendre les résultats de différentes séries plus comparables directement.

  Si aucun paramètre `sortOrder` n'accompagne `sortBy`, l'ordre décroissant (`DESC`) du plus au moins grand est utilisé.
+ **`sortOrder`**— Paramètre facultatif qui vous permet de spécifier si les OpenSearch résultats sont triés du plus petit au plus grand ou du plus grand au plus petit (valeur par défaut) :

****
  + `ASC` : ordre croissant, du moins grand au plus grand.
  + `DESC` : ordre décroissant, du plus grand au plus petit.

    Il s'agit de la valeur par défaut, utilisée lorsque le paramètre `sortBy` est présent, alors que `sortOrder` ne l'est pas.

  Si aucun des deux `sortBy` n'`sortOrder`est présent, les OpenSearch résultats ne sont pas triés par défaut.

# OpenSearch Indexation sans chaîne dans Amazon Neptune
<a name="full-text-search-non-string-indexing"></a>

L' OpenSearch indexation sans chaîne dans Amazon Neptune permet de répliquer des valeurs autres que des chaînes pour les OpenSearch prédicats à l'aide du stream poller. Toutes les valeurs de prédicat qui peuvent être converties en toute sécurité en un OpenSearch mappage ou un type de données correspondant sont ensuite répliquées dans. OpenSearch

Pour que l'indexation sans chaîne soit activée sur une nouvelle pile, l'`Enable Non-String Indexing`indicateur du CloudFormation modèle doit être défini sur. `true` Il s’agit du paramètre par défaut. Pour mettre à jour une pile existante afin de prendre en charge l'indexation hors chaîne, consultez [Mise à jour d'une pile existante](full-text-search-non-string-indexing-update.md) ci-dessous.

**Note**  
Il est préférable de ne pas activer l'indexation hors chaîne sur les versions du moteur antérieures à **`1.0.4.2`**.
OpenSearch les requêtes utilisant des expressions régulières pour les noms de champs correspondant à plusieurs champs, dont certains contiennent des valeurs de chaîne et d'autres des valeurs autres que des chaînes, échouent avec une erreur. Il en va de même si les requêtes de recherche en texte intégral dans Neptune sont de ce type.
Lorsque vous effectuez un tri selon un champ autre qu'une chaîne, ajoutez « .value » au nom de ce champ pour le différencier d'un champ de chaîne.

**Contents**
+ [

# Mise à jour d'une pile de recherche en texte intégral Neptune pour prendre en charge l'indexation hors chaîne
](full-text-search-non-string-indexing-update.md)
+ [

# Filtrage des champs indexés dans la recherche en texte intégral Neptune
](full-text-search-non-string-indexing-filters.md)
  + [

## Filtrage par nom de propriété ou de prédicat
](full-text-search-non-string-indexing-filters.md#full-text-search-non-string-indexing-filters-name)
  + [

## Filtrage par type de propriété ou de valeur de prédicat
](full-text-search-non-string-indexing-filters.md#full-text-search-non-string-indexing-filters-datatype)
+ [

# Mappage des types de données SPARQL et Gremlin vers OpenSearch
](full-text-search-non-string-indexing-mapping.md)
+ [

# Validation des mappages de données
](full-text-search-data-validation.md)
+ [

# Exemples de OpenSearch requêtes autres que des chaînes dans Neptune
](full-text-search-non-string-examples.md)
  + [

## Obtenir tous les sommets de plus de 30 ans et dont le nom commence par « Si »
](full-text-search-non-string-examples.md#full-text-search-non-string-example-1)
  + [

## Obtenir tous les nœuds âgés de 10 à 50 ans et dont le nom a une correspondance floue avec « Ronka »
](full-text-search-non-string-examples.md#full-text-search-non-string-example-2)
  + [

## Obtenir tous les nœuds dont l'horodatage remonte aux 25 derniers jours
](full-text-search-non-string-examples.md#full-text-search-non-string-example-3)
  + [

## Obtenir tous les nœuds dont l'horodatage correspond à une année ou à un mois donnés
](full-text-search-non-string-examples.md#full-text-search-non-string-example-4)

# Mise à jour d'une pile de recherche en texte intégral Neptune pour prendre en charge l'indexation hors chaîne
<a name="full-text-search-non-string-indexing-update"></a>

Si vous utilisez déjà la recherche en texte intégral dans Neptune, voici les étapes à suivre pour prendre en charge l'indexation hors chaînes :

1. **Arrêtez la fonction Lambda d'interrogateur de flux.** Cette étape garantit qu'aucune nouvelle mise à jour n'est copiée lors de l'exportation. Pour ce faire, désactivez la règle d'événement cloud qui invoque cette fonction Lambda :
   + Dans le AWS Management Console, naviguez vers CloudWatch.
   + Sélectionnez **Règles**.
   + Choisissez la règle correspondant au nom de l'interrogateur de flux Lambda.
   + Sélectionnez **Désactiver** pour désactiver temporairement cette règle.

1. **Supprimez l'indice Neptune actuel dans. OpenSearch** Utilisez la `curl` requête suivante pour supprimer l'`amazon_neptune`index de votre OpenSearch cluster :

   ```
   curl -X DELETE "your OpenSearch endpoint/amazon_neptune"
   ```

1. **Lancez une exportation unique de Neptune vers. OpenSearch** Il est préférable de configurer une nouvelle OpenSearch pile à ce stade, afin que les nouveaux artefacts soient collectés pour le sondeur qui effectue l'exportation.

   Suivez les étapes [répertoriées ici GitHub]( https://github.com/awslabs/amazon-neptune-tools/blob/master/export-neptune-to-elasticsearch/readme.md) pour démarrer l'exportation unique de vos données Neptune vers. OpenSearch

1. **Mettez à jour les artefacts Lambda pour l'interrogateur de flux existant.** Une fois que l'exportation des données Neptune vers OpenSearch est terminée avec succès, procédez comme suit :
   + Dans le AWS Management Console, naviguez vers CloudFormation.
   + Choisissez la CloudFormation pile parent principale.
   + Sélectionnez l'option **Mettre à jour** pour cette pile.
   + Sélectionnez **Remplacer le modèle actuel à partir des options**.
   + Pour la source du modèle, sélectionnez **URL Amazon S3**.
   + Pour l'URL Amazon S3, entrez :

     ```
     https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json
     ```
   + Choisissez **Next** sans modifier aucun des CloudFormation paramètres.
   + Sélectionnez **Mettre à jour la pile**. CloudFormation remplacera les artefacts du code Lambda pour le stream poller par les derniers artefacts.

1. **Redémarrez l'interrogateur de flux.** Pour ce faire, activez la CloudWatch règle appropriée :
   + Dans le AWS Management Console, naviguez vers CloudWatch.
   + Sélectionnez **Règles**.
   + Choisissez la règle correspondant au nom de l'interrogateur de flux Lambda.
   + Sélectionnez **activer**.

# Filtrage des champs indexés dans la recherche en texte intégral Neptune
<a name="full-text-search-non-string-indexing-filters"></a>

Les détails du CloudFormation modèle comportent deux champs qui vous permettent de spécifier des clés de propriété ou de prédicat ou des types de données à exclure de l'indexation : OpenSearch 

## Filtrage par nom de propriété ou de prédicat
<a name="full-text-search-non-string-indexing-filters-name"></a>

Vous pouvez utiliser le paramètre de CloudFormation modèle facultatif nommé `Properties to exclude from being inserted into Elastic Search Index` pour fournir une liste séparée par des virgules de clés de propriété ou de prédicat à exclure de l'indexation. OpenSearch 

Par exemple, supposons que vous définissiez ce paramètre sur `bob` :

```
"Properties to exclude from being inserted into Elastic Search Index" : bob
```

Dans ce cas, l'enregistrement de flux de la requête de mise à jour Gremlin suivante serait supprimé au lieu d'être intégré dans l'index :

```
g.V("1").property("bob", "test")
```

De même, vous pouvez définir le paramètre sur `http://my/example#bob` :

```
"Properties to exclude from being inserted into Elastic Search Index" : http://my/example#bob
```

Dans ce cas, l'enregistrement de flux de la requête de mise à jour SPARQL suivante serait supprimé au lieu d'être intégré dans l'index :

```
PREFIX ex: <http://my/example#>
INSERT DATA { ex:s1 ex:bob "test"}.
```

Si vous n'entrez rien dans ce paramètre de CloudFormation modèle, toutes les clés de propriété non exclues seront indexées.

## Filtrage par type de propriété ou de valeur de prédicat
<a name="full-text-search-non-string-indexing-filters-datatype"></a>

Vous pouvez utiliser le paramètre de CloudFormation modèle facultatif nommé `Datatypes to exclude from being inserted into Elastic Search Index` pour fournir une liste séparée par des virgules de types de données de propriétés ou de valeurs de prédicat à exclure de l'indexation. OpenSearch 

Pour SPARQL, il n'est pas nécessaire de répertorier l'URI complet du type XSD. Vous pouvez simplement répertorier le jeton du type de données. Voici les jetons de type de données valides que vous pouvez répertorier :
+ `string`
+ `boolean`
+ `float`
+ `double`
+ `dateTime`
+ `date`
+ `time`
+ `byte`
+ `short`
+ `int`
+ `long`
+ `decimal`
+ `integer`
+ `nonNegativeInteger`
+ `nonPositiveInteger`
+ `negativeInteger`
+ `unsignedByte`
+ `unsignedShort`
+ `unsignedInt`
+ `unsignedLong`

Pour Gremlin, voici les types de données valides que vous pouvez répertorier :
+ `string`
+ `date`
+ `bool`
+ `byte`
+ `short`
+ `int`
+ `long`
+ `float`
+ `double`

Par exemple, supposons que vous définissiez ce paramètre sur `string` :

```
"Datatypes to exclude from being inserted into Elastic Search Index" : string
```

Dans ce cas, l'enregistrement de flux de la requête de mise à jour Gremlin suivante serait supprimé au lieu d'être intégré dans l'index :

```
g.V("1").property("myStringval", "testvalue")
```

De même, vous pouvez définir le paramètre sur `int` :

```
"Datatypes to exclude from being inserted into Elastic Search Index" : int
```

Dans ce cas, l'enregistrement de flux de la requête de mise à jour SPARQL suivante serait supprimé au lieu d'être intégré dans l'index :

```
PREFIX ex: <http://my/example#>
PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>
INSERT DATA { ex:s1 ex:bob "11"^^xsd:int }.
```

Si vous n'entrez rien dans ce paramètre de CloudFormation modèle, toutes les propriétés dont les valeurs peuvent être converties en toute sécurité en OpenSearch équivalents seront indexées. Les types répertoriés qui ne sont pas pris en charge par le langage de requête seront ignorés.

# Mappage des types de données SPARQL et Gremlin vers OpenSearch
<a name="full-text-search-non-string-indexing-mapping"></a>

Les nouveaux mappages de types de données OpenSearch sont créés en fonction du type de données utilisé dans la propriété ou l'objet. Commen certains champs comprennent des valeurs de différents types, le mappage initial peut exclure certaines valeurs du champ.

Les types de données Neptune correspondent aux OpenSearch types de données comme suit :


| Types SPARQL | Types Gremlin | OpenSearch types | 
| --- | --- | --- | 
|  `XSD:int` `XSD:unsignedInt` `XSD:integer` `XSD:byte` `XSD:unsignedByte` `XSD:short` `XSD:unsignedShort` `XSD:long` `XSD:unsignedLong`  |  `byte` `short` `int` `long`  | `long` | 
|  `XSD:float` `XSD:double` `XSD:decimal`  |  `float` `double`  | `double` | 
| `XSD:boolean` | `bool` | `boolean` | 
|  `XSD:datetime` `XSD:date`  | `date` | `date` | 
|  `XSD:string` `XSD:time`  | `string` | `text` | 
| *Type de données personnalisé* | *S/O* | `text` | 
| *Tout autre type de données* | *S/O* | `text` | 

Par exemple, la requête de mise à jour Gremlin suivante entraîne l'ajout d'un nouveau mappage pour « NewField » OpenSearch, à savoir : `{ "type" : "double" }`

```
g.V("1").property("newField" 10.5)
```

De même, la requête de mise à jour SPARQL suivante entraîne l'ajout d'un nouveau mappage pour « ex:byte », à OpenSearch savoir : `{ "type" : "long" }`

```
PREFIX ex: <http://my/example#>
PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>

INSERT DATA { ex:test ex:byte "123"^^xsd:byte }.
```

**Note**  
Comme vous pouvez le constater, un élément mappé depuis Neptune OpenSearch vers peut se retrouver avec un type de données différent de celui qu'il possède OpenSearch dans Neptune. Cependant, il existe un champ de texte explicite dans OpenSearch « datatype » qui enregistre le type de données que possède l'élément dans Neptune.

# Validation des mappages de données
<a name="full-text-search-data-validation"></a>



Les données sont répliquées OpenSearch depuis Neptune selon le processus suivant :
+ Si un mappage pour le champ en question est déjà présent dans OpenSearch :
  + Si les données peuvent être converties en toute sécurité dans le mappage existant à l'aide des règles de validation des données, stockez le champ dans OpenSearch.
  + Si ce n'est pas le cas, abandonnez l'enregistrement de mise à jour du flux correspondant.
+ S'il n'existe aucun mappage pour le champ en question, recherchez un type de OpenSearch données correspondant au type de données du champ dans Neptune.
  + Si les données de champ peuvent être converties en toute sécurité au OpenSearch type de données à l'aide des règles de validation des données, stockez le nouveau mappage et les nouvelles données de champ dans. OpenSearch
  + Si ce n'est pas le cas, abandonnez l'enregistrement de mise à jour du flux correspondant.

Les valeurs sont validées par rapport à des OpenSearch types équivalents ou à OpenSearch des mappages existants plutôt qu'aux types Neptune. Par exemple, la validation de la valeur `"123"` dans `"123"^^xsd:int` est effectuée par rapport au type `long` plutôt qu'au type `int`.

Bien que Neptune essaie de répliquer toutes les données, dans certains cas OpenSearch, les types de données OpenSearch sont totalement différents de ceux de Neptune, et dans de tels cas, les enregistrements sont ignorés au lieu d'être indexés. OpenSearch

Par exemple, dans Neptune, une propriété peut avoir plusieurs valeurs de types différents, alors que dans OpenSearch un champ, elle doit avoir le même type sur l'ensemble de l'index.

En activant les journaux de débogage, vous pouvez voir quels enregistrements ont été supprimés lors de l'exportation de OpenSearch Neptune vers. Voici un exemple d'entrée du journal de débogage :

```
Dropping Record : Data type not a valid Gremlin type 
<Record>
```

Les types de données sont validés comme suit :
+ **`text`**— Toutes les valeurs de Neptune peuvent être mappées en toute sécurité au texte saisi. OpenSearch
+ **`long`**— Les règles suivantes pour les types de données Neptune s'appliquent lorsque le type de OpenSearch mappage est long (dans les exemples ci-dessous, on suppose qu'il `"testLong"` possède un `long` type de mappage) :
  + `boolean` : non valide, ne peut pas être converti, et l'enregistrement de mise à jour du flux correspondant est supprimé.

    Les exemples de G705 non valides sont les suivants :

    ```
      "testLong" : true.
      "testLong" : false.
    ```

    Voici des exemples de SPARQL non valides :

    ```
      ":testLong" : "true"^^xsd:boolean
      ":testLong" : "false"^^xsd:boolean
    ```
  + `datetime` : non valide, ne peut pas être converti, et l'enregistrement de mise à jour du flux correspondant est supprimé.

    Voici un exemple de G705 non valide :

    ```
      ":testLong" :  datetime('2018-11-04T00:00:00').
    ```

    Voici un exemple de SPARQL non valide :

    ```
      ":testLong" : "2016-01-01"^^xsd:date
    ```
  + `float``double`, ou `decimal` — Si la valeur dans Neptune est un entier pouvant contenir 64 bits, elle est valide et stockée sous forme longue, mais si elle comporte une partie fractionnaire, est a ou an, ou est supérieure à 9 223 372 036 854 775 807 ou inférieure à -9,223 372 036 854 775 808`INF`, elle n'est pas valide et l'enregistrement de mise à jour du flux correspondant est supprimé. OpenSearch `NaN`

    Les exemples valides de G705 sont les suivants :

    ```
      "testLong" :  145.0.
      ":testLong" :  123
      ":testLong" :  -9223372036854775807
    ```

    Voici des exemples de SPARQL valides :

    ```
      ":testLong" : "145.0"^^xsd:float
      ":testLong" :  145.0
      ":testLong" : "145.0"^^xsd:double
      ":testLong" : "145.0"^^xsd:decimal
      ":testLong" : "-9223372036854775807"
    ```

    Les exemples de G705 non valides sont les suivants :

    ```
      "testLong" :  123.45
      ":testLong" :  9223372036854775900
    ```

    Voici des exemples de SPARQL non valides :

    ```
      ":testLong" :  123.45
      ":testLong" :  9223372036854775900
      ":testLong" : "123.45"^^xsd:float
      ":testLong" : "123.45"^^xsd:double
      ":testLong" : "123.45"^^xsd:decimal
    ```
  + `string`— Si la valeur dans Neptune est une représentation sous forme de chaîne d'un entier pouvant être contenu dans un entier de 64 bits, elle est valide et est convertie en entrée. `long` OpenSearch Toute autre valeur de chaîne n'est pas valide pour un `long` mappage Elasticseearch, et l'enregistrement de mise à jour du flux correspondant est supprimé.

    Les exemples valides de G705 sont les suivants :

    ```
      "testLong" :  "123".
      ":testLong" :  "145.0"
      ":testLong" :  "-9223372036854775807"
    ```

    Voici des exemples de SPARQL valides :

    ```
      ":testLong" : "145.0"^^xsd:string
      ":testLong" : "-9223372036854775807"^^xsd:string
    ```

    Les exemples de G705 non valides sont les suivants :

    ```
      "testLong" :  "123.45"
      ":testLong" :  "9223372036854775900"
      ":testLong" :  "abc"
    ```

    Voici des exemples de SPARQL non valides :

    ```
      ":testLong" : "123.45"^^xsd:string
      ":testLong" : "abc"
      ":testLong" : "9223372036854775900"^^xsd:string
    ```
+ **`double`**— Si le type de OpenSearch mappage est le cas`double`, les règles suivantes s'appliquent (ici, le champ « TestDouble » est supposé contenir un `double` mappage OpenSearch) :
  + `boolean` : non valide, ne peut pas être converti, et l'enregistrement de mise à jour du flux correspondant est supprimé.

    Les exemples de G705 non valides sont les suivants :

    ```
      "testDouble" : true.
      "testDouble" : false.
    ```

    Voici des exemples de SPARQL non valides :

    ```
      ":testDouble" : "true"^^xsd:boolean
      ":testDouble" : "false"^^xsd:boolean
    ```
  + `datetime` : non valide, ne peut pas être converti, et l'enregistrement de mise à jour du flux correspondant est supprimé.

    Voici un exemple de G705 non valide :

    ```
      ":testDouble" :  datetime('2018-11-04T00:00:00').
    ```

    Voici un exemple de SPARQL non valide :

    ```
      ":testDouble" : "2016-01-01"^^xsd:date
    ```
  + Virgule flottante `NaN` ou `INF` — Si la valeur dans SPARQL est une valeur à virgule flottante `NaN` ou`INF`, elle n'est pas valide et l'enregistrement de mise à jour du flux correspondant est supprimé.

    Voici des exemples de SPARQL non valides :

    ```
    "  :testDouble" : "NaN"^^xsd:float
      ":testDouble" : "NaN"^^double
      ":testDouble" : "INF"^^double
      ":testDouble" : "-INF"^^double
    ```
  + nombre ou chaîne numérique — Si la valeur dans Neptune est une autre représentation numérique ou sous forme de chaîne numérique d'un nombre qui peut être exprimé en toute sécurité sous la forme d'`double`un a, alors elle est valide et est convertie en entrée. `double` OpenSearch Toute autre valeur de chaîne n'est pas valide pour un OpenSearch `double` mappage et l'enregistrement de mise à jour du flux correspondant est supprimé.

    Les exemples valides de G705 sont les suivants :

    ```
      "testDouble" :  123
      ":testDouble" :  "123"
      ":testDouble" :  145.67
      ":testDouble" :  "145.67"
    ```

    Voici des exemples de SPARQL valides :

    ```
      ":testDouble" :  123.45
      ":testDouble" :  145.0
      ":testDouble" : "123.45"^^xsd:float
      ":testDouble" : "123.45"^^xsd:double
      ":testDouble" : "123.45"^^xsd:decimal
      ":testDouble" : "123.45"^^xsd:string
    ```

    Voici un exemple de G705 non valide :

    ```
      ":testDouble" :  "abc"
    ```

    Voici un exemple de SPARQL non valide :

    ```
      ":testDouble" : "abc"
    ```
+ **`date`**— Si le type de OpenSearch mappage est`date`, Neptune `date` et sa `dateTime` valeur sont valides, de même que toute valeur de chaîne pouvant être analysée avec succès selon un format. `dateTime`

  Les exemples valides dans G705 ou SPARQL sont les suivants :

  ```
    Date(2016-01-01)
    "2016-01-01" "
    2003-09-25T10:49:41"
    "2003-09-25T10:49"
    "2003-09-25T10"
    "20030925T104941-0300"
    "20030925T104941"
    "2003-Sep-25" "
    Sep-25-2003"
    "2003.Sep.25"
    "2003/09/25"
    "2003 Sep 25" "
    Wed, July 10, '96"
    "Tuesday, April 12, 1952 AD 3:30:42pm PST"
    "123"
    "-123"
    "0"
    "-0"
    "123.00"
    "-123.00"
  ```

  Les exemples suivants ne sont pas valides :

  ```
    123.45
    True
    "abc"
  ```

# Exemples de OpenSearch requêtes autres que des chaînes dans Neptune
<a name="full-text-search-non-string-examples"></a>

Neptune ne prend actuellement pas directement en charge les requêtes OpenSearch de plage. Cependant, vous pouvez obtenir le même effet en utilisant la syntaxe Lucene et query-type="query\$1string", comme vous pouvez le voir dans les exemples de requêtes suivants.

## Obtenir tous les sommets de plus de 30 ans et dont le nom commence par « Si »
<a name="full-text-search-non-string-example-1"></a>

Dans Gremlin :

```
g.withSideEffect('Neptune#fts.endpoint', 'http://your-es-endpoint')
 .withSideEffect("Neptune#fts.queryType", "query_string")
 .V().has('*', 'Neptune#fts predicates.age.value:>30 && predicates.name.value:Si*');
```

En SPARQL :

```
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
SELECT * WHERE {
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://localhost:9200' .
    neptune-fts:config neptune-fts:queryType 'query_string' .
    neptune-fts:config neptune-fts:query "predicates.\\*foaf\\*age.value:>30 AND predicates.\\*foaf\\*name.value:Si*" .
    neptune-fts:config neptune-fts:field '*' .
    neptune-fts:config neptune-fts:return ?res .
  }
}
```

Dans ce cas, `"\\*foaf\\*age` est utilisé à la place de l'URI complet par souci de concision. Cette expression régulière récupère tous les champs contenant `foaf` et `age` dans l'URI.

## Obtenir tous les nœuds âgés de 10 à 50 ans et dont le nom a une correspondance floue avec « Ronka »
<a name="full-text-search-non-string-example-2"></a>

Dans Gremlin :

```
g.withSideEffect('Neptune#fts.endpoint', 'http://your-es-endpoint')
 .withSideEffect("Neptune#fts.queryType", "query_string")
 .V().has('*', 'Neptune#fts predicates.age.value:[10 TO 50] AND predicates.name.value:Ronka~');
```

En SPARQL :

```
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
SELECT * WHERE {
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://localhost:9200' .
    neptune-fts:config neptune-fts:queryType 'query_string' .
    neptune-fts:config neptune-fts:query "predicates.\\*foaf\\*age.value:[10 TO 50] AND predicates.\\*foaf\\*name.value:Ronka~" .
    neptune-fts:config neptune-fts:field '*' .
    neptune-fts:config neptune-fts:return ?res .
  }
}
```

## Obtenir tous les nœuds dont l'horodatage remonte aux 25 derniers jours
<a name="full-text-search-non-string-example-3"></a>

Dans Gremlin :

```
g.withSideEffect('Neptune#fts.endpoint', 'http://your-es-endpoint')
 .withSideEffect("Neptune#fts.queryType", "query_string")
 .V().has('*', 'Neptune#fts predicates.timestamp.value:>now-25d');
```

En SPARQL :

```
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
SELECT * WHERE {
SELECT * WHERE {
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://localhost:9200' .
    neptune-fts:config neptune-fts:queryType 'query_string' .
    neptune-fts:config neptune-fts:query "predicates.\\*foaf\\*timestamp.value:>now-25d~" .
    neptune-fts:config neptune-fts:field '*' .
    neptune-fts:config neptune-fts:return ?res .
  }
}
```

## Obtenir tous les nœuds dont l'horodatage correspond à une année ou à un mois donnés
<a name="full-text-search-non-string-example-4"></a>

Dans Gremlin, avec des [expressions mathématiques de date](https://www.elastic.co/guide/en/elasticsearch/reference/7.x/common-options.html#date-math) dans la syntaxe de Lucene, pour décembre 2020 :

```
g.withSideEffect('Neptune#fts.endpoint', 'http://your-es-endpoint')
 .withSideEffect("Neptune#fts.queryType", "query_string")
 .V().has('*', 'Neptune#fts predicates.timestamp.value:>2020-12');
```

Alternative Gremlin :

```
g.withSideEffect('Neptune#fts.endpoint', 'http://your-es-endpoint')
 .withSideEffect("Neptune#fts.queryType", "query_string")
 .V().has('*', 'Neptune#fts predicates.timestamp.value:[2020-12 TO 2021-01]');
```

# Full-text-search exécution de requêtes dans Amazon Neptune
<a name="full-text-search-query-execution"></a>

Dans une requête incluant full-text-search, Neptune essaie de placer les full-text-search appels en premier, avant les autres parties de la requête. Cela permet de réduire le nombre d'appels OpenSearch et, dans la plupart des cas, d'améliorer considérablement les performances. Cependant, il ne s'agit en aucun cas d'une hard-and-fast règle. Dans certaines situations, par exemple, un élément `PatternNode` ou `UnionNode` peut précéder un appel de recherche en texte intégral.

Prenons la requête Gremlin suivante vers une base de données contenant 100 000 instances de `Person` :

```
g.withSideEffect('Neptune#fts.endpoint', 'your-es-endpoint-URL')
 .hasLabel('Person')
 .has('name', 'Neptune#fts marcello~');
```

Si cette requête était exécutée dans l'ordre dans lequel les étapes apparaissent, 100 000 solutions arriveraient OpenSearch, provoquant des centaines d' OpenSearch appels. En fait, Neptune appelle d' OpenSearch abord, puis joint les résultats aux résultats de Neptune. Dans la plupart des cas, cela est beaucoup plus rapide que l'exécution de la requête dans l'ordre d'origine.

Vous pouvez empêcher cette réorganisation de l'exécution de l'étape de requête à l'aide de l'[indicateur de requête noReordering](gremlin-query-hints-noReordering.md) :

```
g.withSideEffect('Neptune#fts.endpoint', 'your-es-endpoint-URL')
 .withSideEffect('Neptune#noReordering', true)
 .hasLabel('Person')
 .has('name', 'Neptune#fts marcello~');
```

Dans ce second cas, l'étape `.hasLabel` est exécutée en premier et l'étape `.has('name', 'Neptune#fts marcello~')` en deuxième.

Pour un autre exemple, prenez une requête SPARQL par rapport au même type de données :

```
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
SELECT ?person WHERE {
  ?person rdf:type foaf:Person .
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://your-es-endpoint.com' .
    neptune-fts:config neptune-fts:field foaf:name .
    neptune-fts:config neptune-fts:query 'mike' .
    neptune-fts:config neptune-fts:return ?person .
  }
}
```

Ici encore, Neptune exécute d'abord la partie `SERVICE` de la requête, puis joint les résultats aux données `Person`. Vous pouvez supprimer ce comportement en utilisant l'[indicateur de requête joinOrder](sparql-query-hints-joinOrder.md) :

```
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
SELECT ?person WHERE {
  hint:Query hint:joinOrder "Ordered" .
  ?person rdf:type foaf:Person .
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://your-es-endpoint.com' .
    neptune-fts:config neptune-fts:field foaf:name .
    neptune-fts:config neptune-fts:query 'mike' .
    neptune-fts:config neptune-fts:return ?person .
  }
}
```

De nouveau, dans la deuxième requête, les parties sont exécutées dans l'ordre où elles apparaissent dans la requête.

**Note**  
 Interroger un alias OpenSearch sur un index, au lieu d'interroger directement un index OpenSearch, peut produire des résultats incorrects. Vous devez interroger directement l'index opensearch et non l'alias. 

# Exemples de requêtes SPARQL utilisant la recherche en texte intégral dans Neptune
<a name="full-text-search-sparql-examples"></a>

Voici quelques exemples de requêtes SPARQL qui utilisent la recherche en texte intégral dans Amazon Neptune.

## Exemple de requête de correspondance SPARQL
<a name="full-text-search-sparql-match"></a>

```
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
SELECT * WHERE {
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://your-es-endpoint.com' .
    neptune-fts:config neptune-fts:queryType 'match' .
    neptune-fts:config neptune-fts:field foaf:name .
    neptune-fts:config neptune-fts:query 'michael' .
    neptune-fts:config neptune-fts:return ?res .
  }
}
```

## Exemple de requête de préfixe SPARQL
<a name="full-text-search-sparql-prefix"></a>

```
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
SELECT * WHERE {
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://your-es-endpoint.com' .
    neptune-fts:config neptune-fts:queryType 'prefix' .
    neptune-fts:config neptune-fts:field foaf:name .
    neptune-fts:config neptune-fts:query 'mich' .
    neptune-fts:config neptune-fts:return ?res .
  }
}
```

## Exemple de requête partielle SPARQL
<a name="full-text-search-sparql-fuzzy"></a>

```
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
SELECT * WHERE {
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://your-es-endpoint.com' .
    neptune-fts:config neptune-fts:queryType 'fuzzy' .
    neptune-fts:config neptune-fts:field foaf:name .
    neptune-fts:config neptune-fts:query 'mikael' .
    neptune-fts:config neptune-fts:return ?res .
  }
}
```

## Exemple de requête de terme SPARQL
<a name="full-text-search-sparql-term"></a>

```
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
SELECT * WHERE {
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://your-es-endpoint.com' .
    neptune-fts:config neptune-fts:queryType 'term' .
    neptune-fts:config neptune-fts:field foaf:name .
    neptune-fts:config neptune-fts:query 'Dr. Kunal' .
    neptune-fts:config neptune-fts:return ?res .
  }
}
```

## Exemple de requête query\$1string SPARQL
<a name="full-text-search-sparql-query_string"></a>

Cette requête spécifie plusieurs champs.

```
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
SELECT * WHERE {
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://your-es-endpoint.com' .
    neptune-fts:config neptune-fts:queryType 'query_string' .
    neptune-fts:config neptune-fts:query 'mikael~ OR rondelli' .
    neptune-fts:config neptune-fts:field foaf:name .
    neptune-fts:config neptune-fts:field foaf:surname .
    neptune-fts:config neptune-fts:return ?res .
  }
}
```

## Exemple de requête simple\$1query\$1string SPARQL
<a name="full-text-search-sparql-simple"></a>

La requête suivante spécifie les champs utilisant le caractère générique (« \$1 »).

```
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
SELECT * WHERE {
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://your-es-endpoint.com' .
    neptune-fts:config neptune-fts:queryType 'simple_query_string' .
    neptune-fts:config neptune-fts:query 'mikael~ | rondelli' .
    neptune-fts:config neptune-fts:field '*' .
    neptune-fts:config neptune-fts:return ?res .
  }
}
```

## Exemple de requête de tri par champ de chaîne SPARQL
<a name="full-text-search-sparql-sort-by-field"></a>

```
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
SELECT * WHERE {
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://your-es-endpoint' .
    neptune-fts:config neptune-fts:queryType 'query_string' .
    neptune-fts:config neptune-fts:query 'mikael~ | rondelli' .
    neptune-fts:config neptune-fts:field foaf:name .
    neptune-fts:config neptune-fts:sortOrder 'asc' .
    neptune-fts:config neptune-fts:sortBy foaf:name .
    neptune-fts:config neptune-fts:return ?res .
  }
}
```

## Exemple de requête de de tri de champ hors chaîne SPARQL
<a name="full-text-search-sparql-sort-by-field"></a>

```
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
SELECT * WHERE {
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://your-es-endpoint' .
    neptune-fts:config neptune-fts:queryType 'query_string' .
    neptune-fts:config neptune-fts:query 'mikael~ | rondelli' .
    neptune-fts:config neptune-fts:field foaf:name.value .
    neptune-fts:config neptune-fts:sortOrder 'asc' .
    neptune-fts:config neptune-fts:sortBy dc:date.value .
    neptune-fts:config neptune-fts:return ?res .
  }
}
```

## Exemple de requête de tri par ID SPARQL
<a name="full-text-search-sparql-sort-by-id"></a>

```
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
SELECT * WHERE {
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://your-es-endpoint' .
    neptune-fts:config neptune-fts:queryType 'query_string' .
    neptune-fts:config neptune-fts:query 'mikael~ | rondelli' .
    neptune-fts:config neptune-fts:field foaf:name .
    neptune-fts:config neptune-fts:sortOrder 'asc' .
    neptune-fts:config neptune-fts:sortBy 'Neptune#fts.entity_id' .
    neptune-fts:config neptune-fts:return ?res .
  }
}
```

## Exemple de requête de tri par étiquette SPARQL
<a name="full-text-search-sparql-sort-by-label"></a>

```
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
SELECT * WHERE {
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://your-es-endpoint' .
    neptune-fts:config neptune-fts:queryType 'query_string' .
    neptune-fts:config neptune-fts:query 'mikael~ | rondelli' .
    neptune-fts:config neptune-fts:field foaf:name .
    neptune-fts:config neptune-fts:sortOrder 'asc' .
    neptune-fts:config neptune-fts:sortBy 'Neptune#fts.entity_type' .
    neptune-fts:config neptune-fts:return ?res .
  }
}
```

## Exemple de requête de tri par doc\$1type SPARQL
<a name="full-text-search-sparql-sort-by-doc-type"></a>

```
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
SELECT * WHERE {
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://your-es-endpoint' .
    neptune-fts:config neptune-fts:queryType 'query_string' .
    neptune-fts:config neptune-fts:query 'mikael~ | rondelli' .
    neptune-fts:config neptune-fts:field foaf:name .
    neptune-fts:config neptune-fts:sortOrder 'asc' .
    neptune-fts:config neptune-fts:sortBy 'Neptune#fts.document_type' .
    neptune-fts:config neptune-fts:return ?res .
  }
}
```

## Exemple d'utilisation de la syntaxe Lucene en SPARQL
<a name="full-text-search-sparql-lucene-syntax"></a>

La syntaxe Lucene n'est prise en charge que pour les `query_string` requêtes dans. OpenSearch

```
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX neptune-fts: <http://aws.amazon.com/neptune/vocab/v01/services/fts#>
SELECT * WHERE {
  SERVICE neptune-fts:search {
    neptune-fts:config neptune-fts:endpoint 'http://your-es-endpoint' .
    neptune-fts:config neptune-fts:queryType 'query_string' .
    neptune-fts:config neptune-fts:queryType 'query_string' .
    neptune-fts:config neptune-fts:query 'predicates.\\foaf\\name.value:micheal AND predicates.\\foaf\\surname.value:sh' .
    neptune-fts:config neptune-fts:field ‘’ .
    neptune-fts:config neptune-fts:return ?res .
  }
}
```

# Utilisation de la recherche en texte intégral Neptune dans des requêtes Gremlin
<a name="full-text-search-gremlin"></a>

`NeptuneSearchStep` permet les requêtes de recherche en texte intégral pour la partie d'une traversée Gremlin qui n'est pas convertie en étapes Neptune. Prenons l'exemple d'une requête similaire à la suivante.

```
g.withSideEffect("Neptune#fts.endpoint", "your-es-endpoint-URL")
  .V()
      .tail(100)
      .has("name", "Neptune#fts mark*")            <== # Limit the search on name
```

Cette requête est convertie en traversée optimisée suivante dans Neptune.

```
Neptune steps:
[
    NeptuneGraphQueryStep(Vertex) {
        JoinGroupNode {
            PatternNode[(?1, <~label>, ?2, <~>) . project distinct ?1 .], {estimatedCardinality=INFINITY}
        }, annotations={path=[Vertex(?1):GraphStep], maxVarId=4}
    },
    NeptuneTraverserConverterStep
]
+ not converted into Neptune steps: [NeptuneTailGlobalStep(100), NeptuneTinkerpopTraverserConverterStep, NeptuneSearchStep {
    JoinGroupNode {
        SearchNode[(idVar=?3, query=mark*, field=name) . project ask .], {endpoint=your-OpenSearch-endpoint-URL}
    }
    JoinGroupNode {
        SearchNode[(idVar=?3, query=mark*, field=name) . project ask .], {endpoint=your-OpenSearch-endpoint-URL}
    }
}]
```

Les exemples suivants sont des requêtes Gremlin par rapport aux données sur les routes aériennes :

## Requête de base Gremlin `match` insensible à la casse
<a name="full-text-search-gremlin-basic-match"></a>

```
g.withSideEffect("Neptune#fts.endpoint",
                 "your-OpenSearch-endpoint-URL")
  .withSideEffect('Neptune#fts.queryType', 'match')
  .V().has("city","Neptune#fts dallas")

==>v[186]
==>v[8]
```

## Requête Gremlin `match`
<a name="full-text-search-gremlin-match"></a>

```
g.withSideEffect("Neptune#fts.endpoint",
                 "your-OpenSearch-endpoint-URL")
  .withSideEffect('Neptune#fts.queryType', 'match')
  .V().has("city","Neptune#fts southampton")
     .local(values('code','city').fold())
     .limit(5)

==>[SOU, Southampton]
```

## Requête Gremlin `fuzzy`
<a name="full-text-search-gremlin-fuzzy"></a>

```
g.withSideEffect("Neptune#fts.endpoint",
                 "your-OpenSearch-endpoint-URL")
  .V().has("city","Neptune#fts allas~").values('city').limit(5)

==>Dallas
==>Dallas
==>Walla Walla
==>Velas
==>Altai
```

## Requête approximative Gremlin `query_string`
<a name="full-text-search-gremlin-query_string-fuzzy"></a>

```
g.withSideEffect("Neptune#fts.endpoint",
                 "your-OpenSearch-endpoint-URL")
  .withSideEffect('Neptune#fts.queryType', 'query_string')
  .V().has("city","Neptune#fts allas~").values('city').limit(5)

==>Dallas
==>Dallas
```

## Requête d'expression régulière Gremlin `query_string`
<a name="full-text-search-gremlin-query_string-regex"></a>

```
g.withSideEffect("Neptune#fts.endpoint",
                 "your-OpenSearch-endpoint-URL")
  .withSideEffect('Neptune#fts.queryType', 'query_string')
  .V().has("city","Neptune#fts /[dp]allas/").values('city').limit(5)

==>Dallas
==>Dallas
```

## Requête hybride Gremlin
<a name="full-text-search-gremlin-hybrid"></a>

Cette requête utilise un index interne Neptune et l' OpenSearch index de la même requête.

```
g.withSideEffect("Neptune#fts.endpoint",
                 "your-OpenSearch-endpoint-URL")
  .V().has("region","GB-ENG")
      .has('city','Neptune#fts L*')
      .values('city')
      .dedup()
      .limit(10)

==>London
==>Leeds
==>Liverpool
==>Land's End
```

## Exemple de recherche en texte intégral simple Gremlin
<a name="full-text-search-gremlin-example"></a>

```
g.withSideEffect("Neptune#fts.endpoint",
                 "your-OpenSearch-endpoint-URL")
  .V().has('desc','Neptune#fts regional municipal')
      .local(values('code','desc').fold())
      .limit(100)

==>[HYA, Barnstable Municipal Boardman Polando Field]
==>[SPS, Sheppard Air Force Base-Wichita Falls Municipal Airport]
==>[ABR, Aberdeen Regional Airport]
==>[SLK, Adirondack Regional Airport]
==>[BFD, Bradford Regional Airport]
==>[EAR, Kearney Regional Airport]
==>[ROT, Rotorua Regional Airport]
==>[YHD, Dryden Regional Airport]
==>[TEX, Telluride Regional Airport]
==>[WOL, Illawarra Regional Airport]
==>[TUP, Tupelo Regional Airport]
==>[COU, Columbia Regional Airport]
==>[MHK, Manhattan Regional Airport]
==>[BJI, Bemidji Regional Airport]
==>[HAS, Hail Regional Airport]
==>[ALO, Waterloo Regional Airport]
==>[SHV, Shreveport Regional Airport]
==>[ABI, Abilene Regional Airport]
==>[GIZ, Jizan Regional Airport]
==>[USA, Concord Regional Airport]
==>[JMS, Jamestown Regional Airport]
==>[COS, City of Colorado Springs Municipal Airport]
==>[PKB, Mid Ohio Valley Regional Airport]
```

## Requête Gremlin utilisant `query_string` avec les opérateurs '\$1' et '-'
<a name="full-text-search-gremlin-query_string-plus-minus"></a>

Bien que le type de requête `query_string` soit beaucoup moins indulgent que le type `simple_query_string` par défaut, il permet des requêtes plus précises. La première requête ci-dessous utilise `query_string`, tandis que la seconde utilise la valeur par défaut `simple_query_string` :

```
g.withSideEffect("Neptune#fts.endpoint",
                 "your-OpenSearch-endpoint-URL")
  .withSideEffect('Neptune#fts.queryType', 'query_string')
 . V().has('desc','Neptune#fts +London -(Stansted|Gatwick)')
      .local(values('code','desc').fold())
      .limit(10)

==>[LHR, London Heathrow]
==>[YXU, London Airport]
==>[LTN, London Luton Airport]
==>[SEN, London Southend Airport]
==>[LCY, London City Airport]
```

Notez comment `simple_query_string` dans les exemples ci-dessous ignore tranquillement les opérateurs « \$1 » et « - » :

```
g.withSideEffect("Neptune#fts.endpoint",
                 "your-OpenSearch-endpoint-URL")
  .V().has('desc','Neptune#fts +London -(Stansted|Gatwick)')
      .local(values('code','desc').fold())
      .limit(10)

==>[LHR, London Heathrow]
==>[YXU, London Airport]
==>[LGW, London Gatwick]
==>[STN, London Stansted Airport]
==>[LTN, London Luton Airport]
==>[SEN, London Southend Airport]
==>[LCY, London City Airport]
==>[SKG, Thessaloniki Macedonia International Airport]
==>[ADB, Adnan Menderes International Airport]
==>[BTV, Burlington International Airport]
```

```
g.withSideEffect("Neptune#fts.endpoint",
                 "your-OpenSearch-endpoint-URL")
  .withSideEffect('Neptune#fts.queryType', 'query_string')
  .V().has('desc','Neptune#fts +(regional|municipal) -(international|bradford)')
      .local(values('code','desc').fold())
      .limit(10)

==>[CZH, Corozal Municipal Airport]
==>[MMU, Morristown Municipal Airport]
==>[YBR, Brandon Municipal Airport]
==>[RDD, Redding Municipal Airport]
==>[VIS, Visalia Municipal Airport]
==>[AIA, Alliance Municipal Airport]
==>[CDR, Chadron Municipal Airport]
==>[CVN, Clovis Municipal Airport]
==>[SDY, Sidney Richland Municipal Airport]
==>[SGU, St George Municipal Airport]
```

## Requête Gremlin `query_string` avec les opérateurs `AND` et `OR`
<a name="full-text-search-gremlin-query_string-AND-OR"></a>

```
g.withSideEffect("Neptune#fts.endpoint",
                 "your-OpenSearch-endpoint-URL")
  .withSideEffect('Neptune#fts.queryType', 'query_string')
  .V().has('desc','Neptune#fts (St AND George) OR (St AND Augustin)')
      .local(values('code','desc').fold())
      .limit(10)

==>[YIF, St Augustin Airport]
==>[STG, St George Airport]
==>[SGO, St George Airport]
==>[SGU, St George Municipal Airport]
```

## Requête Gremlin `term`
<a name="full-text-search-gremlin-term"></a>

```
g.withSideEffect("Neptune#fts.endpoint",
                 "your-OpenSearch-endpoint-URL")
  .withSideEffect('Neptune#fts.queryType', 'term')
  .V().has("SKU","Neptune#fts ABC123DEF9")
      .local(values('code','city').fold())
      .limit(5)

==>[AUS, Austin]
```

## Requête Gremlin `prefix`
<a name="full-text-search-gremlin-prefix"></a>

```
g.withSideEffect("Neptune#fts.endpoint",
                 "your-OpenSearch-endpoint-URL")
  .withSideEffect('Neptune#fts.queryType', 'prefix')
  .V().has("icao","Neptune#fts ka")
      .local(values('code','icao','city').fold())
      .limit(5)

==>[AZO, KAZO, Kalamazoo]
==>[APN, KAPN, Alpena]
==>[ACK, KACK, Nantucket]
==>[ALO, KALO, Waterloo]
==>[ABI, KABI, Abilene]
```

## Utilisation de la syntaxe Lucene dans Neptune Gremlin
<a name="full-text-search-gremlin-lucene"></a>

Dans Neptune Gremlin, vous pouvez également écrire des requêtes très puissantes en utilisant la syntaxe de requête Lucene. Notez que la syntaxe Lucene n'est prise en charge que pour les `query_string` requêtes dans. OpenSearch

Supposons les données suivantes :

```
g.addV("person")
        .property(T.id, "p1")
        .property("name", "simone")
        .property("surname", "rondelli")

g.addV("person")
        .property(T.id, "p2")
        .property("name", "simone")
        .property("surname", "sengupta")

g.addV("developer")
        .property(T.id, "p3")
        .property("name", "simone")
        .property("surname", "rondelli")
```

En utilisant la syntaxe Lucene, qui est appelée lorsque `queryType` est `query_string`, vous pouvez rechercher ces données par nom et prénom comme suit :

```
g.withSideEffect("Neptune#fts.endpoint", "es_endpoint")
    .withSideEffect("Neptune#fts.queryType", "query_string")
    .V()
    .has("*", "Neptune#fts predicates.name.value:simone AND predicates.surname.value:rondelli")

==> v[p1], v[p3]
```

Notez qu'au cours de l'étape `has()` ci-dessus, le champ est remplacé par `"*"`. En fait, toute valeur placée là est remplacée par les champs auxquels vous accédez dans la requête. Vous accédez au champ de nom en utilisant `predicates.name.value,`, car le modèle de données est structuré de cette façon.

Vous pouvez effectuer une recherche par nom, prénom et étiquette, comme suit :

```
g.withSideEffect("Neptune#fts.endpoint", getEsEndpoint())
    .withSideEffect("Neptune#fts.queryType", "query_string")
    .V()
    .has("*", "Neptune#fts predicates.name.value:simone AND predicates.surname.value:rondelli AND entity_type:person")

==> v[p1]
```

L'étiquette est accessible en utilisant `entity_type`, encore une fois parce que le modèle de données est structuré de cette façon.

Vous pouvez également inclure des conditions d'imbrication :

```
g.withSideEffect("Neptune#fts.endpoint", getEsEndpoint())
    .withSideEffect("Neptune#fts.queryType", "query_string")
    .V()
    .has("*", "Neptune#fts (predicates.name.value:simone AND predicates.surname.value:rondelli AND entity_type:person) OR predicates.surname.value:sengupta")

==> v[p1], v[p2]
```

## Insertion d'un graphe moderne TinkerPop
<a name="full-text-search-gremlin-modern-tinkerpop-graph"></a>

```
g.addV('person').property(T.id, '1').property('name', 'marko').property('age', 29)
 .addV('personr').property(T.id, '2').property('name', 'vadas').property('age', 27)
 .addV('software').property(T.id, '3').property('name', 'lop').property('lang', 'java')
 .addV('person').property(T.id, '4').property('name', 'josh').property('age', 32)
 .addV('software').property(T.id, '5').property('name', 'ripple').property('lang', 'java')
 .addV('person').property(T.id, '6').property('name', 'peter').property('age', 35)

g.V('1').as('a').V('2').as('b').addE('knows').from('a').to('b').property('weight', 0.5f).property(T.id, '7')
 .V('1').as('a').V('3').as('b').addE('created').from('a').to('b').property('weight', 0.4f).property(T.id, '9')
 .V('4').as('a').V('3').as('b').addE('created').from('a').to('b').property('weight', 0.4f).property(T.id, '11')
 .V('4').as('a').V('5').as('b').addE('created').from('a').to('b').property('weight', 1.0f).property(T.id, '10')
 .V('6').as('a').V('3').as('b').addE('created').from('a').to('b').property('weight', 0.2f).property(T.id, '12')
 .V('1').as('a').V('4').as('b').addE('knows').from('a').to('b').property('weight', 1.0f).property(T.id, '8')
```

## Exemple de valeur de tri par champ de chaîne
<a name="full-text-search-gremlin-sort-by-string"></a>

```
g.withSideEffect("Neptune#fts.endpoint", "your-OpenSearch-endpoint-URL")
 .withSideEffect('Neptune#fts.queryType', 'query_string')
 .withSideEffect('Neptune#fts.sortOrder', 'asc')
 .withSideEffect('Neptune#fts.sortBy', 'name')
 .V().has('name', 'Neptune#fts marko OR vadas OR ripple')
```

## Exemple de valeur de tri par champ hors chaîne
<a name="full-text-search-gremlin-sort-by-non-string"></a>

```
g.withSideEffect("Neptune#fts.endpoint", "your-OpenSearch-endpoint-URL")
 .withSideEffect('Neptune#fts.queryType', 'query_string')
 .withSideEffect('Neptune#fts.sortOrder', 'asc')
 .withSideEffect('Neptune#fts.sortBy', 'age.value')
 .V().has('name', 'Neptune#fts marko OR vadas OR ripple')
```

## Exemple de valeur de tri par champ d'ID
<a name="full-text-search-gremlin-sort-by-id"></a>

```
g.withSideEffect("Neptune#fts.endpoint", "your-OpenSearch-endpoint-URL")
.withSideEffect('Neptune#fts.queryType', 'query_string')
.withSideEffect('Neptune#fts.sortOrder', 'asc')
.withSideEffect('Neptune#fts.sortBy', 'Neptune#fts.entity_id')
.V().has('name', 'Neptune#fts marko OR vadas OR ripple')
```

## Exemple de valeur de tri par champ d'étiquette
<a name="full-text-search-gremlin-sort-by-label"></a>

```
g.withSideEffect("Neptune#fts.endpoint", "your-OpenSearch-endpoint-URL")
 .withSideEffect('Neptune#fts.queryType', 'query_string')
 .withSideEffect('Neptune#fts.sortOrder', 'asc')
 .withSideEffect('Neptune#fts.sortBy', 'Neptune#fts.entity_type')
 .V().has('name', 'Neptune#fts marko OR vadas OR ripple')
```

## Exemple de valeur de tri par champ `document_type`
<a name="full-text-search-gremlin-sort-by-document_type"></a>

```
g.withSideEffect("Neptune#fts.endpoint", "your-OpenSearch-endpoint-URL")
 .withSideEffect('Neptune#fts.queryType', 'query_string')
 .withSideEffect('Neptune#fts.sortOrder', 'asc')
 .withSideEffect('Neptune#fts.sortBy', 'Neptune#fts.document_type')
 .V().has('name', 'Neptune#fts marko OR vadas OR ripple')
```

# Résolution des problèmes liés à la recherche Neptune en texte intégral
<a name="streams-consumer-troubleshooting"></a>

**Note**  
Si vous avez activé le [contrôle d'accès détaillé](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html) sur votre OpenSearch cluster, vous devez également [activer l'authentification IAM dans votre base](iam-auth-enable.md) de données Neptune.

Pour diagnostiquer les problèmes liés à la réplication depuis Neptune vers OpenSearch, consultez les CloudWatch journaux de la fonction Lambda de votre sondeur. Ces journaux fournissent des informations détaillées sur le nombre d'enregistrements lus dans le flux et sur le nombre d'enregistrements répliqués avec succès. OpenSearch

Vous pouvez également modifier le niveau LOGGING de la fonction Lambda en modifiant la variable d'environnement `LoggingLevel`.

**Note**  
Lorsque cette option est `LoggingLevel` définie sur`DEBUG`, vous pouvez afficher des informations supplémentaires, telles que les enregistrements de flux supprimés et la raison pour laquelle chacun a été supprimé, tout en répliquant les données StreamPoller de OpenSearch Neptune vers. Cette approche peut être utile si vous constatez qu'il vous manque des enregistrements.

L'application Neptune Streams destinée aux consommateurs publie deux indicateurs CloudWatch qui peuvent également vous aider à diagnostiquer les problèmes :
+ `StreamRecordsProcessed` : nombre d'enregistrements traités par l'application par unité de temps. Utile pour suivre le taux d'exécution de l'application.
+ `StreamLagTime` : différence de temps, en millisecondes, entre l'heure actuelle et l'heure de validation d'un enregistrement de flux en cours de traitement. Cette métrique montre à quel point l'application destinée aux consommateurs est en retard.

En outre, toutes les métriques liées au processus de réplication sont exposées dans un tableau de bord portant le même nom que celui `ApplicationName` fourni lorsque vous avez instancié l'application à l'aide du CloudWatch modèle. CloudWatch 

Vous pouvez également choisir de créer une CloudWatch alarme qui se déclenche chaque fois que le sondage échoue plus de deux fois de suite. Pour ce faire, définissez le champ `CreateCloudWatchAlarm` sur `true` lorsque vous instanciez l'application. Indiquez ensuite les adresses e-mail auxquelles vous souhaitez recevoir une notification lorsque l'alarme est déclenchée.

## Dépannage d'un processus qui échoue lors de la lecture d'enregistrements à partir du flux
<a name="streams-consumer-troubleshooting-reads"></a>

Si un processus échoue lors de la lecture d'enregistrements à partir du flux, assurez-vous que vous disposez des éléments suivants :
+ Le flux est activé sur votre cluster.
+ Le point de terminaison de flux Neptune est au format correct :
  + Pour Gremlin ou openCypher : `https://your cluster endpoint:your cluster port/propertygraph/stream` ou son alias, `https://your cluster endpoint:your cluster port/pg/stream`
  + Pour SPARQL : `https://your cluster endpoint:your cluster port/sparql/stream`

  
+ Le point de terminaison DynamoDB est configuré pour votre VPC.
+ Le point de terminaison de surveillance est configuré pour vos sous-réseaux VPC.

## Résolution des problèmes liés à l'échec d'un processus lors de l'écriture de données dans OpenSearch
<a name="streams-consumer-troubleshooting-writes"></a>

Si un processus échoue lors de l'écriture d'enregistrements dans OpenSearch, assurez-vous que vous disposez des éléments suivants :
+ Votre version d'Elasticsearch est 7.1 ou supérieure, ou Opensearch 2.3 ou version ultérieure.
+ OpenSearch est accessible depuis la fonction Poller Lambda de votre VPC.
+ La politique de sécurité attachée à OpenSearch autorise les HTTP/HTTPS demandes entrantes.

## Résolution des out-of-sync problèmes entre Neptune et une configuration OpenSearch de réplication existante
<a name="streams-consumer-troubleshooting-sync-issues"></a>

Vous pouvez suivre les étapes ci-dessous pour synchroniser à nouveau une base de données et un OpenSearch domaine Neptune avec les données les plus récentes en cas de out-of-sync problèmes entre eux résultant d'une corruption de données `ExpiredStreamException` ou d'une corruption de données.

Notez que cette approche supprime toutes les données du OpenSearch domaine et les resynchronise à partir de l'état actuel de la base de données Neptune. Aucune donnée n'a donc besoin d'être rechargée dans la base de données Neptune.

1. Désactivez le processus de réplication comme décrit dans [Désactivation (suspension) du processus d'interrogateur de flux](full-text-search-pause-poller.md).

1. Supprimez l'index Neptune du OpenSearch domaine à l'aide de la commande suivante :

   ```
   curl -X DELETE "(your OpenSearch endpoint)/amazon_neptune"
   ```

1. Créez un clone de la base de données (voir [Clonage de base de données dans Neptune](manage-console-cloning.md)).

1. Obtenez les derniers `eventID` des flux de la base de données clonée en exécutant une commande de ce type sur le point de terminaison de l'API Streams (voir [Appel de l'API REST Neptune Streams](streams-using-api-call.md) pour plus d'informations) :

   ```
   curl "https://(your neptune endpoint):(port)/(propertygraph or sparql)/stream?iteratorType=LATEST"
   ```

   Notez les valeurs des champs `commitNum` et `opNum` dans l'objet `lastEventId` de la réponse.

1. Utilisez l'[export-neptune-to-elasticsearch](https://github.com/awslabs/amazon-neptune-tools/tree/master/export-neptune-to-elasticsearch)outil sur github pour effectuer une synchronisation unique entre la base de données clonée et le OpenSearch domaine.

1. Accédez à la table DynamoDB correspondant à la pile de réplication. Le nom de la table sera le **nom de l'application** que vous avez spécifié dans le CloudFormation modèle (le nom par défaut est`NeptuneStream`) avec un `-LeaseTable` suffixe. En d'autres termes, le nom de la table par défaut sera `NeptuneStream-LeaseTable`.

   Vous pouvez explorer les lignes de la table en les analysant, car il ne devrait y avoir qu'une seule ligne. Apportez les modifications suivantes en utilisant les valeurs `commitNum` et `opNum` que vous avez enregistrées ci-dessus :
   + Remplacez la valeur du champ `checkpoint` dans la table par la valeur dont vous avez pris note pour `commitNum`.
   + Remplacez la valeur du champ `checkpointSubSequenceNumber` dans la table par la valeur dont vous avez pris note pour `opNum`.

1. Réactivez le processus de réplication comme décrit dans [Réactivation du processus d'interrogateur de flux](full-text-search-re-enable-poller.md).

1. Supprimez la base de données clonée et la CloudFormation pile créée pour l'`export-neptune-to-elasticsearch`outil.