2015-05-26 3 views
0

Я должен индексировать массив JSON в индекс индекса эластичности. Я использую javascript-клиент для индексации данных.Массовый индекс в elasticsearch

Я петельные массива и проиндексированы следующим образом:

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

мне нужно, чтобы избежать петли. SO я решил пойти на «BULK API»

я говорил https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html, в том, что для каждого документа, мы должны указать заголовки следующим образом:

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

Но в массиве JSON, что я не буду содержать это заголовок. Так или иначе, мне тоже нужно зациклиться. Без цикла, как я могу достичь этого. Пожалуйста, поделитесь своими идеями.

+0

Можете ли вы уточнить, почему вам нужно избегать цикла? Вы хотите избежать создания потенциально сотни вызовов 'create' или просто избегать циклирования всех элементов' rawData'? – Val

+0

@Val Спасибо за ваше драгоценное время. Попытка избежать целых циклов в моей программе, чтобы код был эффективным .. – Subburaj

+0

Можете ли вы показать в вопросе, как вы создаете массив 'rawData'? – Val

ответ

0

Короткий ответ: BULK API не поможет вам в этом.

API BULK API не предназначен для сокращения числа циклов, которые может потребоваться вашему коду для правильного форматирования данных - он существует для уменьшения передачи данных между клиентом и кластером ES. Вместо 1 вызов (от клиента к серверу) за запись в индекс, Bulk API позволяет делать 1 вызов для N записей, что приводит к более быстрой индексации на стороне кластера, но и для гораздо более быстрое время выполнения на стороне клиента.

Это означает, что для конкретных полей, которые вы упомянули, API BULK позволяет избежать указания этого для каждой записи, которую вы хотите индексировать. При использовании 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 массив отформатирован для массовых API, содержащий одну запись индексировать.
  • Цикл данных выполняется для объединения всех записей в одно значение body.
  • Массовый вызов настроен для указания значений index и type (вместо того, чтобы помещать эти данные в каждый элемент $data).
  • И наконец, массовый API вызывается и возвращает ответ с любыми потенциальными ошибками.
Смежные вопросы