在ElasticSearch中执行“事务”

问题描述 投票:0回答:2

假设我有一百万个对象需要保存到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个对象,但只有在保存所有项目后才“提交”事务?或者,如果我必须立即保存“所有这些”,我该怎么做?

python elasticsearch
2个回答
0
投票

Elasticsearch没有事务只有单个文档的动作是原子的。

如果弹性搜索索引仅在插入所有项目后才可用,则可以使用此方法:

  1. 配置应用程序以使用索引别名。 (此时别名不指向任何东西 - 没关系)
  2. 创建索引(例如,index_1)并使用批量插入来添加所有文档。 (索引可以使用)
  3. 将索引别名指向index_1。 (您的应用程序可以使用index_1
  4. 如果您需要添加新批次的项目,请创建新索引index_2,将所有旧文档和新文档插入其中。执行任何所需的验证以确保一切正常。 (对您的应用程序来说,此索引的更改是不可见的)
  5. 将索引别名指向index_2。 (这就像提交事务并切换到旧索引就像事务回滚一样)
  6. 删除index_1

每当需要添加新文档时,重复点4,5,6。我在几个站点上使用这种方法,每个站点都有10k到50k的文档,每次更新都会添加到索引中。


1
投票

没有Elasticsearch中的事务。

有关详细信息,请参阅此处:

https://www.elastic.co/guide/en/elasticsearch/guide/current/concurrency-solutions.html

特别:

问题是Elasticsearch不支持ACID事务。对单个文档的更改是ACIDic,但不是涉及多个文档的更改。

© www.soinside.com 2019 - 2024. All rights reserved.