

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Búsqueda de texto completo en Amazon Neptune mediante Amazon Service OpenSearch
<a name="full-text-search"></a>

Neptune se integra con [Amazon OpenSearch Service (OpenSearch Servicio)](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/) para admitir la búsqueda de texto completo en las consultas de Gremlin y SPARQL.

A partir de la [versión 1.3.0.0 del motor](engine-releases-1.3.0.0.md), Amazon Neptune admite el uso de [ OpenSearch Amazon Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless.html) Serverless para la búsqueda de texto completo en consultas de Gremlin y SPARQL.

**nota**  
Al integrarse con Amazon OpenSearch Service, Neptune requiere la versión 7.1 o superior de Elasticsearch y funciona con las versiones OpenSearch 2.3, 2.5 y superiores. [Neptune también funciona con OpenSearch Serverless.](full-text-search-serverless.md)

Puede usar Neptune con un clúster de OpenSearch servicios existente que se haya rellenado de acuerdo con. [Modelo de datos de Neptune para datos de OpenSearch](full-text-search-model.md) O bien, puede crear un dominio OpenSearch de servicio vinculado a Neptune mediante una AWS CloudFormation pila.

**importante**  
El proceso de Neptune a OpenSearch replicación que se describe aquí no replica los nodos en blanco. Es importante tener en cuenta esta limitación.  
Además, si habilita un [control de acceso detallado](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html) en su OpenSearch clúster, también debe [habilitar la autenticación de IAM en](iam-auth-enable.md) su base de datos de Neptune.

