Fazendo upload de arquivos para a Elasticsearch

Alguns recursos da Elasticsearch permitem que os índices leiam arquivos no sistema de arquivos. Portanto, o IBM Cloud® Databases for Elasticsearch permite que você faça upload de arquivos em sua implementação. Os arquivos são armazenados em um local conhecido e a Elasticsearch é configurada de maneira que seja permitido ler arquivos do local.

Os arquivos que são transferidos por upload para a sua implementação usam recursos de disco, tanto no índice quanto no sistema de arquivos. Certifique-se de que você escale a sua implementação antes de fazer upload de arquivos.

Processo básico

  1. Você codifica em base64 o arquivo no lado do cliente.
  2. As sequências de base64 são armazenadas como documentos em um índice denominado ibm_file_sync em sua implementação da Elasticsearch.
  3. Você aciona uma sincronização de arquivo por meio da API do Cloud Databases.
  4. Todos os nós em seu cluster da Elasticsearch fazem download dos conteúdos de arquivo por meio do índice, decodificam o base64 e restauram os arquivos no disco da implementação no diretório /data/ibm_file_sync/current.
  5. Em intervalos regulares e em reinicializações, os arquivos são ressincronizados para assegurar que eles estejam presentes em todos os nós.
  6. Arquivos que estão no disco, mas não no índice, são excluídos. É possível excluir arquivos do disco, removendo-os do índice.

O índice emElasticsearch é ibm_file_sync.
O local dos arquivos em disco é /data/ibm_file_sync/current.

Na Elasticsearch 7 a API remove tipos de doc. Consulte o Elasticsearch documentação para mais detalhes. É especialmente bom ter isso em mente ao atualizar por meio de versões anteriores.

Fazendo upload dos arquivos para o índice

A estrutura dos documentos no índice é a seguinte:name é o nome do arquivo,blob é obase64-encoded conteúdo do arquivo e md5 é um valor hash opcional sobre o conteúdo do arquivo. O mapeamento recomendado para o índice é dividido com base na versão.

Para a Elasticsearch 6:

curl -X PUT "https://user:password@host:port/ibm_file_sync" -H 'Content-Type: application/json' -d'
{
    "mappings": {
        "files": {
            "properties": {
                "name": {
                    "type": "text"
                },
                "blob": {
                    "type": "binary"
                },
                "md5": {
                    "type": "text"
                }
            }
        }
    }
}'

Para a Elasticsearch 7 (observe a remoção da seção files):

curl -X PUT "https://user:password@host:port/ibm_file_sync" -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "blob": {
        "type": "binary"
      },
      "md5": {
        "type": "text"
      }
    }
  }
}'

A URL é a httpssequência de conexões de de sua implementação.

Para usar o índice, codifique os conteúdos do arquivo como base64. Para codificar um arquivo de exemplo README.md em bash, ENC=$(base64 -w 0 README.md). Em seguida, construa uma soma de verificação sobre o conteúdo, HASH=$(md5sum README.md).

A função de download compara os valores de hash em cada execução de sincronização e, se os valores permanecerem inalterados desde a última sincronização, nenhum novo download será tentado. Se algum documento no índice não tiver um valor de md5, ocorrerá uma nova tentativa de todos os downloads.

Em seguida, faça upload do documento no índice. Observe que o nome do arquivo é fornecido na URL também.

Para a Elasticsearch 6:

curl -X PUT "https://user:password@host:port/ibm_file_sync/files/README1.md" -H 'Content-Type: application/json' -d'
{
    "name": "README1.md",
    "blob": '"\"$ENC\""',
    "md5": '"\"$HASH\""'
}'

Para Elasticsearch 7 (observe que apenas a URL é mudada):

curl -X PUT "https://user:password@host:port/ibm_file_sync/_doc/README1.md" -H 'Content-Type: application/json' -d'
{
    "name": "README1.md",
    "blob": '"\"$ENC\""',
    "md5": '"\"$HASH\""'
}'

É possível verificar os dados transferidos por upload.

Para a Elasticsearch 6:

curl https://user:password@host:port/ibm_file_sync/files/README.md?pretty

Para a Elasticsearch 7:

curl https://user:password@host:port/ibm_file_sync/_doc/README.md?pretty

Se tudo tiver corrido bem, os dados retornados se parecerão com este exemplo (abreviado). O "md5 "O campo pode conter um nome de arquivo junto com o hash.

Para a Elasticsearch 6:

{
  "_index" : "ibm_file_sync",
  "_type" : "files",
  "_id" : "README1.md",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "name" : "README1.md",
    "blob" : "IyBF ... KWBgCg==",
    "md5" : "270f60e62d3d37add3702ced7f6969a1  README.md"
  }
}

Para a Elasticsearch 7:

{
  "_index" : "ibm_file_sync",
  "_id" : "README1.md",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "name" : "README1.md",
    "blob" : "IyBF ... KWBgCg==",
    "md5" : "270f60e62d3d37add3702ced7f6969a1  README.md"
  }
}

Sincronizando arquivos para o disco

Depois que os arquivos forem carregados no índice, eles poderão ser sincronizados com o disco. Ligue para o terminal /elasticsearch/file_syncs por meio da API do Cloud Databases.

curl -X POST \
https://api.{region}.databases.cloud.ibm.com/v4/ibm/deployments/{id}/elasticsearch/file_syncs \
-H 'authorization: Bearer <token>'

A region é a região na qual a sua implementação está e a parte (CRN) de id da URL precisa ser codificada por URL. Mais informações estão na Referência de API.

A chamada é iniciada e retorna uma tarefa para que seja possível monitorar o progresso. Após a tarefa retornada ser concluída, os conteúdos no índice estarão presentes em todos os nós em seu cluster.

Qualquer número de arquivos pode ser transferido por upload e sincronizado. Os conteúdos dos arquivos não são validados. Assegure que eles possam ser processados pelo Elasticsearch.

Usando os arquivos

Elasticsearch recursos que usam arquivos no sistema de arquivos aceitam o caminho para o arquivo ao definir o índice. Um arquivo carregado example.txt está em /data/ibm_file_sync/current/example.txt. Esta lista contém exemplos e não é exaustiva.