Importar e gerenciar pacotes no Amazon OpenSearch Service - Amazon OpenSearch Service

Importar e gerenciar pacotes no Amazon OpenSearch Service

O Amazon OpenSearch Service permite carregar arquivos de dicionários personalizados, como palavras irrelevantes e sinônimos, e também associar plug-ins ao seu domínio. Esses plug-ins podem ser pré-empacotados, personalizados ou de terceiros, o que dá a você flexibilidade para estender a funcionalidade do domínio. O termo genérico para todos esses tipos de arquivos é pacotes.

  • Arquivos de dicionários refinam os resultados de pesquisa instruindo o OpenSearch a ignorar palavras de alta frequência comuns ou a tratar termos como "creme congelado", "gelato" e "sorvete" como equivalentes. Eles também podem melhorar a redução à raiz, como no plug-in de análise japonês (kuromoji).

  • Os plug-ins pré-empacotados fornecem funcionalidade integrada, como o plug-in Amazon Personalize, para gerar resultados de pesquisa personalizados. Esses plug-ins usam o tipo de pacote ZIP-PLUGIN. Para obter mais informações, consulte Plug-ins por versão do mecanismo no Amazon OpenSearch Service.

  • Plug-ins personalizados e de terceiros permitem adicionar atributos personalizados ou integrar com sistemas externos, o que oferece ainda mais flexibilidade ao domínio. Como acontece com os plug-ins pré-empacotados, você carrega os plug-ins personalizados como pacotes da ZIP-PLUGIN. Para plug-ins de terceiros, é necessário também importar a licença do plug-in e os arquivos de configuração como pacotes separados e associá-los ao domínio.

    Para obter mais informações, consulte os seguintes tópicos:

nota

Você pode associar até 20 plug-ins a um único domínio. Esse limite inclui todos os tipos de plug-ins: opcionais, de terceiros e personalizados.

Permissões obrigatórias

Os usuários sem acesso de administrador exigem determinadas ações do AWS Identity and Access Management (IAM) para gerenciar pacotes:

  • es:CreatePackage: criar um pacote

  • es:DeletePackage: excluir um pacote

  • es:AssociatePackage: associar um pacote a um domínio

  • es:DissociatePackage: desassociar um pacote de um domínio

Você também precisa de permissões no caminho do bucket do Amazon S3 ou no objeto em que o pacote personalizado reside.

Conceda todas as permissões no IAM, e não na política de acesso ao domínio. Para obter mais informações, consulte Gerenciamento de identidade e acesso no Amazon OpenSearch Service.

Carregar pacotes para o Amazon S3

Esta seção aborda como carregar pacotes de dicionários personalizados, já que os pacotes de plug-ins pré-empacotados já estão pré-instalados. Antes de associar um dicionário customizado ao seu domínio, você deverá carregá-lo em um bucket do Amazon S3. Para obter mais informações, consulte Carregar objetos no Manual do usuário do Amazon Simple Storage Service. Plug-ins compatíveis não precisam ser carregados.

Se o dicionário contiver informações confidenciais, especifique a criptografia do lado do servidor com chaves gerenciadas pelo S3 ao carregá-lo. O OpenSearch Service não pode acessar arquivos no S3 que foram protegidos com uma chave do AWS KMS.

Depois de carregar o arquivo, anote o caminho do S3. O formato do caminho é s3://amzn-s3-demo-bucket/file-path/file-name.

Você pode usar o seguinte arquivo de sinônimos para fazer testes. Salve-o como synonyms.txt.

danish, croissant, pastry ice cream, gelato, frozen custard sneaker, tennis shoe, running shoe basketball shoe, hightop

Certos dicionários, como dicionários Hunspell, usam vários arquivos e exigem seus próprios diretórios no sistema de arquivos. No momento, o OpenSearch Service oferece suporte somente a dicionários de arquivo único.

Importação e associação de pacotes

O console é a maneira mais simples de importar um dicionário personalizado para o OpenSearch Service. Quando você importa um dicionário do Amazon S3, o OpenSearch Service armazena sua própria cópia do pacote e a criptografa automaticamente usando AES-256 com chaves gerenciadas de serviço do OpenSearch.

