ElasticSearch river JDBC MySQL不删除记录

时间:2014-01-21 13:52:00

标签: mysql elasticsearch elasticsearch-jdbc-river

我正在使用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)我能想到的autocommitversioningdigesting的每个组合。它是一个开发数据库,​​所以我确信记录被完全删除,而不是缓存而不是软删除。如果我删除所有记录(即保留河流完整并删除ES上索引的内容),下次河流更新时不会重新添加记录,这让我相信我遗漏了版本控制和删除的内容

注意我还尝试了各种方法来指定_id列,并通过JSON调用它检查它是否有值。

干杯。

2 个答案:

答案 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河为我的项目。 如果我理解正确,这不一定是这种情况,这就是它的工作原理:

  1. 从中获取所有行(由河中的SQL语句指定) 数据库。
  2. 计算所有提取行的(id,type和index)的摘要(如果添加了新行或删除了行,则应该 变化)。
  3. 对所有行重新索引文档。这将自动进行 增加每个文档的版本。
  4. 存储在_river索引(自定义)中的河流的增量版本
  5. 如果#3中的计算摘要不同于#3 存储在_river索引中然后:
    • 存储
    • 运行内务处理功能(删除版本号较低的所有文档)。
  6. 因此,考虑到您希望运行内务处理,您需要将版本控制设置为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
            }
        }
    }'
    

    请注意,versioningdigesting应该是index定义的一部分,而不是jdbc定义