Мы используем приложение Spring Boot для вставки/обновления эластичных поисковых документов. Наш поставщик данных отправляет нам данные через Kafka. Наше приложение обрабатывает события, пытается найти запись и вставить запись, если она не существует, или обновить, если полученная запись отличается от сохраненной. В elasticsearch не должно быть повторяющихся записей.
Приложение вставляет/обновляет документы с НЕМЕДЛЕННЫМ обновлением
Проблема: иногда нам приходится удалять все данные и загружать их снова, потому что записи дублируются. Я обнаружил, что эти клонированные записи отличаются только датой вставки. Обычно разница в несколько часов.
В целом все работает как положено, детальные интеграционные тесты на org.codelibs.elasticsearch-cluster-runner
выделены зеленым цветом.
Пример метаданных эластичного поискового запроса:
{
"docs" : [
{
"_index" : "reference",
"_type" : "reference",
"_id" : "s0z-BHIBCvxpj4TjysIf",
"_version" : 1,
"_seq_no" : 17315835,
"_primary_term" : 40,
"found" : true,
"_source" : {
...
"insertedDate" : 1589221706262,
...
}
},
{
"_index" : "reference",
"_type" : "reference",
"_id" : "jdVCBHIBXucoJmjM8emL",
"_version" : 1,
"_seq_no" : 17346529,
"_primary_term" : 41,
"found" : true,
"_source" : {
...
"insertedDate" : 1589209395577,
...
}
}
]
}
Тесты
- Я много раз загружал данные в локальный экземпляр ES - дубликатов нет
- Я создал несколько долго работающих интеграционных тестов с большим количеством вставок, обновлений, запросов на локальном экземпляре
org.codelibs.elasticsearch-cluster-runner
с 1-5 узлами в памяти - без дублирования.
Подробности: версия Elastic Search — соединение 7.5 ES с org.elasticsearch.client.RestHighLevelClient