Carga de archivos en Elasticsearch

Algunas características de Elasticsearch permiten a los índices leer en los archivos del sistema de archivos, por lo que IBM Cloud® Databases for Elasticsearch permite cargar archivos en el despliegue. Los archivos se almacenan en una ubicación conocida, y Elasticsearch está configurado de forma que puede leer los archivos de esa ubicación.

Los archivos que se cargan en el despliegue utilizan recursos de disco, tanto en el índice como en el sistema de archivos. Asegúrese de escalar el despliegue antes de cargar archivos.

Proceso básico

  1. Primero codifica con base64 el archivo en el lado del cliente.
  2. Las series en base64 se almacenan como documentos en un índice denominado ibm_file_sync en el despliegue de Elasticsearch.
  3. Después desencadena una sincronización de archivos desde la API de Cloud Databases.
  4. Todos los nodos del clúster de Elasticsearch descargan el contenido de los archivos en el índice, descodifican las series en base64 y restauran los archivos en el disco del despliegue en el directorio /data/ibm_file_sync/current.
  5. En intervalos regulares, y en los reinicios, se vuelven a sincronizar los archivos para asegurarse de que están presentes en todos los nodos.
  6. Los archivos que están en el disco, pero no en el índice, se eliminan. Puede suprimir archivos del disco eliminándolos del índice.

El índice enElasticsearch es ibm_file_sync.
La ubicación de los archivos en el disco es /data/ibm_file_sync/current.

En Elasticsearch 7, la API elimina los tipos de documentos. Referirse a Elasticsearch documentación para más detalles. Resulta especialmente útil tenerlo en cuenta al actualizar desde versiones anteriores.

Cargar los archivos en el índice

La estructura de los documentos del índice es la siguiente:name es el nombre del archivo,blob es elbase64-encoded contenido del archivo, y md5 es un valor hash opcional sobre el contenido del archivo. La asignación recomendada para el índice se divide según la versión.

Para 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 Elasticsearch 7 (observe que se ha eliminado la sección 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"
      }
    }
  }
}'

La URL es la httpsCadena de conexión de su implementación.

Para utilizar el índice, codifique el contenido del archivo en base64. Para codificar un archivo de ejemplo README.md en bash, ENC=$(base64 -w 0 README.md). A continuación, cree una suma de comprobación sobre el contenido, HASH=$(md5sum README.md).

La función de descarga compara los valores hash en cada ejecución de sincronización y, si los valores no cambian desde la última sincronización, no se intenta ninguna nueva descarga. Si algún documento del índice no tiene ningún valor md5, se vuelven a intentar todas las descargas.

A continuación, cargue el documento en el índice. Tenga en cuenta que el nombre de archivo se debe proporcionar en el URL también.

Para 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 solo cambia el URL):

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

Puede verificar los datos cargados.

Para Elasticsearch 6:

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

Para Elasticsearch 7:

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

Si todo transcurrió sin problemas, los datos devueltos son parecidos a los de este ejemplo (abreviado). El "md5 "El campo puede contener un nombre de archivo junto al hash.

Para 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 Elasticsearch 7:

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

Sincronización de archivos en disco

Una vez cargados los archivos en el índice, se pueden sincronizar con el disco. Llame al punto final /elasticsearch/file_syncs de la API de Cloud Databases.

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

El campo region es la región en la que se encuentra el despliegue y la parte de id (CRN)del URL debe estar codificada como url. Encontrará más información en la Referencia de API.

La llamada se inicia y devuelve una tarea para que pueda supervisar su progreso. Una vez finalizada la tarea devuelta, el contenido del índice está presente en todos los nodos del clúster.

Se puede cargar y sincronizar cualquier número de archivos. El contenido de los archivos no se valida. Asegúrese de que Elasticsearchpueda procesarlos.

Utilización de los archivos

Elasticsearch Las funciones que utilizan archivos en el sistema de archivos lo hacen aceptando la ruta al archivo al definir el índice. Un archivo subido example.txt Me senté /data/ibm_file_sync/current/example.txt. Esta lista contiene ejemplos y no es exhaustiva.