![\[Diseño de la arquitectura del sondeador de flujo de búsqueda abierto de Neptune.\]](http://docs.aws.amazon.com/es_es/neptune/latest/userguide/images/poller-architecture.PNG)


**Topics**
+ [Neptune-to-OpenSearchReplicación de Amazon](full-text-search-cfn-setup.md)
+ [Replicación a OpenSearch servidores sin servidor](full-text-search-serverless.md)
+ [Consultas desde un OpenSearch clúster con control de acceso detallado (FGAC) habilitado](full-text-search-fgac.md)
+ [Uso de la sintaxis de consulta de Apache Lucene en las consultas de búsqueda de texto completo de Neptune](full-text-search-lucene.md)
+ [Modelo de datos de Neptune para datos de OpenSearch](full-text-search-model.md)
+ [Parámetros de búsqueda de texto completo de Neptune](full-text-search-parameters.md)
+ [Indexación de OpenSearch sin cadenas en Amazon Neptune](full-text-search-non-string-indexing.md)
+ [Full-text-search ejecución de consultas en Amazon Neptune](full-text-search-query-execution.md)
+ [Consultas de SPARQL de ejemplo mediante la búsqueda de texto completo en Neptune](full-text-search-sparql-examples.md)
+ [Uso de la búsqueda de texto completo de Neptune en las consultas de Gremlin](full-text-search-gremlin.md)
+ [Solución de problemas de búsqueda de texto completo de Neptune](streams-consumer-troubleshooting.md)

# Neptune-to-OpenSearchReplicación de Amazon
<a name="full-text-search-cfn-setup"></a>

Amazon Neptune admite la búsqueda de texto completo en las consultas de Gremlin y SPARQL mediante Amazon Service (Servicio). OpenSearch OpenSearch Puede usar una AWS CloudFormation pila para vincular un dominio OpenSearch de servicio a Neptune. La CloudFormation plantilla crea una instancia de aplicación para consumidores de transmisiones que proporciona replicación. Neptune-to-OpenSearch

Antes de empezar, necesita un clúster de base de datos de Neptune existente con transmisiones habilitadas para que sirva como origen y un dominio de OpenSearch servicio que sirva como destino de la replicación.

Si ya tiene un dominio de OpenSearch servicio de destino al que Lambda pueda acceder en la VPC en la que se encuentra el clúster de base de datos de Neptune, la plantilla puede usarlo. De lo contrario, es necesario crear una nueva.

**nota**  
El OpenSearch clúster y la función Lambda que cree deben estar ubicados en la misma VPC que el clúster de base de datos de Neptune, y el clúster OpenSearch debe estar configurado en modo VPC (no en modo Internet).

Le recomendamos que utilice una instancia de Neptune recién creada para usarla con OpenSearch Service. Si utilizas una instancia existente que ya contiene datos, debes realizar una sincronización de datos del OpenSearch Servicio antes de realizar consultas o podría haber inconsistencias en los datos. Este GitHub proyecto proporciona un ejemplo de cómo realizar la sincronización: [Exportar Neptuno a 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).

**importante**  
Al integrarse con Amazon OpenSearch Service, Neptune requiere la versión 7.1 o superior de Elasticsearch y funciona con las versiones OpenSearch 2.3, 2.5 y futuras de Opensearch compatibles.

**nota**  
A partir de la [versión 1.3.0.0 del motor](engine-releases-1.3.0.0.md), Amazon Neptune admite el uso de [ OpenSearch Amazon Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless.html) Serverless para la búsqueda de texto completo en consultas de Gremlin y SPARQL.

**Topics**
+ [Uso de AWS CloudFormation una plantilla para iniciar la replicación Neptune-to-OpenSearch](full-text-search-cfn-create.md)
+ [Habilitar la búsqueda de texto completo en las bases de datos de Neptune existentes](full-text-search-cfn-enabling.md)
+ [Actualización del sondeador de flujos](full-text-search-cfn-update-poller.md)
+ [Habilitación y nueva habilitación del proceso del sondeador de flujos](full-text-search-using-pausing-poller.md)

# Uso de AWS CloudFormation una plantilla para iniciar la replicación Neptune-to-OpenSearch
<a name="full-text-search-cfn-create"></a>

## Lanza una CloudFormation pila específica para tu región
<a name="full-text-search-cfn-by-region"></a>

Cada una de las CloudFormation plantillas siguientes crea una instancia de aplicación streams-consumer en una región específica AWS . Para lanzar la pila correspondiente mediante la CloudFormation consola, selecciona uno de los botones de **lanzar la pila** de la siguiente tabla, en función de la AWS región que quieras usar.


| Region | Visualización | Ver en Designer | Lanzar | 
| --- | --- | --- | --- | 
| Este de EE. UU. (Norte de Virginia) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| Este de EE. UU. (Ohio) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| Oeste de EE. UU. (Norte de California) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| Oeste de EE. UU. (Oregón) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| Canadá (centro) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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érica del Sur (São Paulo) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| Europa (Estocolmo) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| Europa (Irlanda) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| Europa (Londres) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| Europa (París) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| Europa (España) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| Europa (Fráncfort) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| Medio Oriente (EAU) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| Israel (Tel Aviv) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| África (Ciudad del Cabo) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| Asia-Pacífico (Hong Kong) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| Asia-Pacífico (Tokio) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| Asia-Pacífico (Seúl) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| Asia-Pacífico (Singapur) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| Asia-Pacífico (Yakarta) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| Asia-Pacífico (Mumbai) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| China (Pekín) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 
| China (Ningxia) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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 (EE. UU.-Oeste) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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 (Estados Unidos-Este) | [Ver](https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json) | [Ver en 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)  | 

En la página **Create Stack (Crear pila)**, elija **Next (Siguiente)**.

## Agrega detalles sobre la nueva OpenSearch pila que estás creando
<a name="full-text-search-cfn-stack-details"></a>

En la página **Especificar los detalles de la pila**, se proporcionan las propiedades y los parámetros que puede utilizar para controlar la configuración de la búsqueda de texto completo:

**Nombre de la pila**: el nombre de la nueva CloudFormation pila que está creando. Por lo general puede utilizar el valor predeterminado, `NeptuneStreamPoller`.

En **Parámetros**, proporcione lo siguiente:

**Configuración de red para la VPC en la que se ejecuta el consumidor de flujos**
+ **`VPC`**: proporcione el nombre de la VPC en la que se ejecutará la función de Lambda de sondeo.
+ **`List of Subnet IDs`**: las subredes en las que se establece una interfaz de red. Añada las subredes correspondientes a su clúster de Neptune.
+ **`List of Security Group Ids`**— Proporcione los grupos IDs de seguridad que otorgan acceso de escritura entrante a su clúster de base de datos Neptune de origen.
+ **`List of Route Table Ids`**: esto es necesario para crear un punto de conexión de Amazon DynamoDB en su VPC de Neptune, si todavía no dispone de uno. Debe proporcionar una lista separada por comas de la tabla de rutas IDs asociada a las subredes.
+ **`Require to create Dynamo DB VPC Endpoint`**: un valor booleano que, de forma predeterminada, es `true`. Solo necesita cambiarlo por `false` si ya ha creado un punto de conexión de DynamoDB en su VPC.
+ **`Require to create Monitoring VPC Endpoint`**: un valor booleano que, de forma predeterminada, es `true`. Solo necesita cambiarlo por `false` si ya ha creado un punto de enlace de monitorización en su VPC.

**Sondeador de flujo**
+ **`Application Name`**: por lo general, puede dejar esta opción con el valor predeterminado (`NeptuneStream`). Si utiliza un nombre diferente, debe ser único.
+ **`Memory size for Lambda Poller`**: se utiliza para establecer el tamaño de memoria disponible para la función de sondeo de Lambda. El valor predeterminado es 2048 megabytes.
+ **`Lambda Runtime`**: el lenguaje utilizado en la función de Lambda que recupera elementos del flujo de Neptune. Puede configurarlo en `python3.9` o en `java8`.
+ **`S3 Bucket having Lambda code artifacts`**: deje este campo en blanco a menos que utilice una función de sondeo de Lambda personalizada que se cargue desde un bucket de S3 diferente.
+ **`S3 Key corresponding to Lambda Code artifacts`**: deje este campo en blanco a menos que utilice una función de sondeo de Lambda personalizada.
+ **`StartingCheckpoint`**: el punto de control inicial del sondeador de flujos. El valor predeterminado es `0:0`, lo que significa comenzar desde el principio del flujo de Neptune.
+ **`StreamPollerInitialState`**: el estado inicial del sondeador. El valor predeterminado es `ENABLED`, lo que significa que la replicación del flujo se iniciará en cuanto se complete la creación de toda la pila.
+ **`Logging level for Lambda`**: en general, deje esta opción con el valor predeterminado, `INFO`.
+ **`Managed Policies for Lambda Execution`**: en general, deje este campo en blanco a menos que utilice una función de sondeo de Lambda personalizada.
+ **`Stream Records Handler`**: en general, deje este campo en blanco a menos que utilice un controlador personalizado para los registros en los flujos de Neptune.
+ **`Maximum records Fetched from Stream`**: puede utilizar este parámetro para ajustar el rendimiento. El valor predeterminado (`100`) es un buen lugar para empezar. El valor máximo permitido es 10 000. Cuanto mayor sea el número, menos llamadas de red se necesitan para leer registros del flujo, pero más memoria se precisa para procesar los registros.
+ **`Max wait time between two Polls (in Seconds)`**: determina la frecuencia con la que se invoca el sondeador de Lambda para sondear los flujos de Neptune. Establezca este valor en 0 para un sondeo continuo. El valor máximo es de 3600 segundos (1 hora). El valor predeterminado (60 segundos) es un buen lugar para empezar según la velocidad con la que cambien los datos del gráfico.
+ **`Maximum Continuous polling period (in Seconds)`**: se utiliza para establecer un tiempo de espera para la función de sondeo de Lambda. Debería estar entre 5 segundos y 900 segundos. El valor predeterminado (600 segundos) es un buen lugar para empezar.
+ **`Step Function Fallback Period`**— El número de step-function-fallback-period unidades que esperarán al sondeador, tras lo cual se invoca la función step a través de Amazon CloudWatch Events para recuperarse de un fallo. El valor predeterminado (5 minutos) es un buen lugar para empezar.
+ **`Step Function Fallback Period Unit`**: las unidades de tiempo utilizadas para medir el `Step Function Fallback Period` anterior (minutos, horas, días). El valor predeterminado generalmente es suficiente (minutos).
+ **`Enable/disable creation of Elastic Search Mappings by Lambda`**— Marcar la gestión enable/disable automática de los mapeos de Elastic Search por parte del encuestador de flujos. Los mapeos de Elastic Search son fundamentales para la conversión entre los tipos de datos de Neptune y Elastic Search. Esto solo lo deben deshabilitar los usuarios avanzados que deseen asumir el control directo y manual de todos los mapeos de su índice de Elastic Search. El valor predeterminado es `true`.
+ **`Data replication scope`**— Determina si se deben replicar tanto los nodos como los bordes, o solo los nodos OpenSearch (esto se aplica únicamente a los datos del motor Gremlin). El valor predeterminado (All) es un buen lugar para empezar por lo general.
+ **`Ignore OpenSearch missing document error`**— Marca para determinar si se OpenSearch puede ignorar un error en un documento faltante. Los errores de falta de documentos se producen en raras ocasiones, pero necesitan intervención manual si no se ignoran. El valor predeterminado (`True`) suele ser un buen lugar para empezar.
+ **`Enable Non-String Indexing`**: indicador para habilitar o deshabilitar la indexación de campos que no tienen contenido de cadena. Si este indicador está establecido en `true` OpenSearch, los campos que no son cadenas se indexan o si `false` solo se indexan los campos de cadena. El valor predeterminado es `true`.
+ **`Properties to exclude from being inserted into OpenSearch`**— Una lista delimitada por comas de claves de propiedades o predicados para excluirlas de la indexación. OpenSearch Si el valor de este parámetro de CFN se deja en blanco, se indexan todas las claves de propiedad.
+ **`Datatypes to exclude from being inserted into OpenSearch`**— Una lista delimitada por comas de tipos de datos de propiedades o predicados para excluirlos de la indexación. OpenSearch Si el valor de este parámetro CFN se deja en blanco, se indexan todos los valores de propiedad que se puedan convertir de forma segura en tipos de datos. OpenSearch 

**Flujo de Neptune**
+ **`Endpoint of source Neptune Stream`**: (*obligatorio*) adopta una de estas dos formas:
  + **`https://your DB cluster:port/propertygraph/stream`** (o su alias, `https://your DB cluster:port/pg/stream`).
  + `https://your DB cluster:port/sparql/stream`
+ **`Neptune Query Engine`**: elija Gremlin o SPARQL.
+ **`Is IAM Auth Enabled?`**: si su clúster de base de datos de Neptune usa la autenticación de IAM, establezca este parámetro como `true`.
+ **`Neptune Cluster Resource Id`**: si su clúster de base de datos de Neptune usa la autenticación de IAM, establezca este parámetro como el identificador de recurso de clúster. El ID del recurso no es el mismo que el ID del clúster. En su lugar, adopta el formato: `cluster-` seguido de 28 caracteres alfanuméricos. Se puede encontrar en **Detalles del clúster** en la consola de Neptune.

**Clúster de destino OpenSearch**
+ **`Endpoint for OpenSearch service`**— (Obligatorio) Proporcione el punto final del OpenSearch servicio en su VPC.
+ **`Number of Shards for OpenSearch Index`**: el valor predeterminado (5) suele ser un buen lugar para empezar.
+ **`Number of Replicas for OpenSearch Index`**: el valor predeterminado (1) suele ser un buen lugar para empezar.
+ **`Geo Location Fields for Mapping`**: si utiliza campos de geolocalización, enumere las claves de propiedad aquí.

**Alarma**
+ **`Require to create Cloud watch Alarm`**— Configúrelo en `true` si quiere crear una CloudWatch alarma para la nueva pila.
+ **`SNS Topic ARN for Cloudwatch Alarm Notifications`**— El ARN del tema SNS al que CloudWatch se deben enviar las notificaciones de alarma (solo es necesario si las alarmas están habilitadas).
+ **`Email for Alarm Notifications`**: la dirección de correo electrónico a la que se deben enviar las notificaciones de alarma (solo es necesaria si las alarmas están activadas).

Como destino de la notificación de alarma, puede añadir solo SNS, solo correo electrónico o tanto SNS como correo electrónico.

## Ejecute la plantilla CloudFormation
<a name="full-text-search-cfn-complete"></a>

Ahora puede completar el proceso de aprovisionamiento de una instancia de aplicación de consumidor de flujos de Neptune de la siguiente manera:

1. En CloudFormation, en la página **Especificar los detalles de la pila**, elija **Siguiente**.

1. En la página **Opciones**, seleccione **Siguiente**.

1. En la página **Revisar**, seleccione la primera casilla para confirmar que CloudFormation debe crear los recursos de IAM. Seleccione la segunda casilla para confirmar `CAPABILITY_AUTO_EXPAND` para la nueva pila. 
**nota**  
`CAPABILITY_AUTO_EXPAND` confirma explícitamente que las macros se expandirán al crear la pila, sin revisión previa. Los usuarios suelen crear un conjunto de cambios a partir de una plantilla procesada para que los cambios realizados por las macros puedan revisarse antes de crear la pila. Para obtener más información, consulte el funcionamiento de la CloudFormation [CreateStack](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html)API en la *referencia de la AWS CloudFormation API*.

   A continuación, seleccione **Crear**.

# Habilitar la búsqueda de texto completo en las bases de datos de Neptune existentes
<a name="full-text-search-cfn-enabling"></a>

 Estos son los enfoques establecidos para habilitar la búsqueda de texto completo en bases de datos de Amazon Neptune existentes. Los pasos pueden variar ligeramente en función de si puede o no pausar las cargas de trabajo de escritura. En esta guía se describen los pasos recomendados para ambos escenarios: cuando pueda pausar la escritura y cuando no pueda hacerlo. Abarca la activación de las transmisiones de Neptune, la creación de un clon de base de datos, la sincronización de datos con un OpenSearch dominio y la configuración de actualizaciones continuas. La guía aprovecha los AWS servicios y las herramientas de código abierto para agilizar el proceso y minimizar el tiempo de inactividad. 

## Si puede pausar sus cargas de trabajo de escritura
<a name="full-text-search-cfn-enabling-with-pause"></a>

La mejor forma de habilitar la búsqueda de texto completo en una base de datos de Neptune existente suele ser la siguiente, siempre que pueda pausar las cargas de trabajo de escritura. Para ello, es necesario crear un clon, habilitar los flujos mediante un parámetro de clúster y reiniciar todas las instancias. La creación de un clon es una operación relativamente rápida, por lo que el tiempo de inactividad necesario es limitado.

Estos son los pasos necesarios:

1. Detenga todas las cargas de trabajo de escritura en la base de datos.

1. Habilite los flujos en la base de datos (consulte [Enabling Neptune Streams](streams-using-enabling.md)).

1. Cree un clon de la base de datos (consulte [Database Cloning in Neptune](manage-console-cloning.md)).

1. Reanude las cargas de trabajo de escritura.

1. Usa la [export-neptune-to-elasticsearch](https://github.com/awslabs/amazon-neptune-tools/tree/master/export-neptune-to-elasticsearch)herramienta en github para realizar una sincronización única de la base de datos clonada al dominio. OpenSearch

1. Use la [plantilla de CloudFormation de su región](https://docs.aws.amazon.com/neptune/latest/userguide/full-text-search-cfn-create.html#full-text-search-cfn-by-region) para iniciar la sincronización desde su base de datos original con una actualización continua (no es necesario cambiar la configuración de la plantilla).

1. Elimina la base de datos clonada y la CloudFormation pila creada para la `export-neptune-to-elasticsearch` herramienta.

**nota**  
Si se utiliza [export-neptune-to-elasticsearch](https://github.com/awslabs/amazon-neptune-tools/tree/master/export-neptune-to-elasticsearch)con Opensearch Serverless, los datos `LambdaExecutionRole` creados por la pila de [export-neptune-to-elasticsearch](https://github.com/awslabs/amazon-neptune-tools/tree/master/export-neptune-to-elasticsearch)Cloudformation deben añadirse a la [política de acceso a los datos de Opensearch](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html) para poder replicarlos correctamente.

## Si no puede pausar sus cargas de trabajo de escritura
<a name="full-text-search-cfn-enabling-without-pause"></a>

Si no puede permitirse suspender las cargas de trabajo de escritura en su base de datos, aquí tiene un enfoque que requiere incluso menos tiempo de inactividad que el enfoque recomendado anteriormente, pero debe hacerse con cuidado:

1. Habilite los flujos en la base de datos (consulte [Enabling Neptune Streams](streams-using-enabling.md)).

1. Cree un clon de la base de datos (consulte [Database Cloning in Neptune](manage-console-cloning.md)).

1. Obtenga el último `eventID` de los flujos de la base de datos clonada mediante la ejecución de un comando de este tipo en el punto de conexión de la API de flujos (consulte [Calling the Neptune Streams REST API](streams-using-api-call.md) para obtener más información):

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

   Anote los valores de los campos `commitNum` y `opNum` del objeto `lastEventId` en la respuesta.

1. Usa la [export-neptune-to-elasticsearch](https://github.com/awslabs/amazon-neptune-tools/tree/master/export-neptune-to-elasticsearch)herramienta en GitHub para realizar una sincronización única entre la base de datos clonada y el dominio. OpenSearch

1. Use la [plantilla de CloudFormation de su región](https://docs.aws.amazon.com/neptune/latest/userguide/full-text-search-cfn-create.html#full-text-search-cfn-by-region) para iniciar la sincronización desde su base de datos original con una actualización continua.

   Realiza el siguiente cambio al crear la pila: en la página de detalles de la pila, en la sección **Parámetros**, establece el valor del `StartingCheckpoint` campo en**commitNum**: **opnum** usando los `opNum` valores `commitNum` y que registraste anteriormente.

1. Elimine la base de datos clonada y la CloudFormation pila creada para la `export-neptune-to-elasticsearch` herramienta.

# Actualización del sondeador de flujos
<a name="full-text-search-cfn-update-poller"></a>

 La siguiente información describe los pasos necesarios para actualizar el sondeador de transmisiones con los artefactos Lambda más recientes mediante AWS la consola de administración. 

## Para actualizar el sondeador de flujos con los artefactos de Lambda más recientes
<a name="full-text-search-cfn-update-poller-lambda"></a>

Puede actualizar el sondeador de flujos con los artefactos de Lambda más recientes de la siguiente manera:

1. En Consola de administración de AWS, navegue hasta la pila principal principal CloudFormation CloudFormation y selecciónela.

1. Seleccione la opción **Actualizar** para la pila.

1. Seleccione **Reemplazar la plantilla actual**.

1. Para la fuente de la plantilla, elija la **URL de Amazon S3** e introduzca la siguiente URL de S3:

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

1. Seleccione **Siguiente** sin cambiar ningún CloudFormation parámetro.

1. Elija **Update Stack (Actualizar pilar)**.

La pila actualizará ahora los artefactos de Lambda con los más recientes.

## Ampliación del sondeador de flujos para admitir campos personalizados
<a name="full-text-search-using-custom-fields"></a>

El sondeador de flujos actual se puede ampliar fácilmente para escribir código personalizado para gestionar campos personalizados, como se explica en detalle en esta entrada del blog: [Capture graph changes using Neptune Streams](https://aws.amazon.com/blogs/database/capture-graph-changes-using-neptune-streams/).

**nota**  
Al añadir un campo personalizado OpenSearch, asegúrese de añadir el nuevo campo como objeto interno de un predicado (consulte[Modelo de datos de búsqueda de texto completo de Neptune](full-text-search-model.md)).

# Habilitación y nueva habilitación del proceso del sondeador de flujos
<a name="full-text-search-using-pausing-poller"></a>

**aviso**  
Tenga cuidado al deshabilitar el proceso de sondeador de flujos. Se podrían perder datos si el proceso se detiene durante más tiempo que el período de caducidad del flujo. El período predeterminado es de 7 días, pero a partir de la versión [1.2.0.0](engine-releases-1.2.0.0.md) del motor, puede configurar un período de caducidad del flujo personalizado hasta un máximo de 90 días.

# Deshabilitación (pausa) del proceso del sondeador de flujos
<a name="full-text-search-pause-poller"></a>

1. Inicia sesión en la EventBridge consola de Amazon Consola de administración de AWS y ábrela en [https://console.aws.amazon.com/events/](https://console.aws.amazon.com/events/).

1. En el panel de navegación, seleccione **Reglas**.

1. Selecciona la regla cuyo nombre contenga el nombre que proporcionaste como **nombre de la aplicación** en la CloudFormation plantilla que usaste para configurar Stream Poller.

1. Elija **Deshabilitar**.

1. Abra la consola Step Functions en [https://console.aws.amazon.com/states/](https://console.aws.amazon.com/states/).

1. Seleccione la función de paso en ejecución que corresponda al proceso del sondeador de flujos. De nuevo, el nombre de esa función de paso contiene el nombre que proporcionó como **nombre de la aplicación** en la CloudFormation plantilla que utilizó para configurar el sondeador de transmisiones. Puede filtrar por estado de ejecución de la función para ver solo las funciones **En ejecución**.

1. Elija **Detener**.

# Nueva habilitación del proceso del sondeador de flujos
<a name="full-text-search-re-enable-poller"></a>

1. Inicia sesión en la EventBridge consola de Amazon Consola de administración de AWS y ábrela en [https://console.aws.amazon.com/events/](https://console.aws.amazon.com/events/).

1. En el panel de navegación, seleccione **Reglas**.

1. Selecciona la regla cuyo nombre contenga el nombre que proporcionaste como **nombre de la aplicación** en la CloudFormation plantilla que usaste para configurar Stream Poller.

1. Seleccione **Habilitar**. La regla de eventos basada en el intervalo programado especificado activará ahora una nueva ejecución de la función de paso.

# Replicación a OpenSearch servidores sin servidor
<a name="full-text-search-serverless"></a>

A partir de la [versión 1.3.0.0 del motor](engine-releases-1.3.0.0.md), Amazon Neptune admite el uso de [ OpenSearch Amazon Service](https://docs.aws.amazon.com//opensearch-service/latest/developerguide/serverless.html) Serverless para la búsqueda de texto completo en consultas de Gremlin y SPARQL. El uso de OpenSearch Serverless requiere que [habilite la autenticación de IAM en el clúster](https://docs.aws.amazon.com/neptune/latest/userguide/iam-auth-enable.html) de Neptune Database. Los clústeres de Neptune Database con la autenticación de IAM deshabilitada no son compatibles con Serverless. OpenSearch 

## Cambios necesarios para la función AWS Lambda del sondeador
<a name="full-text-changes-required"></a>

Si va a replicar en OpenSearch Serverless, añada la función de ejecución del sondeador de flujos Lambda a la política de acceso a los datos de la colección Serverless. OpenSearch El ARN de la rol de ejecución del sondeador de flujo de Lambda tiene este formato:

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

## Cambios necesarios para la utilidad de importación masiva
<a name="full-text-changes-bulk-import"></a>

 Si lo utiliza [ export-neptune-to-elasticsearch](https://github.com/awslabs/amazon-neptune-tools/tree/master/export-neptune-to-elasticsearch)para sincronizar los datos existentes con OpenSearch Serverless, añada los datos de la CloudFormation pila a la política `LambdaExecutionRole` de acceso a los datos de la recopilación sin servidor. OpenSearch El ARN para `LambdaExecutionRole` tiene este formato: 

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

Para obtener más información, consulte [Control de acceso a datos para Amazon OpenSearch Serverless](https://docs.aws.amazon.com//opensearch-service/latest/developerguide/serverless-data-access.html).

## Cambios necesarios en el rol de IAM utilizado para consultar Neptune
<a name="full-text-IAM"></a>

La entidad de IAM (usuario o rol) utilizada para conectarse a la base de datos de Neptune debe tener permisos tanto para Neptune como para la colección Serverless. OpenSearch Esto significa que su usuario o rol debe tener una política OpenSearch sin servidor como la siguiente adjunta:

------
#### [ 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"
    }
  ]
}
```

------

Para obtener más información, consulte [Creación de instrucciones de políticas de IAM personalizadas para acceder a datos en Amazon Neptune](iam-data-access-policies.md).

# Consultas desde un OpenSearch clúster con control de acceso detallado (FGAC) habilitado
<a name="full-text-search-fgac"></a>

Si ha habilitado un [control de acceso detallado](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html) en su OpenSearch clúster, también debe [habilitar la autenticación de IAM en](iam-auth-enable.md) su base de datos de Neptune.

La entidad de IAM (usuario o rol) utilizada para conectarse a la base de datos de Neptuno debe tener permisos tanto para Neptune como para el clúster. OpenSearch Esto significa que su usuario o rol debe tener adjunta una política de OpenSearch servicio como la siguiente:

------
#### [ 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/*"
    }
  ]
}
```

------

Para obtener más información, consulte [Creación de instrucciones de políticas de IAM personalizadas para acceder a datos en Amazon Neptune](iam-data-access-policies.md).

# Uso de la sintaxis de consulta de Apache Lucene en las consultas de búsqueda de texto completo de Neptune
<a name="full-text-search-lucene"></a>

OpenSearch admite el uso de la [sintaxis de Apache Lucene](https://lucene.apache.org/core/8_9_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#package.description) para las consultas query\$1string. Esto resulta especialmente útil para pasar varios filtros en una consulta.

Neptune utiliza una estructura anidada para almacenar propiedades en un documento de OpenSearch (consulte [Modelo de datos de búsqueda de texto completo de Neptune](full-text-search-model.md)). Al utilizar la sintaxis de Lucene, es necesario utilizar rutas completas a las propiedades de este modelo anidado.

Aquí tiene un ejemplo de 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")
```

Aquí tiene un ejemplo de 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 .
}
```

# Modelo de datos de Neptune para datos de OpenSearch
<a name="full-text-search-model"></a>

Amazon Neptune utiliza una estructura de documento JSON unificada para almacenar datos de SPARQL y Gremlin en OpenSearch Service. Cada documento de OpenSearch corresponde a una entidad y almacena toda la información relevante de esa entidad. En Gremlin, los vértices y los bordes se consideran entidades, por lo que los documentos correspondientes de OpenSearch tienen información sobre vértices, etiquetas y propiedades. En SPARQL, los sujetos pueden considerarse entidades, por lo que los documentos correspondientes de OpenSearch tienen información sobre todos los pares de predicado-objeto que hay en un documento.

**nota**  
La implementación de la replicación de Neptune a OpenSearch solo almacena datos de cadena. Sin embargo, puede modificarla para almacenar otros tipos de datos.

La estructura de documento JSON unificada tiene el siguiente aspecto.

```
{
  "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`: identificador único de la entidad que representa el documento.
  + Para SPARQL, se trata del URI de asunto.
  + Para Gremlin, es el `Vertex_ID` o `Edge_ID`.
+ `entity_type`: representa una o más etiquetas de un vértice o un borde, o cero o más valores de predicado `rdf:type` para un sujeto.
+ `document_type`: se utiliza para especificar si el documento actual representa un vértice, un borde o un recurso RDF.
+ `predicates`: en el caso de Gremlin, almacena las propiedades y los valores de un vértice o un borde. Para SPARQL, almacena pares de predicado-objeto.

  El nombre de la propiedad tiene el formato `properties.name.value` de OpenSearch. Para consultarlo, debe nombrarlo de esa forma.
+ `value `: un valor de propiedad para Gremlin o un valor de objeto para SPARQL.
+ `graph`: un gráfico con nombre para SPARQL.
+ `language`: una etiqueta de idioma para un literal `rdf:langString` en SPARQL.

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

**Datos de**

```
@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
```

**Documentos**

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

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

**Datos de**

```
# 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
```

**Documentos**

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

# Parámetros de búsqueda de texto completo de Neptune
<a name="full-text-search-parameters"></a>

Amazon Neptune utiliza los siguientes parámetros para especificar las consultas de OpenSearch de texto completo tanto en Gremlin como en SPARQL:
+ **`queryType`**: (*obligatorio*) el tipo de consulta de OpenSearch. (Para obtener una lista de los tipos de consultas, consulte la [documentación de OpenSearch](https://www.elastic.co/guide/en/elasticsearch/reference/current/full-text-queries.html)). Neptune admite los siguientes tipos de consultas de OpenSearch:
  + [simple\$1query\$1string](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html): devuelve los documentos en función de la cadena de consulta proporcionada, mediante un analizador con una sintaxis de Lucene limitada pero tolerante a errores. Este es el tipo de consulta predeterminado.

    Esta consulta utiliza una sintaxis simple para analizar y dividir la cadena de consulta proporcionada en términos basados en operadores especiales. A continuación, la consulta analiza cada término de forma independiente antes de devolver documentos coincidentes.

    Aunque su sintaxis está más limitada que la consulta `query_string`, la consulta `simple_query_string` no devuelve errores para la sintaxis no válida. En su lugar, no tiene en cuenta cualquier parte no válida de la cadena de consulta.
  + [match](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html): la consulta `match` es la consulta estándar para realizar una búsqueda de texto completo, e incluye opciones de coincidencia parcial.
  + [prefix](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-prefix-query.html): devuelve los documentos que contienen un prefijo específico en un campo proporcionado.
  + [fuzzy](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html): devuelve documentos que contienen términos similares al término de búsqueda, medidos por medio de una distancia de edición de Levenshtein.

    Una distancia de edición es el número de cambios de un carácter necesarios para convertir un término en otro. Estos cambios pueden incluir:
    + Cambio de un carácter (box a fox).
    + Eliminación de un carácter (black a lack).
    + Inserción de un carácter (sic a sick).
    + Transposición de dos caracteres adyacentes (act a cat).

    Para encontrar términos similares, la consulta aproximada crea un conjunto de todas las variaciones y expansiones posibles del término de búsqueda dentro de una distancia de edición especificada y, a continuación, devuelve coincidencias exactas para cada una de esas variantes.
  + [term](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html): devuelve documentos que contienen una coincidencia exacta de un término especificado en uno de los campos especificados.

    Puede utilizar la consulta `term` para buscar documentos basados en un valor preciso, como un precio, el ID de un producto o un nombre de usuario.
**aviso**  
Evite usar el término consulta para los campos de texto. De forma predeterminada, OpenSearch cambia los valores de los campos de texto como parte de su análisis, lo que puede dificultar la búsqueda de coincidencias exactas para los valores de los campos de texto.  
Para buscar valores de campo de texto, utilice la consulta de coincidencia en su lugar.
  + [query\$1string](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html): devuelve los documentos en función de la cadena de consulta proporcionada, mediante un analizador con una sintaxis estricta (sintaxis de Lucene).

    Esta consulta utiliza una sintaxis para analizar y dividir la cadena de consulta proporcionada basadas en operadores, como Y y NO. A continuación, la consulta analiza cada texto dividido de forma independiente antes de devolver documentos coincidentes.

    Puede utilizar la consulta `query_string` para crear una búsqueda compleja que incluya caracteres comodín, búsquedas en varios campos y mucho más. Aunque versátil, la consulta es estricta y devuelve un error si la cadena de consulta incluye cualquier sintaxis no válida.
**aviso**  
Dado que devuelve un error para cualquier sintaxis no válida, no recomendamos usar la consulta `query_string` para los cuadros de búsqueda.  
Si no tiene que admitir una sintaxis de consulta, considere el uso de la consulta `match`. Si necesita las características de una sintaxis de consulta, utilice la consulta `simple_query_string`, que es menos estricta.
+ **`field`**: el campo de OpenSearch en el que se va a ejecutar la búsqueda. Solo se puede omitir si `queryType` lo permite (como hacen `simple_query_string` y `query_string`), en cuyo caso la búsqueda se efectúa en todos los campos. En Gremlin, está implícito.

  Se pueden especificar varios campos si la consulta lo permite, como hacen `simple_query_string` y `query_string`.
+ **`query`**: (*obligatorio*) la consulta que se va a ejecutar en OpenSearch. El contenido de este campo puede variar según el valor de queryType. Los distintos valores de queryType aceptan diferentes sintaxis, como, por ejemplo, hace `Regexp`. En Gremlin, `query` está implícito.
+ **`maxResults`**: el número máximo de resultados que se deben devolver. El valor predeterminado es la configuración `index.max_result_window` de OpenSearch, que de manera predeterminada es 10 000. El parámetro `maxResults` puede especificar cualquier número menor que eso.
**importante**  
Si establece `maxResults` en un valor mayor que el valor de `index.max_result_window` de OpenSearch e intenta recuperar más de `index.max_result_window` resultados, OpenSearch produce un error `Result window is too large`. Sin embargo, Neptune maneja esto con fluidez sin propagar el error. Tenga esto en cuenta si trata de obtener más resultados de `index.max_result_window`.
+ **`minScore`**: la puntuación mínima que debe tener un resultado de búsqueda para ser devuelto. Consulte [OpenSearch relevance documentation](https://www.elastic.co/guide/en/elasticsearch/guide/current/scoring-theory.html) para obtener una explicación de la puntuación de los resultados.
+ **`batchSize`**: Neptune siempre obtiene los datos por lotes (el tamaño de lote predeterminado es 100). Puede utilizar este parámetro para ajustar el rendimiento. El tamaño del lote no puede superar la configuración de `index.max_result_window` de OpenSearch, que de manera predeterminada es 10 000.
+ **`sortBy`**: un parámetro opcional que permite ordenar los resultados que devuelve OpenSearch según una de las siguientes opciones:
  + *Un campo de cadena concreto del documento*:  

    Por ejemplo, en una consulta SPARQL, puede especificar:

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

    En una consulta Gremlin similar, puede especificar:

    ```
        .withSideEffect('Neptune#fts.sortBy', 'name')
    ```
  + *Un campo concreto que no es una cadena (`long`, `double`, etc.) del documento*:  

    Tenga en cuenta que, al ordenar por un campo que no sea una cadena, debe agregar `.value` al nombre del campo para diferenciarlo de un campo de cadena.

    Por ejemplo, en una consulta SPARQL, puede especificar:

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

    En una consulta Gremlin similar, puede especificar:

    ```
        .withSideEffect('Neptune#fts.sortBy', 'name.value')
    ```
  + `score`: ordena por puntuación de coincidencia (valor predeterminado).

    Si el parámetro `sortOrder` está presente pero `sortBy` no está presente, los resultados se ordenan por `score` en el orden especificado por `sortOrder`.
  + `id`: ordena por identificador, es decir, el URI del sujeto de SPARQL o el identificador de vértice o borde de Gremlin.

    Por ejemplo, en una consulta SPARQL, puede especificar:

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

    En una consulta Gremlin similar, puede especificar:

    ```
        .withSideEffect('Neptune#fts.sortBy', 'Neptune#fts.entity_id')
    ```
  + `label`: ordena por etiqueta.

    Por ejemplo, en una consulta SPARQL, puede especificar:

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

    En una consulta Gremlin similar, puede especificar:

    ```
        .withSideEffect('Neptune#fts.sortBy', 'Neptune#fts.entity_type')
    ```
  + `doc_type`: ordena por tipo de documento (es decir, SPARQL o Gremlin).

    Por ejemplo, en una consulta SPARQL, puede especificar:

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

    En una consulta Gremlin similar, puede especificar:

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

  De forma predeterminada, los resultados de OpenSearch no se ordenan y su orden no es determinista, lo que significa que la misma consulta puede devolver elementos con un orden diferente cada vez que se ejecuta. Por esta razón, si el conjunto de resultados es mayor que `max_result_window`, se podría devolver un subconjunto bastante diferente de los resultados totales cada vez que se ejecuta una consulta. Al ordenar, sin embargo, puede hacer que los resultados de diferentes ejecuciones sean más equivalentes de forma directa.

  Si ningún parámetro `sortOrder` acompaña a `sortBy`, se utiliza el orden descendente (`DESC`) de mayor a menor.
+ **`sortOrder`**: un parámetro opcional que permite especificar si los resultados de OpenSearch se ordenan de menor a mayor o de mayor a menor (opción predeterminada):

****
  + `ASC`: orden ascendente, de menor a mayor.
  + `DESC`: orden descendente, de mayor a menor.

    Este es el valor predeterminado, que se utiliza cuando el parámetro `sortBy` está presente pero no se especifica `sortOrder`.

  Si no están presentes `sortBy` ni `sortOrder`, los resultados de OpenSearch no se ordenan de forma predeterminada.

# Indexación de OpenSearch sin cadenas en Amazon Neptune
<a name="full-text-search-non-string-indexing"></a>

La indexación de OpenSearch sin cadenas en Amazon Neptune permite replicar en OpenSearch valores que no son cadenas para predicados mediante el sondeador de flujos. Todos los valores de predicados que se puedan convertir de forma segura en un mapeo o tipo de datos de OpenSearch correspondiente se replican en OpenSearch.

Para habilitar la indexación sin cadenas en una pila nueva, el indicador `Enable Non-String Indexing` de la plantilla CloudFormation debe estar establecido en `true`. Este es el valor predeterminado. Para actualizar una pila existente para que sea compatible con la indexación sin cadenas, consulte [Actualización de una pila existente](full-text-search-non-string-indexing-update.md) a continuación.

**nota**  
Es mejor no habilitar la indexación sin cadenas en las versiones del motor anteriores a **`1.0.4.2`**.
Las consultas de OpenSearch que utilizan expresiones regulares para nombres de campo que coinciden con varios campos, algunos de los cuales contienen valores de cadena y otros contienen valores que sin cadenas, fallan y se produce un error. Lo mismo ocurre si las consultas de búsqueda de texto completo en Neptune son de ese tipo.
Al ordenar por un campo sin cadenas, añada ".value" al nombre del campo para diferenciarlo de un campo de cadena.

**Contents**
+ [Actualización de una pila de búsqueda de texto completo de Neptune existente para admitir la indexación sin cadenas](full-text-search-non-string-indexing-update.md)
+ [Filtrado de los campos que se indexan en la búsqueda de texto completo de Neptune](full-text-search-non-string-indexing-filters.md)
  + [Filtre por propiedad o nombre de predicado](full-text-search-non-string-indexing-filters.md#full-text-search-non-string-indexing-filters-name)
  + [Filtre por propiedad o tipo de valor de predicado](full-text-search-non-string-indexing-filters.md#full-text-search-non-string-indexing-filters-datatype)
+ [Mapeo de tipos de datos SPARQL y Gremlin a OpenSearch](full-text-search-non-string-indexing-mapping.md)
+ [Validación de mapeos de datos](full-text-search-data-validation.md)
+ [Ejemplos de consultas de OpenSearch sin cadenas en Neptune](full-text-search-non-string-examples.md)
  + [Obtenga todos los vértices con una antigüedad superior a 30 años y un nombre que comience por "Si"](full-text-search-non-string-examples.md#full-text-search-non-string-example-1)
  + [Obtenga todos los nodos con una antigüedad comprendida entre 10 y 50 años y un nombre con una coincidencia parcial con "Ronka"](full-text-search-non-string-examples.md#full-text-search-non-string-example-2)
  + [Obtenga todos los nodos con una marca temporal que esté comprendida dentro de los últimos 25 días](full-text-search-non-string-examples.md#full-text-search-non-string-example-3)
  + [Obtenga todos los nodos con una marca temporal que esté dentro de un año y un mes determinados](full-text-search-non-string-examples.md#full-text-search-non-string-example-4)

# Actualización de una pila de búsqueda de texto completo de Neptune existente para admitir la indexación sin cadenas
<a name="full-text-search-non-string-indexing-update"></a>

Si ya utiliza la búsqueda de texto completo en Neptune, estos son los pasos que debe seguir para admitir la indexación sin cadenas:

1. **Detenga la función de Lambda del sondeador de flujo.** Esto garantiza que no se copien nuevas actualizaciones durante la exportación. Para ello, deshabilite la regla de eventos de nube que invoca la función de Lambda:
   + En la Consola de administración de AWS, vaya a CloudWatch.
   + Seleccione **Reglas**.
   + Elija la regla con el nombre del sondeador de flujo de Lambda.
   + Seleccione **Deshabilitar** para deshabilitar temporalmente la regla.

1. **Elimine el índice de Neptune actual en OpenSearch.** Utilice la siguiente consulta `curl` para eliminar el índice `amazon_neptune` del clúster de OpenSearch:

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

1. **Inicie una exportación puntual de Neptune a OpenSearch.** Lo mejor es configurar una nueva pila de OpenSearch en este momento, de forma que el buscador que realice la exportación pueda obtener los nuevos artefactos.

   Siga los pasos que se indican [aquí en GitHub]( https://github.com/awslabs/amazon-neptune-tools/blob/master/export-neptune-to-elasticsearch/readme.md) para iniciar la exportación puntual de sus datos de Neptune a OpenSearch.

1. **Actualice los artefactos de Lambda para el sondeador de flujos existente.** Una vez que la exportación de los datos de Neptune a OpenSearch se haya realizado correctamente, siga estos pasos:
   + En la Consola de administración de AWS, vaya a CloudFormation.
   + Elija la pila CloudFormation principal.
   + Seleccione la opción **Actualizar** para esa pila.
   + Seleccione **Reemplazar la plantilla actual desde opciones**.
   + En el origen de la plantilla, seleccione **URL de Amazon S3**.
   + Para la URL de Amazon S3, introduzca:

     ```
     https://aws-neptune-customer-samples.s3.amazonaws.com/neptune-stream/neptune_to_elastic_search.json
     ```
   + Seleccione **Siguiente** sin cambiar ningún parámetro de CloudFormation.
   + Seleccione **Actualizar pila**. CloudFormation sustituirá a los artefactos del código de Lambda del sondeador de flujos por los artefactos más recientes.

1. **Vuelva a iniciar el sondeador de flujo.** Para ello, habilite la regla de CloudWatch adecuada:
   + En la Consola de administración de AWS, vaya a CloudWatch.
   + Seleccione **Reglas**.
   + Elija la regla con el nombre del sondeador de flujo de Lambda.
   + Seleccione **Habilitar**.

# Filtrado de los campos que se indexan en la búsqueda de texto completo de Neptune
<a name="full-text-search-non-string-indexing-filters"></a>

Hay dos campos en los detalles de la plantilla de CloudFormation que permiten especificar las claves de propiedades o predicados o los tipos de datos que se van a excluir de la indexación de OpenSearch:

## Filtre por propiedad o nombre de predicado
<a name="full-text-search-non-string-indexing-filters-name"></a>

Puede usar el parámetro de plantilla de CloudFormation opcional denominado `Properties to exclude from being inserted into Elastic Search Index` para proporcionar una lista delimitada por comas de claves de predicados o propiedades que desee excluir de la indexación de OpenSearch.

Por ejemplo, supongamos que establece este parámetro en `bob`.

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

En ese caso, el registro de flujo de la siguiente consulta de actualización de Gremlin se eliminaría en lugar de pasar al índice:

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

Del mismo modo, puede establecer el parámetro en `http://my/example#bob`:

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

En ese caso, el registro de flujo de la siguiente consulta de actualización de SPARQL se eliminaría en lugar de pasar al índice:

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

Si no introduce nada en este parámetro de plantilla de CloudFormation, se indexarán todas las claves de propiedad que no se excluyan de algún modo.

## Filtre por propiedad o tipo de valor de predicado
<a name="full-text-search-non-string-indexing-filters-datatype"></a>

Puede usar el parámetro de plantilla de CloudFormation opcional denominado `Datatypes to exclude from being inserted into Elastic Search Index` para proporcionar una lista delimitada por comas de tipos de datos de valores de predicados o propiedades que desee excluir de la indexación de OpenSearch.

En el caso de SPARQL, no es necesario incluir el URI de tipo XSD completo, sino simplemente el token del tipo de datos. Los tokens de tipos de datos válidos que puede enumerar son:
+ `string`
+ `boolean`
+ `float`
+ `double`
+ `dateTime`
+ `date`
+ `time`
+ `byte`
+ `short`
+ `int`
+ `long`
+ `decimal`
+ `integer`
+ `nonNegativeInteger`
+ `nonPositiveInteger`
+ `negativeInteger`
+ `unsignedByte`
+ `unsignedShort`
+ `unsignedInt`
+ `unsignedLong`

En el caso de Gremlin, los tipos de datos válidos que se pueden enumerar son:
+ `string`
+ `date`
+ `bool`
+ `byte`
+ `short`
+ `int`
+ `long`
+ `float`
+ `double`

Por ejemplo, supongamos que establece este parámetro en `string`.

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

En ese caso, el registro de flujo de la siguiente consulta de actualización de Gremlin se eliminaría en lugar de pasar al índice:

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

Del mismo modo, puede establecer el parámetro en `int`:

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

En ese caso, el registro de flujo de la siguiente consulta de actualización de SPARQL se eliminaría en lugar de pasar al índice:

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

Si no introduce nada en este parámetro de plantilla de CloudFormation, se indexarán todas las propiedades cuyos valores se puedan convertir de forma segura en equivalentes de OpenSearch. Se omiten los tipos enumerados que no son compatibles con el lenguaje de consulta.

# Mapeo de tipos de datos SPARQL y Gremlin a OpenSearch
<a name="full-text-search-non-string-indexing-mapping"></a>

Los nuevos mapeos de tipos de datos en OpenSearch se crean en función del tipo de datos que se utiliza en la propiedad u objeto. Dado que algunos campos contienen valores de distintos tipos, es posible que en el mapeo inicial se excluyan algunos valores del campo.

Los tipos de datos de Neptune se mapean a los tipos de datos de OpenSearch de la siguiente manera:


| Tipos de SPARQL | Tipos de Gremlin | Tipos de OpenSearch | 
| --- | --- | --- | 
|  `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` | 
| *Tipo de datos personalizado* | *N/A* | `text` | 
| *Cualquier otro tipo de datos* | *N/A* | `text` | 

Por ejemplo, la siguiente consulta de actualización de Gremlin hace que se añada un nuevo mapeo de "newField" a OpenSearch, es decir, `{ "type" : "double" }`:

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

Del mismo modo, la siguiente consulta de actualización de SPARQL hace que se añada un nuevo mapeo de "ex:byte" a OpenSearch, es decir, `{ "type" : "long" }`:

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

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

**nota**  
Como puede ver, un elemento mapeado de Neptune a OpenSearch puede terminar con un tipo de datos diferente en OpenSearch al que tiene en Neptune. Sin embargo, hay un campo de texto explícito en OpenSearch, "datatype", que registra el tipo de datos que tiene el elemento en Neptune.

# Validación de mapeos de datos
<a name="full-text-search-data-validation"></a>



Los datos se replican a OpenSearch desde Neptune mediante este proceso:
+ Si ya hay un mapeo del campo en cuestión en OpenSearch:
  + Si los datos se pueden convertir de forma segura al mapeo existente mediante reglas de validación de datos, guarde el campo en OpenSearch.
  + Si no es así, borre el registro de actualización del flujo correspondiente.
+ Si no existe ningún mapeo para el campo en cuestión, busque un tipo de datos de OpenSearch que corresponda al tipo de dato del campo en Neptune.
  + Si los datos del campo se pueden convertir de forma segura al tipo de dato de OpenSearch mediante reglas de validación de datos, almacene los nuevos datos de mapeo y campo en OpenSearch.
  + Si no es así, borre el registro de actualización del flujo correspondiente.

Los valores se validan con los tipos de OpenSearch equivalentes o mapeos de OpenSearch existentes en lugar de con los tipos de Neptune. Por ejemplo, la validación del valor `"123"` en `"123"^^xsd:int` se realiza en función del tipo `long` y no del tipo `int`.

Aunque Neptune intenta replicar todos los datos en OpenSearch, hay casos en los que los tipos de datos de OpenSearch son totalmente diferentes de los de Neptune y, en esos casos, los registros se omiten en lugar de indexarse en OpenSearch.

Por ejemplo, en Neptune, una propiedad puede tener varios valores de distintos tipos, mientras que en OpenSearch un campo debe tener el mismo tipo en todo el índice.

Al habilitar los registros de depuración, puede ver qué registros se han eliminado durante la exportación de Neptune a OpenSearch. Este es un ejemplo de entrada en el registro de depuración:

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

Los tipos de datos se validan de la siguiente manera:
+ **`text`**: todos los valores de Neptune se pueden mapear de forma segura a texto en OpenSearch.
+ **`long`**: las siguientes reglas para los tipos de datos de Neptune se aplican cuando el tipo de mapeo de OpenSearch es largo (en los ejemplos siguientes, se supone que `"testLong"` tiene un tipo de mapeo `long`):
  + `boolean`: no es válido, no se puede convertir y se elimina el registro de actualización del flujo correspondiente.

    Estos son algunos ejemplos de Gremlin no válidos:

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

    Estos son algunos ejemplos de SPARQL no válidos:

    ```
      ":testLong" : "true"^^xsd:boolean
      ":testLong" : "false"^^xsd:boolean
    ```
  + `datetime`: no es válido, no se puede convertir y se elimina el registro de actualización del flujo correspondiente.

    Este es un ejemplo de un valor de Gremlin no válido:

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

    Este es un ejemplo de un valor de SPARQL no válido:

    ```
      ":testLong" : "2016-01-01"^^xsd:date
    ```
  + `float`,`double` o `decimal`: si el valor de Neptune es un número entero que puede caber en 64 bits, es válido y se almacena en OpenSearch como long, pero si tiene una parte de fracción, es un `NaN` o un `INF`, o es mayor que 9.223.372.036.854.775.807 o menor que -9.223.372.036.854.775.808, entonces no es válido y se elimina el registro de actualización de flujo correspondiente.

    Estos son algunos ejemplos de valores de Gremlin válidos:

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

    Estos son algunos ejemplos de SPARQL válidos:

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

    Estos son algunos ejemplos de Gremlin no válidos:

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

    Estos son algunos ejemplos de SPARQL no válidos:

    ```
      ":testLong" :  123.45
      ":testLong" :  9223372036854775900
      ":testLong" : "123.45"^^xsd:float
      ":testLong" : "123.45"^^xsd:double
      ":testLong" : "123.45"^^xsd:decimal
    ```
  + `string`: si el valor de Neptune es una representación en cadena de un entero que puede estar contenido en un entero de 64 bits, entonces es válido y se convierte en `long` en OpenSearch. Cualquier otro valor de cadena no es válido para un mapeo `long` de Elasticseearch y se elimina el registro de actualización del flujo correspondiente.

    Estos son algunos ejemplos de valores de Gremlin válidos:

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

    Estos son algunos ejemplos de SPARQL válidos:

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

    Estos son algunos ejemplos de Gremlin no válidos:

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

    Estos son algunos ejemplos de SPARQL no válidos:

    ```
      ":testLong" : "123.45"^^xsd:string
      ":testLong" : "abc"
      ":testLong" : "9223372036854775900"^^xsd:string
    ```
+ **`double`**: si el tipo de mapeo de OpenSearch es `double`, se aplican las siguientes reglas (en este caso, se supone que el campo "testDouble" tiene un mapeo `double` en OpenSearch):
  + `boolean`: no es válido, no se puede convertir y se elimina el registro de actualización del flujo correspondiente.

    Estos son algunos ejemplos de Gremlin no válidos:

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

    Estos son algunos ejemplos de SPARQL no válidos:

    ```
      ":testDouble" : "true"^^xsd:boolean
      ":testDouble" : "false"^^xsd:boolean
    ```
  + `datetime`: no es válido, no se puede convertir y se elimina el registro de actualización del flujo correspondiente.

    Este es un ejemplo de un valor de Gremlin no válido:

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

    Este es un ejemplo de un valor de SPARQL no válido:

    ```
      ":testDouble" : "2016-01-01"^^xsd:date
    ```
  + `NaN` o `INF` de punto flotante: si el valor de SPARQL es un `NaN` o `INF` de punto flotante, entonces no es válido y se elimina el registro de actualización del flujo correspondiente.

    Estos son algunos ejemplos de SPARQL no válidos:

    ```
    "  :testDouble" : "NaN"^^xsd:float
      ":testDouble" : "NaN"^^double
      ":testDouble" : "INF"^^double
      ":testDouble" : "-INF"^^double
    ```
  + number o cadena numérica: si el valor de Neptune es cualquier otro número o cadena numérica que represente un número que se pueda expresar de forma segura como `double`, entonces es válido y se convierte en `double` en OpenSearch. Cualquier otro valor de cadena no es válido para un mapeo `double` de OpenSearch y se elimina el registro de actualización del flujo correspondiente.

    Estos son algunos ejemplos de valores de Gremlin válidos:

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

    Estos son algunos ejemplos de SPARQL válidos:

    ```
      ":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
    ```

    Este es un ejemplo de un valor de Gremlin no válido:

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

    Estos son algunos ejemplos de SPARQL no válidos:

    ```
      ":testDouble" : "abc"
    ```
+ **`date`**: si el tipo de mapeo de OpenSearch es `date`, los valores de `date` y `dateTime` de Neptune son válidos, al igual que cualquier valor de cadena que se pueda analizar correctamente en un formato `dateTime`.

  Estos son algunos ejemplos de valores válidos en Gremlin o SPARQL:

  ```
    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"
  ```

  Estos son ejemplos de valores no válidos:

  ```
    123.45
    True
    "abc"
  ```

# Ejemplos de consultas de OpenSearch sin cadenas en Neptune
<a name="full-text-search-non-string-examples"></a>

Actualmente, Neptune no admite directamente las consultas de rango de OpenSearch. Sin embargo, puede lograr el mismo efecto con la sintaxis de Lucene y query-type="query\$1string", como puede ver en las siguientes consultas de ejemplo.

## Obtenga todos los vértices con una antigüedad superior a 30 años y un nombre que comience por "Si"
<a name="full-text-search-non-string-example-1"></a>

En 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 .
  }
}
```

Aquí, se usa `"\\*foaf\\*age` en lugar del URI completo por motivos de concisión. Esta expresión regular recupera todos los campos que contengan tanto `foaf` como `age` en el URI.

## Obtenga todos los nodos con una antigüedad comprendida entre 10 y 50 años y un nombre con una coincidencia parcial con "Ronka"
<a name="full-text-search-non-string-example-2"></a>

En 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 .
  }
}
```

## Obtenga todos los nodos con una marca temporal que esté comprendida dentro de los últimos 25 días
<a name="full-text-search-non-string-example-3"></a>

En 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 .
  }
}
```

## Obtenga todos los nodos con una marca temporal que esté dentro de un año y un mes determinados
<a name="full-text-search-non-string-example-4"></a>

En Gremlin, usando [expresiones matemáticas de fecha](https://www.elastic.co/guide/en/elasticsearch/reference/7.x/common-options.html#date-math) en la sintaxis de Lucene, para diciembre de 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');
```

Una alternativa a 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 ejecución de consultas en Amazon Neptune
<a name="full-text-search-query-execution"></a>

En una consulta que incluye full-text-search, Neptune intenta poner las full-text-search llamadas primero, antes que otras partes de la consulta. Esto reduce el número de llamadas OpenSearch y, en la mayoría de los casos, mejora considerablemente el rendimiento. Sin embargo, esto no es de ninguna manera una hard-and-fast regla. Hay situaciones, por ejemplo, en las que `PatternNode` o `UnionNode` pueden preceder a una llamada de búsqueda de texto completo.

Analicemos la siguiente consulta de Gremlin a una base de datos que contiene 100 000 instancias de `Person`:

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

Si esta consulta se ejecutara en el orden en que aparecen los pasos, se generarían 100.000 soluciones OpenSearch, lo que provocaría cientos de OpenSearch llamadas. De hecho, Neptuno llama OpenSearch primero y después une los resultados con los resultados de Neptuno. En la mayoría de los casos, esto es mucho más rápido que ejecutar la consulta en el orden original.

Puede evitar este reordenamiento de la ejecución de pasos de la consulta utilizando la [sugerencia de consulta 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~');
```

En este segundo caso, se ejecuta primero el paso `.hasLabel` y después el paso `.has('name', 'Neptune#fts marcello~')`.

Para ver otro ejemplo, considere una consulta SPARQL con el mismo tipo de datos:

```
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 .
  }
}
```

De nuevo, aquí Neptune ejecuta primero la parte `SERVICE` de la consulta y, a continuación, une los resultados con los datos de `Person`. Puede suprimir este comportamiento utilizando la [sugerencia de consulta 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 .
  }
}
```

Nuevamente, en la segunda consulta las partes se ejecutan en el orden en que aparecen en la consulta.

**nota**  
 Consultar un alias de OpenSearch sobre un índice, en lugar de consultar directamente un índice de OpenSearch, puede producir resultados incorrectos. Debe consultar el índice de OpenSearch directamente y no el alias. 

# Consultas de SPARQL de ejemplo mediante la búsqueda de texto completo en Neptune
<a name="full-text-search-sparql-examples"></a>

A continuación, se presentan algunos ejemplos de consultas de SPARQL que utilizan la búsqueda de texto completo en Amazon Neptune.

## Ejemplo de consulta match de 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 .
  }
}
```

## Ejemplo de consulta prefix de 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 .
  }
}
```

## Ejemplo de consulta fuzzy de 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 .
  }
}
```

## Ejemplo de consulta term de 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 .
  }
}
```

## Ejemplo de consulta query\$1string de SPARQL
<a name="full-text-search-sparql-query_string"></a>

Esta consulta especifica varios campos.

```
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 .
  }
}
```

## Ejemplo de consulta simple\$1query\$1string de SPARQL
<a name="full-text-search-sparql-simple"></a>

La siguiente consulta especifica los campos con el carácter comodín ("\$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 .
  }
}
```

## Ejemplo de consulta sort by string field de 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 .
  }
}
```

## Ejemplo de consulta sort by non-string field de 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 .
  }
}
```

## Ejemplo de consulta sort by ID de 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 .
  }
}
```

## Ejemplo de consulta sort by label de 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 .
  }
}
```

## Ejemplo de consulta sort by doc\$1type de 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 .
  }
}
```

## Ejemplo del uso de la sintaxis de Lucene en SPARQL
<a name="full-text-search-sparql-lucene-syntax"></a>

La sintaxis de Lucene solo es compatible con las consultas `query_string` de 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 .
  }
}
```

# Uso de la búsqueda de texto completo de Neptune en las consultas de Gremlin
<a name="full-text-search-gremlin"></a>

`NeptuneSearchStep` permite las consultas de búsqueda de texto completo para la parte de un recorrido de Gremlin que no se convierte en pasos de Neptune. Por ejemplo, plantéese una consulta como la siguiente:

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

Esta consulta se convierte en el siguiente recorrido optimizado en 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}
    }
}]
```

Los siguientes ejemplos son de consultas de Gremlin de datos de rutas aéreas:

## Consulta `match` básica que no distingue entre mayúsculas y minúsculas de Gremlin
<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]
```

## Consulta `match` de Gremlin
<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]
```

## Consulta `fuzzy` de Gremlin
<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
```

