2015-05-26 43 views
1

我從PostgreSQL數據庫中檢索了很多行(存儲在result.rows中),並且我想將它們添加到我的ElasticSearch索引中。通過javascript向ElasticSearch索引添加文檔循環不起作用

只添加一個文件工作正常:

var r = result.rows[0]; 
esClient.index({ 
    index: 'families', 
    type: 'families', 
    id: r.family_accession, 
    body: { 
     'family_accession' : r.family_accession, 
     'count_seq'   : r.count_seq, 
     'count_taxon'  : r.count_taxon 
    } 
}, function (error, response) { 
    console.log(error); 
}); 

但是當我嘗試把它叫成一個圈,它不會在所有的工作:既然你調用一個異步

result.rows.forEach(function (r) { 
    esClient.index({ 
    index: 'families', 
    type: 'families', 
    id: r.family_accession, 
    body: { 
     'family_accession' : r.family_accession, 
     'count_seq'   : r.count_seq, 
     'count_taxon'  : r.count_taxon 
    } 
    }, function (error, response) { 
    console.log(error); 
    }); 
}); 
+0

你得到了什麼錯誤? – Val

+0

你確定result.rows是一個集合嗎?你能提供一個示例json嗎? –

+0

@Val根本沒有錯誤。循環迭代好(我可以打印'r'),但是'error'和'response'從不打印...... – pidupuis

回答

2

一段代碼在一個循環中,調用esClient.index()函數時出現的上下文在執行回調的時候不再存在。

您需要將它放在閉包中以保持執行環境。

result.rows.forEach(function (r) { 
    (function(row) { 
    esClient.index({ 
     index: 'families', 
     type: 'families', 
     id: row.family_accession, 
     body: { 
      'family_accession' : row.family_accession, 
      'count_seq'   : row.count_seq, 
      'count_taxon'  : row.count_taxon 
     } 
    }, function (error, response) { 
     console.log(error); 
    }); 
    })(r); 
}); 
+0

它的工作!我雖然不是因爲循環需要完全完成才能看到ElasticSearch中的索引修改。 – pidupuis

+0

我有一個相關的問題。此代碼有效,但不適用於成千上萬行。如何使用數百萬行填充我的索引? – pidupuis

+1

如果您想插入數十萬個文檔,我建議您嘗試使用[bulk API](https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/) api-reference.html#api-bulk)。但是這應該是另一個問題,所以這個問題仍然是非常混亂的。 – Val