1

当使用弹性搜索的批量 API 索引数据时,这里是站点文档中的示例 json

POST _bulk
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "1" } }
{ "field1" : "value1" }
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "2" } }
{ "field1" : "value2" }
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "3" } }
{ "field1" : "value3" }

在“准备”要由批量 API 使用的数据时,我必须在第一行指定操作,在下一行我将提供数据。每行上的一些冗余部分可能看起来很明显并且非常无害,但是当我索引数万亿行时,它不会增加延迟吗?是否有更好的方法通过指定索引名称并在标题处仅键入一次来推送所有行?特别是当我可以使用自动生成的 id 时,我可以避免生成 TB 的数据只是为了一次又一次地为同一目的添加到每一行。

我相信我在这里遗漏了一些明显的东西,否则我相信弹性公司的那些人足够聪明,已经弄清楚了,如果他们这样做了,应该有一些原因。但是什么?

4

3 回答 3

2

在这里你有快捷方式:

POST /test/_doc/_bulk
{ "index": {} }
{ "field1" : "value1" }
{ "index": {} }
{ "field1" : "value2" }
{ "index": {} }
{ "field1" : "value3" }

不幸的是,您仍然需要重复{ "index": {} }您在路径中指定的索引名称和文档类型。

在散装商品更便宜的文章中查看更多选项。

于 2018-11-14T10:16:07.167 回答
2

正如Piotr Pradzynski 的出色回答中已经说过的那样,您无能为力,而最小的足迹是 Pyotr 提出的。我认为有几个细节值得补充。

批量 API 有何帮助?

考虑批量 API 的主要原因是调整索引速度。这里的性能改进主要是由于在 Elasticsearch 端处理较少的 HTTP 连接。实际上,如果您设法不发送那些重复的{ "index": {} }部分,您的集群将不会更快地索引文档。

如果网络带宽是盗窃的脖子怎么办?

在这种情况下,我相信最好的办法是发送压缩的数据,如下所示:

curl -v 'http://localhost:9200/my_index/doc/_bulk' \
    -H "Content-encoding: gzip"
    -H "content-type: application/json; charset=UTF-8"
    -X POST --data-binary @bulk_data.json.gz

为了说明这个想法,我生成了一个带有随机数据的文件,如下所示:

$ head bulk_data.json
{"index":{}}
{"request_id":"40485"}
{"index":{}}
{"request_id":"12417"}
{"index":{}}
{"request_id":"11945"}
{"index":{}}
{"request_id":"81722"}
{"index":{}}
{"request_id":"52613"}

使用 GZip 压缩后文件大小缩小了 10 倍:

$ ls -l
-rw-r--r--  1 vasiliev  staff  358836 Nov 16 20:09 bulk_data.json
-rw-r--r--  1 vasiliev  staff   35744 Nov 16 19:41 bulk_data.json.gz

在带宽有限的情况下,这可能会有很大帮助。

压缩也可以从客户端库中获得,例如elasticsearch-py库。

希望有帮助!

于 2018-11-16T20:29:45.623 回答
1

那么在准备数据方面没有更好的方法。您唯一能做的就是以编程方式准备数据。

您可以简单地编写代码来构造所需的 json 并使用_bulkAPI 将其发送出去。

理想情况下,最好通过调用的特定应用程序完成索引,该应用程序indexer实际上会等到一批文档例如50或被100收集,然后以_bulk编程方式执行 API。

或者,您可以逐个文档地处理它,即event based使用消息队列,而不是像那样进行批处理。(在索引过程中最小化延迟的最佳方法)

另一种选择是使用简单的 java 程序或您使用的任何其他编程语言创建一个输入文件data.json(纯批处理),以编程方式附加您想要的所有文档并使用 CURL 命令发送请求,如下所示:

$ curl -s -XPOST <host_name>:9200/_bulk --data-binary @data.json

因此,对于此indexer应用程序,您可以添加调度和邮件通知,以便了解每个作业运行的状态,并根据您的要求安排每天/每周运行的时间。

Otoh,您可以使用Logstash. 对不起,这不是最好的答案,但我希望它有帮助。

于 2018-11-14T13:02:53.603 回答