当前位置: 首页 > 面试题库 >

在ElasticSerch中执行“交易”

慕容宇
2023-03-14
问题内容

假设我有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索引仅在插入所有项目后才可用,则可以使用以下方法:

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

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

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

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

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

  6. 删除index_1

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



 类似资料:
  • 我正在尝试为API创建一个程序,一次进行多个交易,然后获取股票价格,然后每隔一段时间重新平衡一次。我使用了一个在线教程来获取一些代码,并做了一些调整。 但是,当我运行代码时,它经常连接,如果我重新启动IB TWS,它会下订单。但是如果我再次运行代码,它就不起作用,或者显示它将连接的任何指示。有人能帮我弄清楚如何保持连接,这样我就可以运行main.java文件,它会执行多个交易,然后结束连接吗?我需

  • 问题内容: 我在理解同步关键字功能时遇到了一些麻烦。根据Java文档和其他教程,可以说,当使用synced关键字时,在两个线程之间不可能在该方法的语句之间进行交织。 但是,请参见下面的代码。 据我了解,程序输出应始终以线程0和线程1不应交错的方式进行。但是多次执行这段代码后,我得到了交错输出。 请帮助我理解问题。 提前致谢.. 问题答案: 的关键字防止两个线程运行的是在同一对象上同步代码。 您的每

  • 我正在尝试为Python应用编程接口创建一个程序,以便一次下多个交易/市场订单。我在网上使用了一个教程来获取一些代码,并做了一些更改。但是,我不能一次下多个订单。我使用了2个列表1是用于符号,另一个是用于它们的数量。(例如:购买3只苹果股票)。我的代码只执行最后一个订单:即“购买3只客户关系管理股票”。有人能帮我弄清楚如何下多个订单吗? 下面是我的Python代码:

  • 问题内容: 在PyCharm中,运行脚本后,它会自动将其杀死: C:\ Users \ Sean.virtualenvs \ Stanley \ Scripts \ python.exe C:/Users/Sean/PycharmProjects/Stanley/Stanley.py 流程结束,退出代码为0 脚本启动后如何与之交互?由于缺少更好的措辞方式,我该如何获取 脚本运行一次后提示? PyC

  • 问题内容: 我正在使用scrapy框架来抓取网站,并且无法单击javascript链接来打开另一个页面。 我可以将页面上的代码标识为: 谁能建议我如何在Scaroy中执行该javascript并通过我获得另一页,我可以从该页中获取数据。 提前致谢 问题答案: 检出以下有关如何将selenium一起使用的摘要。爬网速度会变慢,因为你不仅要下载html,还可以完全访问DOM。 注意:由于先前提供的链接

  • 问题内容: 如果应用程序是第一次加载,我正在尝试执行segue。我可以在调试器中看到我的打印消息,但是Perform Segue无法正常工作。我没有任何错误。有人可以告诉我怎么了吗? 问题答案: 您不能在viewDidLoad()中使用performSegue()。将其移动到viewDidAppear()。 在viewDidLoad()时,当前视图甚至还没有附加到窗口,因此尚无法进行隔离。