postgresql - Postgres“物化视图”刷新为 ElasticSearch 文档更新的来源?
问题描述
我有一个规范化的数据库,在 AWS RDS Postgres 数据库中有几个表,大约有一百万条记录。
我想编写一个物化视图,将其中几个表连接起来,为 ElasticSearch 文档生成记录结构。
当物化视图刷新时(我将使用并发选项),我希望将活动推送到 AWS ElasticSearch 作为相应的插入或更新或删除。
我只会修改基础表并每周刷新一次物化视图。
这会起作用吗 - 特别是物化视图的刷新会在 WAL 中记录为插入/更新/删除吗?
解决方案
我在我正在从事的一个项目中这样做,到目前为止它运行良好,我将logstash用作独立应用程序,每次我想更新数据时,我都会刷新物化视图并使用postgres驱动程序运行logstash(在我的情况下,我在服务器上有一份工作,每 2 小时执行一次)。为此,您需要运行命令行:
path/to/logstash/bin/logstash -f path/to/postgres2elasticsearch.conf
在文件“postgres2elasticsearch.conf”中,您应该输入:
input {
jdbc {
jdbc_connection_string => "jdbc:postgresql://${RDS_HOSTNAME}:${RDS_PORT}/${RDS_DB_NAME}"
jdbc_user => "${RDS_USERNAME}"
jdbc_password => "${RDS_PASSWORD}"
jdbc_driver_library => "${DRIVE_PATH}"
jdbc_driver_class => "org.postgresql.Driver"
statement => "SELECT * from ${MY_MATERIALIZED_VIEW} order by ${ID_FIELD}"
jdbc_paging_enabled => true
}
}
output {
elasticsearch {
index => "${ES_INDEX}"
hosts => ["${ES_DATA_HOST}:443"]
}
}
查询的order by
子句很重要,因为logstash会批量插入数据,如果你不订购数据,有可能一部分数据重复,而另一部分根本没有进入elasticsearch,所以我建议为此,您在物化视图上有一个索引的唯一字段。您需要下载postgres jdbc 驱动程序并将其放在 ${DRIVE_PATH}
推荐阅读
- sql - 如何在 spark sql 中对分区求和?
- sql - 合并两个表并根据表顺序选择数据
- python - 从 TensorFlow 数据集中分离多个输入
- jquery - iOS 14 wkwebview 中触摸事件的 cpu 使用率高
- ruby-on-rails - Rails 批量更新所有 NOT IN 条件
- javascript - React 组件工作正常,但尝试使用 useMemo() 会导致错误
- java - 使用 jar 文件在临时文件夹中创建 excel 文件时,Excel 文件已损坏
- python - python看门狗跟踪来自另一个进程的单个文件更改在检测到更改时失败
- ruby-on-rails - 未定义的局部变量或方法 `permitted_task_attributes' for #
我有一个遵循 Spree/Solidus 范式的解决方案,它封装了允许的参数。我没有能力改变它,而是效仿。但是,我遇到了一个问题,我无法重现 #Api::V1::TasksController:0x0000000000b7c0 的未定义局部变量或方法“permitted_task_attributes”。
- python - 如何在 for 循环中附加熊猫数据框,同时在第一列上进行累积和?