ElasticSearch复制索引

时间:2014-12-30 18:26:33

标签: elasticsearch

(首先阅读本文How to use Elastic Search on top of a pre-existing SQL Database?)我目前正在使用MySql,但我正在尝试更改为使用ElasticSearch作为我们的搜索引擎。我正在使用以下curl请求将表格通过Elastic Search River JDBC迁移到弹性搜索:

curl -XPUT 'localhost:9200/_river/table_river/_meta' -d '{
"type" : "jdbc",
"jdbc" : {
    "url" : 'localhost:9200/blah', "user" : "x", "password" : "x",
    "sql" : "select some_field as _id, * From some_table",
    "index": "some_index",
    "type" : "some_type",
    "schedule" : "0 0-59 0-23 ? * *"
}
}'

为了保持弹性搜索和mysql表同步,我使用schedule参数每分钟运行并将表拉入弹性搜索,但在执行期间Elastic Search会创建重复索引,我得到以下内容:

complete: river jdbc/table_river metrics: 21123 rows

一分钟之后,河流再次执行我得到以下回应:

complete: river jdbc/table_river metrics: 42246 rows

我的“index_total”从21125增加到42248到63371,但文档总数保持不变:21125

我可能没有正确地做事。我会首先接受一篇文章的网址,而不是有人告诉我该怎么做。我先做了一些公平的研究。

Avoid rebuilding index through jdbc-river on elasticsearch

elasticsearch data increase & duplicate at each restart

1 个答案:

答案 0 :(得分:3)

每分钟将表中的所有数据重新索引到ES中的效率非常低。我建议的是,当你从mySQL插入/更新时,将该表的主键放入排队系统(我们使用rabbitMQ)。然后,您可以拥有1个,2个或100个兔子消费者,他们获取数据,以某种方式对其进行转换,然后插入ElasticSearch。

此解决方案的优点在于它解决了新数据和现有数据的问题。要回填整个表,只需将所有主键插入队列,让您的队列消费者填写ElaticSearch。

此外,通过这种方式,您只需在需要时工作,而不是每分钟工作。