## Consulta `query_string` aproximada de Gremlin
<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
```

## Consulta de expresión regular `query_string` de Gremlin
<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
```

## Consulta híbrida de Gremlin
<a name="full-text-search-gremlin-hybrid"></a>

Esta consulta utiliza un índice interno de Neptune y el OpenSearch índice de la misma consulta.

```
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
```

## Ejemplo de búsqueda de texto completo sencilla de 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]
```

## Consulta de Gremlin con `query_string` y los operadores “\$1” y “-”
<a name="full-text-search-gremlin-query_string-plus-minus"></a>

Aunque el tipo de consulta `query_string` es mucho menos tolerante que el tipo predeterminado `simple_query_string`, permite consultas más precisas. La primera consulta a continuación utiliza `query_string`, mientras que la segunda utiliza el valor predeterminado `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]
```

Observe cómo `simple_query_string` en los ejemplos siguientes no tiene en cuenta los operadores “\$1” y “-” progresivamente:

```
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]
```

## Consulta `query_string` de Gremlin con los operadores `AND` y `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]
```

## Consulta `term` de Gremlin
<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]
```

## Consulta `prefix` de Gremlin
<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]
```

## Uso de la sintaxis de Lucene en Neptune Gremlin
<a name="full-text-search-gremlin-lucene"></a>

En Neptune Gremlin, también puede escribir consultas muy eficaces con la sintaxis de consulta de Lucene. Tenga en cuenta que la sintaxis de Lucene solo se admite para `query_string` consultas en. OpenSearch

Suponga los siguientes datos:

```
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")
```

Usando la sintaxis de Lucene, que se invoca cuando `queryType` es `query_string`, puede buscar estos datos por nombre y apellido de la siguiente manera:

```
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]
```

Tenga en cuenta que en el paso `has()` anterior, el campo se reemplaza por `"*"`. En realidad, cualquier valor colocado allí se sustituye por los campos a los que tiene acceso desde la consulta. Puede acceder al campo de nombre utilizando `predicates.name.value,` porque así es como está estructurado el modelo de datos.

Puede buscar por nombre, apellido y etiqueta, de la siguiente manera:

```
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]
```

Se obtiene acceso a la etiqueta utilizando `entity_type`, de nuevo porque así es como está estructurado el modelo de datos.

También puede incluir condiciones de anidamiento:

```
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]
```

## Insertar un gráfico moderno 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')
```

