我有几百万个历史对象,需要保存到Elasticsearch。在不涉及elasticsearch内部的情况下,做到这一点的最佳方法是什么?这是我当前正在使用的模式:
ACTIONS = []
NUM_ACTIONS_TO_BULK = 10000
for num, item in enumerate(HISTORY_DATA.values()):
ACTIONS.append({
"_index": ES_INDEX_NAME,
"_type": "_doc",
"_id": item.pop('_id'),
"_source": item
})
# Save every 10k and again at the end
if (len(ACTIONS) == NUM_ACTIONS_TO_BULK) or (num == len(HISTORY_DATA) - 1):
log.info('%s/%s - Saving %s items to ES...' % (num, len(HISTORY_DATA), len(ACTIONS))
_ = helpers.bulk(self.es, ACTIONS)
ACTIONS = []
以上内容将其以10k的批量保存到ES。这是将内容保存到ES的最好/最有效的方法吗?例如,如果我尝试使用helpers.bulk将所有1500万个对象直接保存到ES中,该怎么办?是否会对这些项目进行分块,还是尝试一次全部保存?看起来我缺少上述任何内容吗?
答案 0 :(得分:0)
使用Bulk API时要尝试的几件事。尝试一次发送的文档数量。这完全取决于平均文档大小。有一些很好的建议起点listed here。有时一次100个会比一次1000个快。另外,如果您可以使应用程序成为多线程,请执行该操作。如果您有多个可以写的节点,请利用它。