2

我有一个模型,其流程如下

CMS --> Postgres --> Elasticsearch --> 从 Elasticsearch 查询 --> 最终结果

每天,CMS 中都会添加新字段,然后将数据推送到 Elasticsearch。但是,考虑到大量数据,这会占用大量时间。

有没有办法让每次向 CMS 添加新条目时,它同时被推送到 Elasticsearch,而无需手动提示应用程序这样做?

我想自动化将数据从 CMS 推送到 Elasticsearch 的过程。欢迎任何意见。

另外,我使用 elasticsearch-py 作为框架。

4

2 回答 2

2

这个问题缺少很多细节,但是鉴于您要从 Postgres 进入 ElasticSearch,您可以使用 JDBC“河流”来推送或拉取数据以及对 ES 的增量更改。Rivers 是 ElasticSearch 的插件,用于管理数据摄取。ElasticSearch JDBC River 可以在以下位置找到:https ://github.com/jprante/elasticsearch-river-jdbc ,在这个小教程中有提到:http: //voormedia.com/blog/2014/06/four-在 Elasticsearch 中索引关系数据的方法

您可以索引完整负载,还可以通过时间戳或序列号监视计时器的更新。这基本上以给定的时间间隔将批量更改发送到 ElasticSearch。

如果您想在更改发生时推送更改,那么您必须在 CMS 中编码或作为 Postgres 中的触发器,前提是它们能够向 ElasticSearch 的 REST API 发出 HTTP 调用(我不太了解 Postgres知道他们是否可以这样做)。但推送数据确实不是 ElasticSearch 的问题,这是您必须在管理数据的 CMS 或应用程序中解决的问题。

于 2014-11-02T10:15:47.857 回答
2

为了扩展 Jayson 的最后一点,如果您真的需要从 Postgres 到 Elasticsearch 的“实时”更新,您将需要使用触发器和一些将数据从 DB 推送到 ES 的系统。

我尝试过的一种方法需要编写一个专用的 Postgres->ES 网关并使用一些 Postgres 特定的功能。我在这里写过:http: //haltcondition.net/2014/04/realtime-postgres-elasticsearch/

原理实际上很简单,我想出的方法的复杂性是由于处理一些极端情况,例如多个网关运行和网关暂时不可用。简而言之,我的解决方案是:

  • 将触发器附加到所有感兴趣的表,将更新的行 ID 复制到临时表。
  • 触发器还发出一个行已更新的异步通知。
  • 一个单独的网关(我的是用 Clojure 编写的)连接到 Postgres 服务器并监听通知。这是棘手的部分,因为并非所有 Postgres 客户端驱动程序都支持异步通知(有一个新的实验性 JDBC 驱动程序可以支持,这是我使用的,似乎psycopg 也支持这一点)。
  • 更新时,网关读取、转换数据并将其推送到 Elasticsearch。

在我的实验中,这个模型能够在 Postgres 行插入/更新后对 Elasticsearch 进行亚秒级的更新。显然,这在现实世界中会有所不同。

这里有一个带有 Vagrant 和 Docker 测试框架的概念验证项目:https ://bitbucket.org/tarkasteve/postgres-elasticsearch-realtime

于 2014-11-05T09:42:14.787 回答