## Ejemplo de valor del campo Ordenar por cadena
<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')
```

## Ejemplo de valor del campo Ordenar por no cadena
<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')
```

## Ejemplo de valor del campo Ordenar por 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')
```

## Ejemplo de valor del campo Ordenar por etiqueta
<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')
```

## Ejemplo de valor del campo Ordenar por `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')
```

# Solución de problemas de búsqueda de texto completo de Neptune
<a name="streams-consumer-troubleshooting"></a>

**nota**  
Si ha habilitado un [control de acceso detallado](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html) en su OpenSearch clúster, también debe [habilitar la autenticación de IAM en](iam-auth-enable.md) su base de datos de Neptune.

Para diagnosticar problemas con la replicación de Neptune a OpenSearch, consulte los CloudWatch registros de la función Lambda de su encuestador. Estos registros proporcionan detalles sobre el número de registros leídos de la transmisión y el número de registros en los que se han replicado correctamente. OpenSearch

También puede cambiar el nivel de REGISTRO para la función de Lambda al cambiar la variable del entorno `LoggingLevel`.

**nota**  
Si `LoggingLevel` se establece en`DEBUG`, puede ver detalles adicionales, como los registros de flujos descartados y el motivo por el que se descartó cada uno, al tiempo que replica los datos StreamPoller de Neptuno OpenSearch a. Esto puede resultar útil si descubre que le faltan registros.

La aplicación Neptune Streams para consumidores publica dos métricas CloudWatch que también pueden ayudarle a diagnosticar problemas:
+ `StreamRecordsProcessed` – El número de registros procesados por la aplicación por unidad de tiempo. Útil en el seguimiento de la tasa de ejecución de la aplicación.
+ `StreamLagTime` – El tiempo que transcurre en milisegundos entre la hora actual y la hora de confirmación de un registro de transmisión que se está procesando. Esta métrica muestra hasta qué punto la aplicación del consumidor se queda rezagada.

Además, todas las métricas relacionadas con el proceso de replicación se exponen en un panel con el mismo nombre que el que se `ApplicationName` proporcionó al crear una instancia de la aplicación mediante la plantilla. CloudWatch CloudWatch 

También puede optar por crear una CloudWatch alarma que se active cada vez que el sondeo falle más de dos veces seguidas. Para ello, establezca el campo `CreateCloudWatchAlarm` en `true` cuando cree una instancia para la aplicación. A continuación, especifique las direcciones de correo electrónico a las que desea que se le notifique cuando se active la alarma.

## Solución de problemas de un proceso que falla al leer los registros de la secuencia
<a name="streams-consumer-troubleshooting-reads"></a>

Si un proceso falla al leer los registros del flujo, asegúrese de que tenga lo siguiente:
+ El flujo está habilitado en el clúster.
+ El punto de conexión de la transmisión de Neptune está en el formato correcto:
  + Para Gremlin u openCypher: `https://your cluster endpoint:your cluster port/propertygraph/stream` o su alias, `https://your cluster endpoint:your cluster port/pg/stream`.
  + Para SPARQL: `https://your cluster endpoint:your cluster port/sparql/stream`

  