Os plug-ins opcionais já estão pré-instalados no OpenSearch Service, então você não precisa carregá-los, mas é necessário associar um plug-in a um domínio. Os plug-ins disponíveis estão listados na tela Pacotes, no console.

  1. No console do Amazon OpenSearch Service, escolha Pacotes.

  2. Escolha Import package (Importar pacote).

  3. Dê um nome descritivo ao pacote.

  4. Forneça o caminho do S3 até o arquivo e selecione Import (Importar).

  5. Retorne à tela Pacotes.

  6. Quando o status do pacote estiver Disponível, selecione-o.

  7. Escolha Associar a um domínio.

  8. Selecione um domínio e escolha Avançar. Revise os pacotes e escolha Associar.

  9. No painel de navegação, escolha o domínio vá para a guia Pacotes.

  10. Se o pacote for um dicionário personalizado, anote o ID quando o pacote se tornar Disponível. Use analyzers/id como o caminho do arquivo em solicitações ao OpenSearch.

Uso de pacotes com o OpenSearch

Esta seção aborda como usar os dois tipos de pacotes: dicionários personalizados e plug-ins opcionais.

Uso de dicionários customizados

Depois de associar um arquivo a um domínio, será possível usá-lo em parâmetros como synonyms_path, stopwords_path e user_dictionary ao criar tokenizadores e filtros de token. O parâmetro exato varia de acordo com o objeto. Vários objetos oferecem suporte a synonyms_path e stopwords_path, mas user_dictionary é exclusivo para o plug-in kuromoji.

Para o plug-in de análise IK (chinês), você pode carregar um arquivo de dicionário personalizado como um pacote personalizado e associá-lo a um domínio, e o plug-in o seleciona automaticamente sem exigir um parâmetro user_dictionary. Se seu arquivo for um arquivo de sinônimos, use o parâmetro synonyms_path.

O seguinte exemplo adiciona um arquivo de sinônimo a um novo índice:

PUT my-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 solicitação cria um analisador personalizado para o índice que utiliza o tokenizer padrão e um filtro de token de sinônimo.

  • Os tokenizers quebram fluxos de caracteres em tokens (normalmente palavras) de acordo com algum conjunto de regras. O exemplo mais simples é o tokenizer de espaço em branco, que divide os caracteres anteriores em um token cada vez que encontra um caractere de espaço em branco. Um exemplo mais complexo é o tokenizer padrão, que usa um conjunto de regras com base na gramática para trabalhar em vários idiomas.

  • Os filtros de token adicionam, modificam ou excluem tokens. Por exemplo, um filtro de token de sinônimo adiciona tokens quando encontra uma palavra na lista de sinônimos. O filtro de token de palavras irrelevantes remove tokens quando encontra uma palavra na lista de palavras irrelevantes.

Essa solicitação também adiciona um campo de texto (description) ao mapeamento e orienta o OpenSearch a usar o novo analisador como seu analisador de pesquisas. Você pode ver que ele ainda usa o analisador padrão como seu analisador de índices.

Finalmente, observe a linha "updateable": true no filtro de token. Este campo aplica-se somente a analisadores de pesquisas, e não a analisadores de índices, e será crítico se você desejar atualizar o analisador de pesquisas automaticamente.

Para fazer testes, adicione alguns documentos ao í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" }

Depois, pesquise-os usando um sinônimo:

GET my-index/_search { "query": { "match": { "description": "gelato" } } }

Nesse caso, o OpenSearch retorna esta resposta:

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

Arquivos de dicionário usam espaço de heap Java proporcional ao seu tamanho. Por exemplo, um arquivo de dicionário de 2 GiB pode consumir 2 GiB de espaço de heap em um nó. Ao usar arquivos grandes, verifique se os nós têm espaço de heap suficiente para acomodá-los. Monitore a métrica JVMMemoryPressure e dimensione o cluster conforme necessário.

Usar plug-ins pré-empacotados

