У меня индекс, как показано ниже:
{
"_index": "mydata",
"_type": "_doc",
"_id": "PuhnbG0B1IIlyY9-ArdR",
"_score": 1,
"_source": {
"age": 9,
"@version": "1",
"updated_on": "2019-01-01T00:00:00.000Z",
"id": 4,
"name": "Emma",
"@timestamp": "2019-09-26T07:09:11.947Z"
}
Так что мой logstash conf для обновления данных вводится {
jdbc {
jdbc_connection_string => "***"
jdbc_driver_class => "***"
jdbc_driver_library => "***"
jdbc_user => ***
statement => "SELECT * from agedata WHERE updated_on > :sql_last_value ORDER BY updated_on"
use_column_value =>true
tracking_column =>updated_on
tracking_column_type => "timestamp"
}
}
output {
elasticsearch { hosts => ["localhost:9200"]
index => "mydata"
action => update
document_id => "{_id}"
doc_as_upsert =>true}
stdout { codec => rubydebug }
}
Итак, когда я запускаю это после любого обновления в том жестрока, мой ожидаемый вывод - обновить существующие значения _id для любых изменений, которые я сделал в этой строке.Но мой Elasticsearch индексирует его как новую строку, где мой _id рассматривается как строка.
"_index": "agesep",
"_type": "_doc",
"_id": ***"%{_id}"***
Дубликат возникает, когда я использую document_id => "% {id}" как: actual:
{
"_index": "mydata",
"_type": "_doc",
"_id": "BuilbG0B1IIlyY9-4P7t",
"_score": 1,
"_source": {
"id": 1,
"age": 13,
"name": "Greg",
"updated_on": "2019-09-26T08:11:00.000Z",
"@timestamp": "2019-09-26T08:17:52.974Z",
"@version": "1"
}
}
duplicate:
{
"_index": "mydata",
"_type": "_doc",
"_id": "1",
"_score": 1,
"_source": {
"age": 56,
"@version": "1",
"id": 1,
"name": "Greg",
"updated_on": "2019-09-26T08:18:00.000Z",
"@timestamp": "2019-09-26T08:20:14.561Z"
}
Как мне заставить его учесть существующий _id и не создавать дублирующее значение, когда я делаю обновления в ES?Я ожидаю обновить данные в индексе на основе _id, а не создавать новую строку обновления.