假设我有一百万个对象需要保存到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)
我如何一次保存20k个对象,但只有在保存所有项目后才“提交”事务?或者,如果我必须立即保存“所有这些”,我该怎么做?
Elasticsearch没有事务只有单个文档的动作是原子的。
如果弹性搜索索引仅在插入所有项目后才可用,则可以使用此方法:
index_1
)并使用批量插入来添加所有文档。
(索引可以使用)index_1
。
(您的应用程序可以使用index_1
)index_2
,将所有旧文档和新文档插入其中。执行任何所需的验证以确保一切正常。
(对您的应用程序来说,此索引的更改是不可见的)index_2
。
(这就像提交事务并切换到旧索引就像事务回滚一样)index_1
。每当需要添加新文档时,重复点4,5,6。我在几个站点上使用这种方法,每个站点都有10k到50k的文档,每次更新都会添加到索引中。
没有Elasticsearch中的事务。
有关详细信息,请参阅此处:
https://www.elastic.co/guide/en/elasticsearch/guide/current/concurrency-solutions.html
特别:
问题是Elasticsearch不支持ACID事务。对单个文档的更改是ACIDic,但不是涉及多个文档的更改。