自动将数据索引到弹性搜索中



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

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

每天,CMS中都会添加新的字段,然后将数据推送到Elasticsearch中。然而,考虑到庞大的数据量,这需要大量的时间。

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

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

此外,我使用弹性搜索py作为框架。

为了扩展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

这个问题缺少很多细节,但如果你要从Postgres进入ElasticSearch,你可以使用JDBC"river"来推送或拉取数据,以及对ES的增量更改。Rivers是ElasticSearch的插件,用于管理数据摄入。ElasticSearch JDBC river可以在以下位置找到:https://github.com/jprante/elasticsearch-river-jdbc这个小教程中提到了一个:http://voormedia.com/blog/2014/06/four-ways-to-index-relational-data-in-elasticsearch

您可以对满载进行索引,也可以通过时间戳或序列号监视计时器上的更新。这基本上是以给定的间隔向ElasticSearch发送一批更改。

如果你想在更改发生时推送更改,这是你必须在CMS中或在Postgres中编码的触发器,如果他们能够向ElasticSearch的REST API发出HTTP调用(我对Postgres还不够了解,不知道他们是否能做到这一点)。但推送数据实际上并不是ElasticSearch的问题,而是您必须在CMS或管理数据的应用程序中解决的问题。

最新更新