(首先阅读本文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
我可能没有正确地做事。我会首先接受一篇文章的网址,而不是有人告诉我该怎么做。我先做了一些公平的研究。
答案 0 :(得分:3)
每分钟将表中的所有数据重新索引到ES中的效率非常低。我建议的是,当你从mySQL插入/更新时,将该表的主键放入排队系统(我们使用rabbitMQ)。然后,您可以拥有1个,2个或100个兔子消费者,他们获取数据,以某种方式对其进行转换,然后插入ElasticSearch。
此解决方案的优点在于它解决了新数据和现有数据的问题。要回填整个表,只需将所有主键插入队列,让您的队列消费者填写ElaticSearch。
此外,通过这种方式,您只需在需要时工作,而不是每分钟工作。