Importación y administración de paquetes en Amazon OpenSearch Service
Amazon OpenSearch Service le permite cargar archivos de diccionario personalizados, como listas de palabras vacías (stop words) y sinónimos y asociar complementos con su dominio. Estos complementos pueden ser preempaquetados, personalizados o de terceros, lo que le brinda flexibilidad para ampliar la funcionalidad de su dominio. El término genérico para referirse a todos estos tipos de archivos es paquetes.
-
Los archivos de diccionario ayudan a perfeccionar los resultados de búsqueda al indicar a OpenSearch que ignore palabras comunes de alta frecuencia o que trate términos similares, como “crema helada”, “helado” y “sorbete” como equivalentes. También pueden mejorar la derivación
, como se observa con el complemento de análisis japonés (kuromoji). -
Los complementos preempaquetados ofrecen funciones integradas, como el complemento Amazon Personalize para obtener resultados de búsqueda personalizados. Estos complementos utilizan el tipo de paquete
ZIP-PLUGIN. Para obtener más información, consulte Complementos según la versión de motor en Amazon OpenSearch Service. -
Los complementos personalizados y de terceros le permiten agregar características personalizadas o integrarlos con sistemas externos, lo que ofrece aún más flexibilidad para su dominio. Al igual que los complementos preempaquetados, sube los complementos personalizados como paquetes
ZIP-PLUGIN. En el caso de los complementos de terceros, también debe importar los archivos de licencia y configuración del complemento como paquetes independientes y, a continuación, asociarlos todos al dominio.Para obtener más información, consulte los temas siguientes:
nota
Puede asociar un máximo de 20 complementos con un único dominio. Este límite incluye todos los tipos de complementos: opcionales, de terceros y personalizados.
Temas
Permisos necesarios
Los usuarios sin acceso de administrador requieren ciertas acciones de AWS Identity and Access Management (IAM) para administrar paquetes:
-
es:CreatePackage: crear un paquete -
es:DeletePackage: eliminar un paquete -
es:AssociatePackage: asociar un paquete a un dominio -
es:DissociatePackage: disociar un paquete de un dominio
También necesita permisos en la ruta del bucket de Amazon S3 u objeto donde reside el paquete personalizado.
Otorgue todos los permisos en IAM, no en la política de acceso al dominio. Para más información, consulte Identity and Access Management en Amazon OpenSearch Service.
Carga de paquetes en Amazon S3
Esta sección explica cómo cargar paquetes de diccionarios personalizados, dado que los paquetes de complementos prediseñados ya están instalados. Antes de poder asociar un diccionario personalizado a un dominio, debe cargarlo en un bucket de Amazon S3. Para ver las instrucciones, consulte Carga de objetos en la Guía del usuario de Amazon Simple Storage Service. No es necesario cargar los complementos admitidos.
Si el diccionario contiene información confidencial, especifique el cifrado del servidor mediante claves administradas por S3 al cargarlo. El Servicio OpenSearch no puede acceder a archivos en S3 protegidos con una clave AWS KMS.
Después de cargar el archivo, tome nota de su ruta de S3. El formato de la ruta es s3://.amzn-s3-demo-bucket/file-path/file-name
Puede utilizar el siguiente archivo de sinónimos para fines de prueba. Guárdelo como synonyms.txt.
danish, croissant, pastry ice cream, gelato, frozen custard sneaker, tennis shoe, running shoe basketball shoe, hightop
Algunos diccionarios, como los diccionarios Hunspell, utilizan varios archivos y requieren sus propios directorios en el sistema de archivos. En este momento, OpenSearch Service solo admite diccionarios de un solo archivo.
Importación y asociación de paquetes
La consola es la forma más sencilla de importar un diccionario personalizado a OpenSearch Service. Al importar un diccionario desde Amazon S3, OpenSearch Service almacena su propia copia del paquete y cifra automáticamente esa copia mediante AES-256 con claves administradas por OpenSearch Service.
Los complementos opcionales ya vienen preinstalados en OpenSearch Service, por lo que no es necesario que los cargue usted mismo, pero sí debe asociar un complemento a un dominio. Los complementos disponibles aparecen en la pantalla Paquetes de la consola.
-
En la consola de Amazon OpenSearch Service, seleccione Paquetes.
-
Elija Import package (Importar paquete).
-
Asigne al paquete un nombre descriptivo.
-
Proporcione la ruta de S3 al archivo y, a continuación, elija Importar.
-
Vuelva a la pantalla Paquetes.
-
Cuando el estado del paquete sea Disponible, elíjalo.
-
Seleccione Asociar a un dominio.
-
Seleccione un dominio y, a continuación, elija Siguiente. Revise los paquetes y seleccione Asociar.
-
En el panel de navegación, seleccione el dominio y, a continuación, vaya a la pestaña Paquetes.
-
Si el paquete es un diccionario personalizado, anote el ID cuando el paquete esté disponible. Utilice
analyzers/como ruta de acceso del archivo en las solicitudes a OpenSearch.id
Uso de paquetes con OpenSearch
Esta sección explica cómo usar ambos tipos de paquetes: diccionarios personalizados y complementos prediseñados.
Uso de diccionarios personalizados
Después de asociar un archivo a un dominio, puede usarlo en parámetros como synonyms_path, stopwords_path y user_dictionary al crear generadores de tokens y filtros de token. El parámetro exacto varía según el objeto. Varios objetos admiten synonyms_path y stopwords_path, pero user_dictionary es exclusivo del complemento kuromoji.
Para el complemento IK (chino) Analysis, puede cargar un archivo de diccionario personalizado en forma de paquete personalizado y asociarlo a un dominio, y el complemento lo recogerá automáticamente sin necesidad de parámetro user_dictionary. Si se trata de un archivo de sinónimos, utilice el parámetro synonyms_path.
El siguiente ejemplo agrega un archivo de sinónimos a un nuevo índice:
PUTmy-index{ "settings": { "index": { "analysis": { "analyzer": { "my_analyzer": { "type": "custom", "tokenizer": "standard", "filter": ["my_filter"] } }, "filter": { "my_filter": { "type": "synonym", "synonyms_path": "analyzers/F111111111", "updateable": true } } } } }, "mappings": { "properties": { "description": { "type": "text", "analyzer": "standard", "search_analyzer": "my_analyzer" } } } }
Esta solicitud crea un analizador personalizado para el índice que utiliza el generador de tokens estándar y un filtro de token de sinónimos.
-
Los generadores de tokens dividen las secuencias de caracteres en tokens (normalmente palabras) en función de algún conjunto de reglas. El ejemplo más simple es el generador de tokens de espacios en blanco, que divide los caracteres anteriores en un token cada vez que encuentra un carácter de espacio en blanco. Un ejemplo más complejo es el generador de tokens estándar, que utiliza un conjunto de reglas gramaticales para funcionar en muchos idiomas.
-
Los filtros de tokens agregan, modifican o eliminan tokens. Por ejemplo, un filtro de token de sinónimos agrega tokens cuando encuentra una palabra en la lista de sinónimos. El filtro de tokens de palabras vacías elimina los tokens cuando encuentra una palabra en la lista de palabras vacías.
Esta solicitud también agrega un campo de texto (description) al mapeo e indica a OpenSearch que utilice el nuevo analizador como analizador de búsqueda. Puede ver que todavía utiliza el analizador estándar como analizador de índices.
Por último, tenga en cuenta la línea "updateable": true en el filtro de token. Este campo solo se aplica a los analizadores de búsqueda, no a los analizadores de índice, y es crítico si luego desea actualizar el analizador de búsqueda de forma automática.
Con fines de prueba, agregue algunos documentos al índice:
POST _bulk { "index": { "_index": "my-index", "_id": "1" } } { "description": "ice cream" } { "index": { "_index": "my-index", "_id": "2" } } { "description": "croissant" } { "index": { "_index": "my-index", "_id": "3" } } { "description": "tennis shoe" } { "index": { "_index": "my-index", "_id": "4" } } { "description": "hightop" }
A continuación, use un sinónimo para buscarlos:
GET my-index/_search { "query": { "match": { "description": "gelato" } } }
En este caso, OpenSearch devuelve la siguiente respuesta:
{
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.99463606,
"hits": [{
"_index": "my-index",
"_type": "_doc",
"_id": "1",
"_score": 0.99463606,
"_source": {
"description": "ice cream"
}
}]
}
}
sugerencia
Los archivos de diccionario utilizan espacio de montón de Java proporcional a su tamaño. Por ejemplo, un archivo de diccionario de 2 GiB podría consumir 2 GiB de espacio de montón en un nodo. Si utiliza archivos de gran tamaño, asegúrese de que los nodos tengan suficiente espacio en el montón para acomodarlos. Monitoree la métrica JVMMemoryPressure y escale el clúster según sea necesario.
Uso de complementos preempaquetados
El servicio OpenSearch le permite asociar complementos de OpenSearch opcionales y preinstalados para usarlos con su dominio. Un paquete de complementos preempaquetados es compatible con una versión específica de OpenSearch y solo se puede asociar a los dominios con esa versión. La lista de paquetes disponibles para su dominio incluye todos los complementos compatibles con la versión de su dominio. Después de asociar un complemento a un dominio, comienza un proceso de instalación en el dominio. Luego, puede hacer referencia al complemento y usarlo cuando realice solicitudes a OpenSearch Service.
Asociar y disociar un complemento requiere una implementación azul/verde. Para más información, consulte Cambios que suelen causar implementaciones azul/verde.
Los complementos opcionales incluyen analizadores de idioma y resultados de búsqueda personalizados. Por ejemplo, el complemento Amazon Personalize Search Ranking utiliza machine learning para personalizar los resultados de búsqueda para sus clientes. Para obtener más información sobre este complemento, consulte Personalización de los resultados de búsqueda desde OpenSearch. Para ver una lista de todos los complementos admitidos, consulte Complementos según la versión de motor en Amazon OpenSearch Service.
Complemento Sudachi
En el caso del complemento Sudachi
Además, el complemento Sudachi solo admite diccionarios binarios de Sudachi, que puede cargar con la operación de API CreatePackage. Para obtener información sobre el diccionario del sistema prediseñado y el proceso de compilación de diccionarios de usuario, consulte Documentación de Sudachi
En el siguiente ejemplo, se muestra cómo utilizar los diccionarios de sistema y de usuario con el tokenizador de Sudachi. Debe cargar estos diccionarios como paquetes personalizados con el tipo TXT-DICTIONARY y proporcionar sus ID de paquete en la configuración adicional.
PUT sudachi_sample { "settings": { "index": { "analysis": { "tokenizer": { "sudachi_tokenizer": { "type": "sudachi_tokenizer", "additional_settings": "{\"systemDict\": \"<system-dictionary-package-id>\",\"userDict\": [\"<user-dictionary-package-id>\"]}" } }, "analyzer": { "sudachi_analyzer": { "filter": ["my_searchfilter"], "tokenizer": "sudachi_tokenizer", "type": "custom" } }, "filter":{ "my_searchfilter": { "type": "sudachi_split", "mode": "search" } } } } } }
Actualización de paquetes
En esta sección solo se explica cómo actualizar un paquete de diccionarios personalizados, ya que los paquetes de complementos preempaquetados ya están actualizados. Al cargar una nueva versión de un diccionario en Amazon S3, no se actualiza automáticamente el paquete en Amazon OpenSearch Service. OpenSearch Service almacena su propia copia del archivo, por lo que si carga una nueva versión en S3, debe actualizarla de forma manual.
Cada uno de los dominios asociados también almacena su propia copia del archivo. Para mantener el comportamiento de búsqueda predecible, los dominios siguen utilizando la versión actual del paquete hasta que los actualice explícitamente. Para actualizar un paquete personalizado, modifique el archivo en Amazon S3 Control, actualice el paquete en OpenSearch Service y, a continuación, aplique la actualización.
-
En la consola de OpenSearch Service, seleccione Paquetes.
-
Seleccione un paquete y luego Actualizar.
-
Proporcione una nueva ruta de S3 al archivo y, a continuación, seleccione Actualizar paquete.
-
Vuelva a la pantalla Paquetes.
-
Cuando el estado del paquete cambie a Disponible, selecciónelo. A continuación, seleccione uno o más dominios asociados, Aplicar actualización y confirme. Espere a que el estado de asociación cambie a Activo.
-
Los siguientes pasos variarán en función de cómo haya configurado los índices:
-
Si el dominio ejecuta OpenSearch o Elasticsearch 7.8 o posterior y solo utiliza analizadores de búsqueda con el campo actualizable establecido en verdadero, no es necesario llevar a cabo ninguna acción adicional. OpenSearch Service actualiza automáticamente los índices mediante la API _plugins/_refresh_search_analyzers
. -
Si el dominio ejecuta Elasticsearch 7.7 o una versión anterior, utiliza analizadores de índice o no utiliza el campo
updateable, consulte Actualización manual de los índices con un nuevo diccionario.
-
Aunque la consola es el método más simple, también puede utilizar la AWS CLI, los SDK o la API de configuración para actualizar paquetes de OpenSearch Service. Para más información, consulte AWS CLI Command Reference y Amazon OpenSearch Service API Reference.
En lugar de actualizar de forma manual un paquete en la consola, puede utilizar los SDK para automatizar el proceso de actualización. El siguiente ejemplo de script de Python carga un nuevo archivo de paquete en Amazon S3, actualiza el paquete en OpenSearch Service y aplica el nuevo paquete al dominio especificado. Después de confirmar que la actualización se realizó correctamente, realiza una llamada de ejemplo a OpenSearch para demostrar que los nuevos sinónimos se aplicaron.
Debe proporcionar valores para host, region, file_name, bucket_name, s3_key, package_id, domain_name y query.
from requests_aws4auth import AWS4Auth import boto3 import requests import time import json import sys host = '' # The OpenSearch domain endpoint with https:// and a trailing slash. For example, https://my-test-domain.us-east-1.es.amazonaws.com/ region = '' # For example, us-east-1 file_name = '' # The path to the file to upload bucket_name = '' # The name of the S3 bucket to upload to s3_key = '' # The name of the S3 key (file name) to upload to package_id = '' # The unique identifier of the OpenSearch package to update domain_name = '' # The domain to associate the package with query = '' # A test query to confirm the package has been successfully updated service = 'es' credentials = boto3.Session().get_credentials() client = boto3.client('opensearch') awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) def upload_to_s3(file_name, bucket_name, s3_key): """Uploads file to S3""" s3 = boto3.client('s3') try: s3.upload_file(file_name, bucket_name, s3_key) print('Upload successful') return True except FileNotFoundError: sys.exit('File not found. Make sure you specified the correct file path.') def update_package(package_id, bucket_name, s3_key): """Updates the package in OpenSearch Service""" print(package_id, bucket_name, s3_key) response = client.update_package( PackageID=package_id, PackageSource={ 'S3BucketName': bucket_name, 'S3Key': s3_key } ) print(response) def associate_package(package_id, domain_name): """Associates the package to the domain""" response = client.associate_package( PackageID=package_id, DomainName=domain_name) print(response) print('Associating...') def wait_for_update(domain_name, package_id): """Waits for the package to be updated""" response = client.list_packages_for_domain(DomainName=domain_name) package_details = response['DomainPackageDetailsList'] for package in package_details: if package['PackageID'] == package_id: status = package['DomainPackageStatus'] if status == 'ACTIVE': print('Association successful.') return elif status == 'ASSOCIATION_FAILED': sys.exit('Association failed. Please try again.') else: time.sleep(10) # Wait 10 seconds before rechecking the status wait_for_update(domain_name, package_id) def sample_search(query): """Makes a sample search call to OpenSearch""" path = '_search' params = {'q': query} url = host + path response = requests.get(url, params=params, auth=awsauth) print('Searching for ' + '"' + query + '"') print(response.text)
nota
Si recibe un error “paquete no encontrado” al ejecutar el script mediante la AWS CLI, es probable que signifique que Boto3 utiliza la región especificada en ~/.aws/config, que no es la región en la que se encuentra el bucket de S3. Puede ejecutar aws configure y especificar la región correcta o agregar explícitamente la región al cliente:
client = boto3.client('opensearch', region_name='us-east-1')
Actualización manual de los índices con un nuevo diccionario
Las actualizaciones manuales de índices solo se aplican a los diccionarios personalizados, no a los complementos preempaquetados. Para utilizar un diccionario actualizado, debe actualizar de forma manual los índices, si cumple alguna de las siguientes condiciones:
-
El dominio ejecuta Elasticsearch 7.7 o anterior.
-
Utiliza paquetes personalizados como analizadores de índices.
-
Utiliza paquetes personalizados como analizadores de búsqueda, pero no incluye el campo actualizable.
Para actualizar los analizadores con los nuevos archivos de paquete, dispone de dos opciones:
-
Cierre y abra los índices que desee actualizar:
POSTmy-index/_close POSTmy-index/_open -
Vuelva a indexar los índices. Primero, cree un índice que utilice el archivo de sinónimos actualizado (o un archivo completamente nuevo). Tenga en cuenta que solo se admite UTF-8.
PUTmy-new-index{ "settings": { "index": { "analysis": { "analyzer": { "synonym_analyzer": { "type": "custom", "tokenizer": "standard", "filter": ["synonym_filter"] } }, "filter": { "synonym_filter": { "type": "synonym", "synonyms_path": "analyzers/F222222222" } } } } }, "mappings": { "properties": { "description": { "type": "text", "analyzer": "synonym_analyzer" } } } }Luego vuelva a indexar
el índice anterior con ese nuevo índice: POST _reindex { "source": { "index": "my-index" }, "dest": { "index": "my-new-index" } }Si actualiza con frecuencia los analizadores de índices, utilice alias de índice
para mantener una ruta coherente al índice más reciente: POST _aliases { "actions": [ { "remove": { "index": "my-index", "alias": "latest-index" } }, { "add": { "index": "my-new-index", "alias": "latest-index" } } ] }Si no necesita el índice anterior, elimínelo:
DELETEmy-index
Disociación y eliminación de paquetes
Si disocia un paquete de un dominio, ya sea un diccionario personalizado o un complemento preempaquetado, ya no podrá usar ese paquete cuando cree nuevos índices. Una vez disociado un paquete, los índices existentes que utilizaban el paquete ya no pueden usarlo. Debe eliminar el paquete de cualquier índice antes de poder disociarlo; de lo contrario, la disociación fallará.
La consola es la forma más sencilla de disociar un paquete de un dominio y eliminarlo de OpenSearch Service. La eliminación de un paquete de OpenSearch Service no lo elimina de la ubicación original en Amazon S3.
-
Inicie sesión en la consola de Amazon OpenSearch Service en https://console.aws.amazon.com/aos/home
. -
En el panel de navegación, elija Dominios.
-
Elija el dominio y, a continuación, vaya a la pestaña Paquetes.
-
Seleccione un paquete, Acciones y, a continuación, seleccione Disociar. Confirme su elección.
-
Espere a que el paquete desaparezca de la lista. Puede que tenga que actualizar el navegador.
-
Si desea utilizar el paquete con otros dominios, deténgase aquí. Para continuar con la eliminación del paquete (si es un diccionario personalizado), seleccione Paquetes en el panel de navegación.
-
Seleccione el paquete y elija Eliminar.
Si lo prefiere, puede usar la AWS CLI, los SDK o la API de configuración para disociar y eliminar paquetes. Para más información, consulte AWS CLI Command Reference y Amazon OpenSearch Service API Reference.