elasticsearch-river-jdbc 在 mysql db 中插入重复记录

elasticsearch-river-jdbc 在 mysql db 中插入重复记录

抱歉,我是 Elasticsearch 的新手,我正在使用 elasticsearch-river-jdbc 连接到 myql 数据库,除了每次按计划运行时都会插入重复记录之外,一切正常。这就是我正在使用的

curl -XPUT 'localhost:9200/_river/my_jdbc_river/_meta' -d '{
"type" : "jdbc",
"schedule" : "0 0-59 0-23 ? * *",
"jdbc" : {
    "url" : "jdbc:mysql://localhost:3306/test",
    "user" : "test",
    "password" : "test",
    "sql" : "select * from test"
    }
}'

我浏览了一些文档,其中提到我们可以基于 _id 运行 sql 查询选择,但我的问题是当我们创建这条河流时,只有这个唯一的 id 才会被创建,并且它是在 Elasticsearch 端创建的,所以根据我的理解,mysql 对此一无所知。如果我遗漏了什么,请告诉我

所以如果我写这样的 SQL 语句

 "sql" : "select id as _id,a1,a2 from test"

[2015-03-10 13:16:00,018][ERROR][river.jdbc.RiverPipeline ] com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'id' in 'field list'
java.io.IOException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'id' in 'field list'

答案1

解决这个问题的方法是,我需要选择其中一个字段作为“_id”才能工作

 "sql" : "select *, revision as _id from test;"

现在另一个问题是,当将数据写回 ES 时,数据和时间格式更改为 UTC

for eg: 2015-03-11T00:00:00.000-07:00 and 1970-01-01T10:55:54.000-08:00

已经有与此相关的线程,但没有解决方法

https://stackoverflow.com/questions/12969481/jprante-elasticsearch-jdbc-river-changing-the-date-value

答案2

解决此问题的方法是在 jdbc 块中使用时区

"timezone" : "TimeZone.getDefault()"

我还将日期和时间保存在 mysql DB 中的单独字段中

| date | date | YES | | NULL | |
| time | time | YES | | NULL | |

Elasticsearch 使用 Joda 时间格式保存日期。因此它会自动将我的日期转换为日期时间。

在日期字段中,由于我没有时间,它会自动添加零。

因为我需要通过 Kibana 显示数据,所以我需要这种分割。我将日期和时间的格式转换为 varchar(20) 作为一种解决方法(我知道这是一个坏主意)并且它现在工作正常。

相关内容