我必须将JSON数组索引到弹性搜索索引中。我正在使用javascript客户端来索引数据。
我循环数组并索引如下:
for (var i = 0; i < rawData.length; i++ ) {
client.create({
index: "name",
type: "rrrrr",
body: rawData[i]
}, function(error, response){
});
}
我需要避免循环。所以我决定选择&#34; BULK API&#34;
我提到了https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html,因为我们必须为每个文档指定标题,如下所示:
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
但是在JSON数组中我所拥有的不会包含此标题。所以无论如何我也必须在这里循环。没有循环我怎么能实现这一点。请分享你的想法。
答案 0 :(得分:0)
简答: BULK API无法帮助您解决此问题。
BULK API并不意味着减少代码为正确格式化数据而可能需要执行的循环次数 - 它可以减少客户端和ES集群之间的数据传输。而不是 1次呼叫(从客户端到服务器)每条记录进行索引,Bulk API允许您为执行 1次呼叫 N条记录,这样可以加快群集方面的索引速度,同时也可以在客户端实现更快的执行时间。
也就是说,对于您提到的特定字段,BULK API允许您避免为要批量索引的每个记录指定此字段。使用PHP API时,您可以设置index
和type
一次,然后仅循环原始数据。这是使用Elasticsearch PHP API的代码片段:
$esclient = // Set up an ES client here
$joined = '';
foreach($data as $q) {
$joined .= json_encode($q) . "\n";
}
$all_es_params = array();
$all_es_params['body'] = <<<EOT
$joined
EOT;
// Assumes all documents will be put in the same index
$all_es_params['index'] = 'YOUR_INDEX_NAME';
// Assumes all documents have same type in your bulk call
$all_es_params['type'] = 'YOU_DOCUMENT_TYPE';
try {
// Call ES BULK API
$ret = $esclient->bulk($all_es_params);
} catch (Exception $e) {
// Something went wrong
}
在上面的示例中:
$data
是为包含一条记录的Bulk API格式化的数组
索引。body
值。index
和type
值(而不是将此数据放在每个$data
元素中)。