当使用弹性搜索的批量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的数据,而这些数据只是为了一次又一次地用于相同的目的而准备到每一行。
我相信我在这里错过了一些显而易见的东西,否则我相信那些弹性公司的人足够聪明,已经想好了,如果他们这样做了,应该有一些原因。但是什么?
这里有快捷方式:
POST /test/_doc/_bulk
{ "index": {} }
{ "field1" : "value1" }
{ "index": {} }
{ "field1" : "value2" }
{ "index": {} }
{ "field1" : "value3" }
不幸的是,您仍然需要重复{ "index": {} }
行,但要重复在路径中指定的索引名称和文档类型。
请参阅更多选项在便宜的散装文章。
正如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库。
希望能有所帮助!
在准备数据方面没有更好的方法了。您唯一能做的就是以编程方式准备数据。
您可以简单地编写一个代码来构建所需的json,并使用_bulk
API将其发送。
理想情况下,最好通过名为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
。对不起,这不是最好的答案,但我希望它能有所帮助。