抱歉,我是 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
已经有与此相关的线程,但没有解决方法
答案2
解决此问题的方法是在 jdbc 块中使用时区
"timezone" : "TimeZone.getDefault()"
我还将日期和时间保存在 mysql DB 中的单独字段中
| date | date | YES | | NULL | |
| time | time | YES | | NULL | |
Elasticsearch 使用 Joda 时间格式保存日期。因此它会自动将我的日期转换为日期时间。
在日期字段中,由于我没有时间,它会自动添加零。
因为我需要通过 Kibana 显示数据,所以我需要这种分割。我将日期和时间的格式转换为 varchar(20) 作为一种解决方法(我知道这是一个坏主意)并且它现在工作正常。