自动将数据索引到elasticsearch中

时间:2014-11-02 09:40:50

标签: django postgresql elasticsearch model-associations pyelasticsearch

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

如果您希望在发生更改时推送更改,那么您必须在CMS中编写代码,或者如果他们能够向ElasticSearch的REST API发出HTTP调用,则必须在Postgres中编写触发器(我不会这样做)知道Postgres足够好知道他们是否能做到这一点)。但推送数据确实不是ElasticSearch问题,您必须在CMS或管理数据的应用程序中解决这个问题。

答案 1 :(得分:2)

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

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

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

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

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

这里有一个Vagrant和Docker测试框架的概念验证项目:appears