IBM Cloud Docs
将文件上载到 Elasticsearch

将文件上载到 Elasticsearch

一些 Elasticsearch 功能允许索引从文件系统上的文件读取,因此 IBM Cloud® Databases for Elasticsearch 允许您将文件上载到部署。 这些文件存储在已知位置,并且配置了 Elasticsearch,以便允许它从该位置读取文件。

上载到部署的文件将使用索引和文件系统中的磁盘资源。 请确保在上载文件之前 缩放部署

基本流程

  1. 您可以在客户端对文件进行 base64 编码。
  2. base64 字符串作为文档存储在 Elasticsearch 部署中名为 ibm_file_sync 的索引中。
  3. 从 Cloud Databases API 触发文件同步。
  4. Elasticsearch 集群中的所有节点都从索引下载文件内容,对 base64进行解码,并将部署磁盘上的文件复原到 /data/ibm_file_sync/current 目录中。
  5. 在定期重新启动时,将重新同步这些文件,以确保它们在所有节点上都存在。
  6. 将删除磁盘上但不在索引中的文件。 您可以通过从索引中除去文件来从磁盘中删除这些文件。

Elasticsearch 中的索引为 ibm_file_sync
文件在磁盘上的位置为 /data/ibm_file_sync/current

在 Elasticsearch 7 中,API 将除去文档类型。 请参阅 Elasticsearch 文档 以获取更多详细信息。 在从先前版本进行更新时,请记住这一点特别好。

将文件上载到索引

索引中文档的结构如下所示: name 是文件的文件名,blob 是 base64-encoded 文件内容,md5 是文件内容的可选散列值。 建议的索引映射将根据版本进行拆分。

对于 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"
                }
            }
        }
    }
}'

对于 Elasticsearch 7 (请注意除去 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"
      }
    }
  }
}'

URL 是来自部署的 https 连接字符串

要使用索引,请将文件内容编码为 base64。 要对 Bash 中的示例文件 README.md 进行编码,请执行以下操作: ENC=$(base64 -w 0 README.md)。 然后,在内容 HASH=$(md5sum README.md) 上构建校验和。

下载函数会比较每次同步运行时的散列值,如果这些值自上次同步以来未更改,那么不会尝试新的下载。 如果索引中的任何文档没有 md5 值,那么将再次尝试所有下载。

接下来,将文档上载到索引。 请注意,该文件名也在 URL 中提供。

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

对于 Elasticsearch 7 (请注意,仅更改 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\""'
}'

您可以验证上载的数据。

对于 Elasticsearch 6:

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

对于 Elasticsearch 7:

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

如果一切顺利,那么返回的数据将类似于以下 (缩短的) 示例。 "md5" 字段可以在散列中包含文件名。

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

对于 Elasticsearch 7:

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

将文件同步到磁盘

将文件上载到索引后,可以将这些文件同步到磁盘。 从 Cloud Databases API 调用 /elasticsearch/file_syncs 端点。

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

region 是部署所在的区域,需要对 URL 的 id (CRN) 部分进行 URL 编码。 API 参考 中提供了更多信息。

调用将启动并返回 任务,以便您可以监视其进度。 返回的任务完成后,索引中的内容将显示在集群中的所有节点上。

可以上载和同步任意数量的文件。 不会验证文件的内容。 确保它们可以由 Elasticsearch处理。

使用文件

在文件系统上使用文件的 Elasticsearch 功能部件通过在定义索引时接受文件路径来执行此操作。 上载的文件 example.txt 位于 /data/ibm_file_sync/current/example.txt。 此列表包含示例,并非详尽无遗。