O OpenSearch Service permite associar plug-ins OpenSearch opcionais pré-instalados para usar com seu domínio. Um pacote de plug-in pré-empacotado é compatível com uma versão específica do OpenSearch e pode ser associado apenas a domínios com essa versão. A lista de pacotes disponíveis para seu domínio inclui todos os plug-ins compatíveis com a versão do seu domínio. Depois de associar um plug-in a um domínio, um processo de instalação no domínio é iniciado. Em seguida, você pode consultar e usar o plug-in ao fazer solicitações ao OpenSearch Service.

Associar e dissociar um plug-in requer uma implantação azul/verde. Para obter mais informações, consulte Alterações que normalmente causam implantações azuis/verdes.

Plug-ins opcionais incluem analisadores de idioma e resultados de pesquisa personalizados. Por exemplo, o plug-in Amazon Personalize Search Ranking usa machine learning para personalizar os resultados da pesquisa para seus clientes. Para obter mais informações sobre esse plug-in, consulte Personalizar resultados de pesquisa do OpenSearch. Para obter uma lista de todos os plug-ins compatíveis, consulte Plug-ins por versão do mecanismo no Amazon OpenSearch Service.

Plug-in Sudachi

Quando você reassocia um arquivo de dicionário do plug-in Sudachi, ele não reflete imediatamente no domínio. O dicionário é atualizado quando a próxima implantação azul/verde é executada no domínio como parte de uma alteração de configuração ou outra atualização. Como alternativa, você pode criar um novo pacote com os dados atualizados, criar um novo índice usando esse novo pacote, reindexar o índice existente ao novo e, em seguida, excluir o índice antigo. Se preferir usar a abordagem de reindexação, use um alias de índice para que não haja interrupções no tráfego.

Além disso, o plug-in Sudachi é compatível apenas com dicionários Sudachi binários, que você pode carregar com a operação da API CreatePackage. Para obter informações sobre o dicionário do sistema pré-construído e o processo para compilar dicionários do usuário, consulte a documentação do Sudachi.

O exemplo a seguir demonstra como usar os dicionários do sistema e do usuário com o tokenizador do Sudachi. Você deve carregar esses dicionários como pacotes personalizados de tipo TXT-DICTIONARY e fornecer seus IDs de pacote nas configurações adicionais.

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

Atualização de pacotes

Esta seção aborda apenas como atualizar um pacote de dicionário personalizado, porque os pacotes de plug-ins pré-empacotados já foram atualizados para você. O carregamento de uma nova versão de um dicionário do Amazon S3 não atualiza automaticamente o pacote no Amazon OpenSearch Service. O OpenSearch Service armazena sua própria cópia do arquivo. Portanto, se você carregar uma nova versão no S3, precisará atualizá-la manualmente.

Cada um dos seus domínios associados armazena sua própria cópia do arquivo também. Para manter o comportamento de pesquisa previsível, os domínios continuarão a usar a versão atual do pacote até que você os atualize explicitamente. Para atualizar um pacote personalizado, modifique o arquivo no Amazon S3 Control, atualize o pacote no OpenSearch Service e, em seguida, aplique a atualização.

  1. No console do OpenSearch Service, escolha Pacotes.

  2. Escolha um pacote e, em seguida, Atualizar.

  3. Forneça um novo caminho do S3 para o arquivo e escolha Atualizar pacote.

  4. Retorne à tela Pacotes.

  5. Quando o status do pacote mudar para Disponível, selecione-o. Em seguida, escolha um ou mais domínios associados, Aplicar atualização e confirme. Aguarde até que o status da associação mude para Ativo.

  6. As próximas etapas variam dependendo de como você configurou os índices:

    • Se seu domínio estiver executando o OpenSearch ou o Elasticsearch 7.8 ou posterior e usando apenas analisadores de pesquisas com o campo atualizável definido como true (verdadeiro), você não precisa realizar nenhuma ação adicional. O OpenSearch Service atualiza automaticamente os índices usando a API _plugins/_refresh_search_analyzers.

    • Se o seu domínio estiver executando o Elasticsearch 7.7 ou anterior, usa analisadores de índices ou não usa o campo updateable, consulte Atualizar manualmente os índices com um novo dicionário.

