elasticsearch,Ruby On Rails,Lucene,Nosql,elasticsearch" /> elasticsearch,Ruby On Rails,Lucene,Nosql,elasticsearch" />

Ruby on rails 保持elasticsearch与数据库同步

Ruby on rails 保持elasticsearch与数据库同步,ruby-on-rails,lucene,nosql,elasticsearch,Ruby On Rails,Lucene,Nosql,elasticsearch,我正试图找出一种方法来保持我的mysql数据库和elasticsearch数据库同步。我已经使用elasticsearch插件设置了一个jdbc river。当我执行以下请求时: curl -XPUT 'localhost:9200/_river/my_jdbc_river/_meta' -d '{ "type" : "jdbc", "jdbc" : { "driver" : "com.mysql.jdbc.Driver", "url" : "jdbc:mysql://local

我正试图找出一种方法来保持我的mysql数据库和elasticsearch数据库同步。我已经使用elasticsearch插件设置了一个jdbc river。当我执行以下请求时:

curl -XPUT 'localhost:9200/_river/my_jdbc_river/_meta' -d '{
"type" : "jdbc",
"jdbc" : {
    "driver" : "com.mysql.jdbc.Driver",
    "url" : "jdbc:mysql://localhost:3306/MY-DATABASE",
    "user" : "root",
    "password" : "password",
    "sql" : "select * from users",
    "poll" : "1m"
},
"index" : {
    "index" : "test_index",
    "type" : "user"
}
}'
河流开始索引数据,但对于一些记录,我得到了
org.elasticsearch.index.mapper.MapperParsingException
。有人讨论过这个问题,但我想知道一个绕过这个问题的方法

是否可以通过为我试图索引的“类型”的所有“字段”创建一个索引来永久修复此问题,或者是否有更好的方法来解决此问题


我遇到的另一个问题是,当jdbc河再次轮询数据库时,它似乎将整个数据集(在sql查询中给出)重新索引到ES中。我不确定,但这样做是因为elasticsearch希望添加新数据以及更新现有数据中的任何更改吗?如果表的数据是静态的,是否可以只为新数据编制索引?

是否查看了默认映射?

我想这对你有帮助

如果datatable中有一个插入日期字段,则可以使用它筛选要索引的内容。 看


David

弹性搜索已经完全放弃了河流同步的概念。这不是一个推荐的路径,因为通常在文档存储中像弹性搜索一样保持相同的规范化SQL表结构是没有意义的

比如说,您将产品作为一个具有某些属性的实体,并将产品实体上的评审作为父子表,因为评审可能在同一个表上有多个

Products(Id, name, status,... etc)
Product_reviewes(product_id, review_id)
Reviews(id, note, rating,... etc)
在文档库中,您可能希望创建一个名为“产品”的索引,其中包括
产品{attribute1,attribute1,…产品评论[review1,review2,…]}

下面是在这种设置中同步的方法

假设:

  • SQL数据库(记录的真实来源)
  • 弹性搜索或任何其他NoSql文档存储
  • 解决方案:

  • 在发布事件/JMS/AMQP/Database Queue/File System Queue/Amazon SQS等中的事件发生更新/更新时,请选择完整的产品ID或主要对象ID(我建议只使用ID)
  • 然后,如果只有主ID被推送到队列中,队列使用者应该调用Web服务以获取完整对象,或者只获取对象本身并将相应的更改发送到弹性搜索/NoSQL数据库
  • 可能重复的