+ El punto de conexión de DynamoDB está configurado para la VPC.
+ El punto de conexión de monitorización está configurado para las subredes de VPC.

## Solución de problemas de un proceso que produce un error al escribir datos en OpenSearch
<a name="streams-consumer-troubleshooting-writes"></a>

Si se produce un error al escribir registros en él OpenSearch, asegúrese de tener lo siguiente:
+ Que cuente con la versión de Elasticsearch 7.1 o posterior; Opensearch 2.3 y versiones posteriores.
+ OpenSearch se puede acceder a ella desde la función Lambda del sondeador de su VPC.
+ La política de seguridad adjunta OpenSearch permite las solicitudes entrantes. HTTP/HTTPS 

## Solución de out-of-sync problemas entre Neptune y OpenSearch en una configuración de replicación existente
<a name="streams-consumer-troubleshooting-sync-issues"></a>

Puede seguir los pasos que se indican a continuación para volver a sincronizar una base de datos y un OpenSearch dominio de Neptune con los datos más recientes en caso de que surjan out-of-sync problemas entre ellos debido a una corrupción de datos `ExpiredStreamException` o a una corrupción de los mismos.

Tenga en cuenta que este enfoque elimina todos los datos del OpenSearch dominio y los vuelve a sincronizar del estado actual de la base de datos de Neptuno, por lo que no es necesario volver a cargar datos en la base de datos de Neptuno.

