elasticsearch,Python,elasticsearch" /> elasticsearch,Python,elasticsearch" />

Python 执行一个“命令”;“交易”;有弹性的

Python 执行一个“命令”;“交易”;有弹性的,python,elasticsearch,Python,elasticsearch,假设我有一百万个对象需要保存到ElasticSearch。保存对象的一个要求是,只有在保存了所有项目后才能对其进行搜索,否则结果(与保存对象的不同属性的计数和总和有关——比如财务计算)将是错误的 以下是我当前必须保存对象的代码: from elasticsearch import Elasticsearch, helpers ACTIONS = [] for item in HISTORY_DATA.values(): ACTIONS.append({ "_index":

假设我有一百万个对象需要保存到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中没有事务这样的事情

有关更多信息,请参见此处:

具体而言:

问题在于Elasticsearch不支持ACID事务。对单个文档的更改是无效的,但不包括涉及多个文档的更改


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

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

  • 将应用程序配置为使用索引别名。
    (此时alias没有指向任何东西-没关系)
  • 创建索引(例如,
    index_1
    )并使用批量插入添加所有文档。
    (索引已准备好使用)
  • 将索引别名指向
    索引\u 1

    (您的应用程序可以使用
    索引_1
  • 如果需要添加新的一批项目创建新索引
    index_2
    ,请将所有旧文档和新文档插入其中。执行任何必要的验证以确保一切正常。
    (此索引的更改对应用程序不可见)
  • 将索引别名指向
    索引\u 2

    (这类似于提交事务,切换到旧索引类似于事务回滚)
  • 删除
    索引_1

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

    那么,在保存这些结果后,您将如何实现上述仅允许某人搜索这些结果的功能?当然,我不是第一个尝试完成这种行为的人……你可能会在它们上面有某种标记字段,比如说
    “hidden”:“一些\u random\u hash\u为\u批生成的\u”
    ,然后通过查询进行更新,以取消隐藏与该hash匹配的所有文档。@AKX谢谢,我将使用这种方法。在ES中,我将如何执行以下操作?也许这应该是一个单独的问题:
    updatemyesindex SET是\u hidden=False,其中事务\u guid='XXX'
    是否可以动态重复4,5,6?下次您无法创建新索引
    index_2
    ,因为它已经存在?或者您创建了
    index\u 3
    ?我们使用
    index\u currenttimestap
    作为命名方案。感谢回复。还有一个问题:查询索引时如何更新索引名称。手动更改它,它不像一个整洁的解决方案。您是使用星号
    索引名称-*
    还是有一个更简洁的解决方案?另外,由于您使用的是时间戳,您如何跟踪以前的索引名称?由于您必须执行步骤6(删除它)?只需按排序顺序获取索引列表,第一个索引将是最旧的。我不确定你在第一个问题中的意思。应用程序只对所有查询使用别名,所以它不必知道当前索引名。