从PostgreSQL到Elasticsearch的索引数据

时间:2014-05-27 03:41:34

标签: elasticsearch spring-data-elasticsearch

我想使用多播功能设置elasticsearch集群。一个节点是外部弹性搜索节点,另一个节点是节点客户端(客户端属性设置为true-not hold data)。

此节点客户端是使用spring data elasticsearch创建的。所以我想将postgresql数据库中的数据索引到外部elasticsearch节点。我使用jdbc river插件索引了数据。

但我想知道是否有任何可以用于postgresql的索引数据的应用程序而不是使用河流插件

1 个答案:

答案 0 :(得分:4)

虽然需要编写专用的Postgres-> ES网关并使用一些Postgres特定功能,但可以实时执行此操作。我在这里写过:http://haltcondition.net/2014/04/realtime-postgres-elasticsearch/

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

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

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

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