我正在使用ElasticSearch的JDBC插件来更新我的MySQL数据库。它会获取新的和已更改的记录,但不会删除已从MySQL中删除的记录。它们仍然在索引中。
这是我用来创建河流的代码:
curl -XPUT 'localhost:9200/_river/account_river/_meta' -d '{
"type" : "jdbc",
"jdbc" : {
"driver" : "com.mysql.jdbc.Driver",
"url" : "jdbc:mysql://localhost:3306/test",
"user" : "test_user",
"password" : "test_pass",
"sql" : "SELECT `account`.`id` as `_id`, `account`.`id`, `account`.`reference`, `account`.`company_name`, `account`.`also_known_as` from `account` WHERE NOT `account`.`deleted`",
"strategy" : "simple",
"poll" : "5s",
"versioning" : true,
"digesting" : false,
"autocommit" : true,
"index" : "headphones",
"type" : "Account"
}
}'
在OSX Mountain Lion上通过自制软件安装ElasticSearch,没有任何错误或问题,一切都按预期响应。权限没问题,日志中没有错误。
我已经删除了,并且包含(并设置为true和false)我能想到的autocommit
,versioning
和digesting
的每个组合。它是一个开发数据库,所以我确信记录被完全删除,而不是缓存而不是软删除。如果我删除所有记录(即保留河流完整并删除ES上索引的内容),下次河流更新时不会重新添加记录,这让我相信我遗漏了版本控制和删除的内容
注意我还尝试了各种方法来指定_id
列,并通过JSON调用它检查它是否有值。
干杯。
答案 0 :(得分:3)
由于这个问题已被提出,参数已发生很大变化,版本控制和摘要已被弃用,民意调查已被日程安排取代,这将取决于重新运行河流的频率(下面计划运行)每隔5分钟)
curl -XPUT 'localhost:9200/_river/account_river/_meta' -d '{
"type" : "jdbc",
"jdbc" : {
"driver" : "com.mysql.jdbc.Driver",
"url" : "jdbc:mysql://localhost:3306/test",
"user" : "test_user",
"password" : "test_pass",
"sql" : "SELECT `account`.`id` as `_id`, `account`.`id`, `account`.`reference`, `account`.`company_name`, `account`.`also_known_as` from `account` WHERE NOT `account`.`deleted`",
"strategy" : "simple",
"schedule": "0 0/5 * * * ?" ,
"autocommit" : true,
"index" : "headphones",
"type" : "Account"
}
}'
但是对于主要问题,我从开发者那里得到的答案是这样的 https://github.com/jprante/elasticsearch-river-jdbc/issues/213
不再检测到删除行。
我尝试使用版本管理,但这不起作用 连同增量更新和添加行。
一种好的方法是加窗索引。每个时间框架(可能一次) 每天或每周)为河流创建一个新索引,并添加 别名。旧指数将在一段时间后被抛弃。这个 维护类似于logstash索引,但它不在 河流的范围。
我目前用作研究别名的方法是我每晚重建索引和河流,并安排河流每隔几个小时运行一次。它确保当天将新数据编入索引,删除将每24小时反映一次
答案 1 :(得分:0)
我仍然相对较新的弹性,并一直在使用jdbc河为我的项目。 如果我理解正确,这不一定是这种情况,这就是它的工作原理:
因此,考虑到您希望运行内务处理,您需要将版本控制设置为true
,然后这意味着digesting
也应设置为true
。
所以说你的河应该是这样的:
curl -XPUT 'localhost:9200/_river/account_river/_meta' -d '{
"type" : "jdbc",
"jdbc" : {
"driver" : "com.mysql.jdbc.Driver",
"url" : "jdbc:mysql://localhost:3306/test",
"user" : "test_user",
"password" : "test_pass",
"sql" : "SELECT `account`.`id` as `_id`, `account`.`id`, `account`.`reference`, `account`.`company_name`, `account`.`also_known_as` from `account` WHERE NOT `account`.`deleted`",
"strategy" : "simple",
"poll" : "5s",
"autocommit" : true,
"index": {
"index" : "headphones",
"type" : "Account",
"versioning" : true,
"digesting" : true
}
}
}'
请注意,versioning
和digesting
应该是index
定义的一部分,而不是jdbc
定义