弹性搜索中的批量索引

时间:2015-05-26 05:36:13

标签: javascript json elasticsearch

我必须将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数组中我所拥有的不会包含此标题。所以无论如何我也必须在这里循环。没有循环我怎么能实现这一点。请分享你的想法。

1 个答案:

答案 0 :(得分:0)

简答: BULK API无法帮助您解决此问题。

BULK API并不意味着减少代码为正确格式化数据而可能需要执行的循环次数 - 它可以减少客户端和ES集群之间的数据传输。而不是 1次呼叫(从客户端到服务器)每条记录进行索引,Bulk API允许您为执行 1次呼叫 N条记录,这样可以加快群集方面的索引速度,同时也可以在客户端实现更快的执行时间。

也就是说,对于您提到的特定字段,BULK API允许您避免为要批量索引的每个记录指定此字段。使用PHP API时,您可以设置indextype一次,然后仅循环原始数据。这是使用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值。
  • 批量调用设置为指定indextype值(而不是将此数据放在每个$data元素中)。
  • 最后,调用批量API,并返回包含任何潜在错误的响应。