Embora o console seja o método mais simples, você também pode usar o AWS CLI, SDKs ou a API de configuração para atualizar pacotes do OpenSearch Service. Para mais informações, leia Referência de comandos da AWS CLI e Referências de API do Amazon OpenSearch Service.

Em vez de atualizar manualmente um pacote no console, você pode usar os SDKs para automatizar o processo de atualização. O script Python de exemplo a seguir carrega um novo arquivo de pacote para o Amazon S3, atualiza o pacote no OpenSearch Service e aplica o novo pacote ao domínio especificado. Depois de confirmar que a atualização foi bem-sucedida, ele faz uma chamada de exemplo para o OpenSearch demonstrando que os novos sinônimos foram aplicados.

Você deve fornecer valores para host, region, file_name, bucket_name, s3_key, package_id, domain_name e 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

Se você receber um erro de “pacote não encontrado” ao executar o script usando a AWS CLI, isso provavelmente significa que o Boto3 está usando qualquer região especificada em ~/.aws/config, que não é a região em que seu bucket do S3 está. Execute aws configure e especifique a região correta ou adicione explicitamente a região ao cliente:

client = boto3.client('opensearch', region_name='us-east-1')

Atualizar manualmente os índices com um novo dicionário

As atualizações manuais de índice se aplicam somente aos dicionários personalizados, não aos plug-ins pré-empacotados. Para usar um dicionário atualizado, será necessário atualizar manualmente seus índices se você atender a qualquer uma das seguintes condições:

  • Seu domínio executa o Elasticsearch 7.7 ou anterior.

  • Você usa pacotes personalizados como analisadores de índices.

  • Você usa pacotes personalizados como analisadores de pesquisas, mas não inclui o campo atualizável.

Para atualizar os analisadores com os novos arquivos de pacote, você tem duas opções:

  • Feche e abra todos os índices que deseja atualizar:

    POST my-index/_close POST my-index/_open
  • Reindexe os índices. Primeiro, crie um índice que use o arquivo de sinônimos atualizado (ou um arquivo inteiramente novo). Observe que apenas o UTF-8 é compatível.

    PUT my-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" } } } }

    Depois reindexe o índice antigo para o novo:

    POST _reindex { "source": { "index": "my-index" }, "dest": { "index": "my-new-index" } }

    Se você atualiza analisadores de índices com frequência, use aliases de índices para manter um caminho consistente para o índice mais recente:

    POST _aliases { "actions": [ { "remove": { "index": "my-index", "alias": "latest-index" } }, { "add": { "index": "my-new-index", "alias": "latest-index" } } ] }

    Se não precisar do índice antigo, exclua-o:

    DELETE my-index

Dissociação e remoção de pacotes

Desassociar um pacote, seja um dicionário personalizado ou um plug-in pré-empacotado, de um domínio significa que você não poderá mais usar esse pacote ao criar novos índices. Depois que um pacote é dissociado, os índices existentes que estavam usando o pacote não podem mais usá-lo. Você deve remover o pacote de qualquer índice antes de poder dissociá-lo, caso contrário, a dissociação falhará.

O console é a maneira mais simples de dissociar um pacote de um domínio e removê-lo do OpenSearch Service. A remoção de um pacote do OpenSearch Service não o remove de sua localização original no Amazon S3.

  1. Faça login no console do Amazon OpenSearch Service em https://console.aws.amazon.com/aos/home.

  2. No painel de navegação à esquerda, escolha Domínios.

  3. Escolha o domínio e navegue até a guia Pacotes.

  4. Escolha um pacote, Ações e Dissociar. Confirme sua escolha.

  5. Aguarde até que o pacote desapareça da lista. Talvez seja necessário atualizar o navegador.

  6. Se desejar usar o pacote com outros domínios, pare aqui. Para continuar com a remoção do pacote (se for um dicionário customizado), escolha Pacotes no painel de navegação.

  7. Selecione o pacote e Excluir.

Como alternativa, use a AWS CLI, os SDKs ou a API de configuração para dissociar e remover pacotes. Para mais informações, leia Referência de comandos da AWS CLI e Referências de API do Amazon OpenSearch Service.