Извините, я новичок в 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"
}
}'
Я просматриваю некоторые документы, в которых упоминается, что мы можем запускать выбор 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'
Решение этой проблемы: мне нужно ВЫБРАТЬ одно из полей как '_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
По этому поводу уже есть тема, но обходного пути нет.
Решение этой проблемы - использовать часовой пояс в блоке jdbc.
"timezone" : "TimeZone.getDefault()"
Также я сохраняю дату и время в отдельном поле в базе данных mysql.
| date | date | YES | | NULL | |
| time | time | YES | | NULL | |
Elasticsearch использует формат времени Joda для сохранения даты. Следовательно, он автоматически преобразует мою дату в datetime.
В поле даты, поскольку у меня нет времени, оно автоматически добавляет к нему нули.
Поскольку мне нужно отображать данные через Kibana, вот почему мне нужно это разделение .. Я преобразовал формат даты и времени как varchar (20) в качестве обходного пути (плохая идея, я знаю), и теперь он работает нормально ..