【问题标题】:Bulk index in elasticsearchelasticsearch中的批量索引
【发布时间】:2015-08-07 15:16:26
【问题描述】:

我必须将 JSON 数组索引到弹性搜索索引中。我正在使用 javascript 客户端来索引数据。

我循环了数组,索引如下:

for (var i = 0; i < rawData.length; i++ ) {
    client.create({  
        index: "name",
        type: "rrrrr",  
        body: rawData[i]
    }, function(error, response){
    });
}

我需要避免循环。所以我决定选择“BULK API”

我提到了https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html,因为我们必须为每个文档指定如下标题:

{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }

但在 JSON 数组中,我所拥有的将不包含此标头。所以无论如何我也必须在这里循环。没有循环我怎么能做到这一点。请分享你的想法。

【问题讨论】:

  • 您能否详细说明为什么需要避免循环?您的意思是避免进行潜在的数百个create 调用,还是只是避免循环遍历所有rawData 元素?
  • @Val 感谢您宝贵的时间。试图在我的程序中避免尽可能多的循环,以便代码有效..
  • 您能在问题中说明您是如何创建rawData 数组的吗?
  • @Val 它只是一个 mongoDB 集合数组。

标签: javascript json elasticsearch


【解决方案1】:

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

BULK API 并不是为了减少您的代码可能需要执行的循环数以正确格式化数据 - 它的存在是为了减少客户端和 ES 集群之间的数据传输。 Bulk API 允许您为 执行 1 次调用(从客户端到服务器)每条记录 来索引,而不是 1 次调用 N 条记录,这会导致集群端的索引速度更快,但客户端的执行时间也会更快。

也就是说,对于您提到的特定字段,BULK API 确实允许您避免为要批量索引的每条记录指定此项。使用 PHP API 时,您可以设置一次 indextype,然后仅循环处理原始数据。这是使用 Elasticsearch PHP API 的代码 sn-p:

$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 元素中)。
  • 最后,调用 Bulk API 并将返回包含任何潜在错误的响应。

【讨论】:

    猜你喜欢
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    相关资源
    最近更新 更多