有效地将项目批量保存到Elasticsearch

时间:2018-09-25 17:39:54

标签: python elasticsearch

我有几百万个历史对象,需要保存到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中,该怎么办?是否会对这些项目进行分块,还是尝试一次全部保存?看起来我缺少上述任何内容吗?

1 个答案:

答案 0 :(得分:0)

使用Bulk API时要尝试的几件事。尝试一次发送的文档数量。这完全取决于平均文档大小。有一些很好的建议起点listed here。有时一次100个会比一次1000个快。另外,如果您可以使应用程序成为多线程,请执行该操作。如果您有多个可以写的节点,请利用它。