Назад | Перейти на главную страницу

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"
    }
}'

Я просматриваю некоторые документы, в которых упоминается, что мы можем запускать выбор 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

По этому поводу уже есть тема, но обходного пути нет.

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

Решение этой проблемы - использовать часовой пояс в блоке jdbc.

"timezone" : "TimeZone.getDefault()"

Также я сохраняю дату и время в отдельном поле в базе данных mysql.

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

Elasticsearch использует формат времени Joda для сохранения даты. Следовательно, он автоматически преобразует мою дату в datetime.

В поле даты, поскольку у меня нет времени, оно автоматически добавляет к нему нули.

Поскольку мне нужно отображать данные через Kibana, вот почему мне нужно это разделение .. Я преобразовал формат даты и времени как varchar (20) в качестве обходного пути (плохая идея, я знаю), и теперь он работает нормально ..