假设我有100万个对象需要保存到ElasticSearch。保存对象的要求之一是,只有在所有项目都保存完之后才能进行搜索- 否则结果(与保存对象的不同属性的计数和总和有关-以财务计算为准)是错的。
这是我当前必须保存对象的代码:
from elasticsearch import Elasticsearch, helpers ACTIONS = [] for item in HISTORY_DATA.values(): ACTIONS.append({ "_index": ES_INDEX_NAME, "_type": "_doc", "_id": item.pop('_id'), "_source": item }) _ = helpers.bulk(self.es, ACTIONS)
我如何一次保存2万个对象,但是仅在所有项目都保存后才“提交”事务?或者,如果我必须一次保存“所有对象”,我该怎么做?
Elasticsearch没有事务,只有单个文档动作是原子的。
如果您的elasticsearch索引仅在插入所有项目后才可用,则可以使用以下方法:
配置您的应用程序以使用 索引别名 。 (此时别名不指向任何内容-可以)
创建一个索引(例如index_1),然后使用批量插入添加所有文档。 (索引可以使用了)
index_1
将 索引别名 指向index_1。 (您的应用程序可以使用index_1)
如果您需要添加新一批项目,请创建新索引index_2,然后将所有旧文档和新文档插入其中。执行任何需要的验证,以确保一切正常。 (此索引的更改对您的应用程序是不可见的)
index_2
将 索引别名 指向index_2。 (这就像提交事务并切换到旧索引一样,就像事务回滚一样)
删除index_1。
每当您需要添加新的文档集时,请重复第4,5,6点。我在几个站点上使用这种方法,每个站点在每次更新时都添加了10k到50k的文档作为索引。