一尘不染

在ElasticSerch中执行“交易”

elasticsearch

假设我有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万个对象,但是仅在所有项目都保存后才“提交”事务?或者,如果我必须一次保存“所有对象”,我该怎么做?


阅读 196

收藏
2020-06-22

共1个答案

一尘不染

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

如果您的elasticsearch索引仅在插入所有项目后才可用,则可以使用以下方法:

  1. 配置您的应用程序以使用 索引别名
    (此时别名不指向任何内容-可以)

  2. 创建一个索引(例如index_1),然后使用批量插入添加所有文档。
    (索引可以使用了)

  3. 索引别名 指向index_1
    (您的应用程序可以使用index_1

  4. 如果您需要添加新一批项目,请创建新索引index_2,然后将所有旧文档和新文档插入其中。执行任何需要的验证,以确保一切正常。
    (此索引的更改对您的应用程序是不可见的)

  5. 索引别名 指向index_2
    (这就像提交事务并切换到旧索引一样,就像事务回滚一样)

  6. 删除index_1

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

2020-06-22