1. Deshabilite el proceso de replicación, tal y como se describe en [Deshabilitar (pausar) el proceso del sondeador de transmisiones](full-text-search-pause-poller.md).

1. Elimine el índice de Neptune en el OpenSearch dominio mediante el siguiente comando:

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

1. Cree un clon de la base de datos (consulte [Database Cloning in Neptune](manage-console-cloning.md)).

1. Obtenga el último `eventID` de los flujos de la base de datos clonada mediante la ejecución de un comando de este tipo en el punto de conexión de la API de flujos (consulte [Calling the Neptune Streams REST API](streams-using-api-call.md) para obtener más información):

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

   Anote los valores de los campos `commitNum` y `opNum` del objeto `lastEventId` en la respuesta.

1. Usa la [export-neptune-to-elasticsearch](https://github.com/awslabs/amazon-neptune-tools/tree/master/export-neptune-to-elasticsearch)herramienta en GitHub para realizar una sincronización única desde la base de datos clonada con el OpenSearch dominio.

1. Vaya a la tabla de DynamoDB de la pila de replicación. El nombre de la tabla será el **nombre de la aplicación** que especificaste en la CloudFormation plantilla (el predeterminado es`NeptuneStream`) con un `-LeaseTable` sufijo. Es decir, el nombre de la tabla predeterminado es `NeptuneStream-LeaseTable`.

   Realice un escaneo para explorar las filas de la tabla, ya que solo debe haber una fila en la tabla. Realice los siguientes cambios con los valores `commitNum` y `opNum` que ha registrado anteriormente:
   + Cambie el valor del campo `checkpoint` de la tabla por el valor que ha anotado para `commitNum`.
   + Cambie el valor del campo `checkpointSubSequenceNumber` de la tabla por el valor que ha anotado para `opNum`.

1. Vuelva a habilitar el proceso de replicación, tal y como se describe en [Volver a habilitar el proceso del sondeador de transmisiones](full-text-search-re-enable-poller.md).

1. Elimine la base de datos clonada y la CloudFormation pila creada para la `export-neptune-to-elasticsearch` herramienta.