将文件上载到 Elasticsearch
一些 Elasticsearch 功能允许索引从文件系统上的文件读取,因此 IBM Cloud® Databases for Elasticsearch 允许您将文件上载到部署。 这些文件存储在已知位置,并且配置了 Elasticsearch,以便允许它从该位置读取文件。
上载到部署的文件将使用索引和文件系统中的磁盘资源。 请确保在上载文件之前 缩放部署。
基本流程
- 您可以在客户端对文件进行 base64 编码。
- base64 字符串作为文档存储在 Elasticsearch 部署中名为
ibm_file_sync
的索引中。 - 从 Cloud Databases API 触发文件同步。
- Elasticsearch 集群中的所有节点都从索引下载文件内容,对 base64进行解码,并将部署磁盘上的文件复原到
/data/ibm_file_sync/current
目录中。 - 在定期重新启动时,将重新同步这些文件,以确保它们在所有节点上都存在。
- 将删除磁盘上但不在索引中的文件。 您可以通过从索引中除去文件来从磁盘中删除这些文件。
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
。 此列表包含示例,并非详尽无遗。