Проблема с заливкой данных. Проблема с преобразованием типов

Есть заранее созданный индекс. В нем есть поле fullprice. В маппинге указан у него тип double.

При загрузке данных, периодически появляется ошибка
java.lang.IllegalArgumentException: mapper [fullprice] cannot be changed from type [long] to [float]

в поле fullprice записывается значение 100000.00
Вопрос в чем:

  1. почему не может преобразовать?
  2. почему пишет что не может преобразовать в тип float если тип стоит double
  3. как побороть данную проблему?

Как маппинг для этого поля выглядит?

    "fullprice": {
      "type": "double"
    }

Чем вы загружаете данные? Похоже, что это приложение пытается поменять маппинг для этого поля, однако странно что оно у вас double в маппинге. Судя по ошибке, в индексе, с которым вы работаете, оно у вас long.

так в том то и дело, что никто маппинг не меняет, в индексе тип double, а при вставке ругается что не может long во float преобразовать... при чем после ошибки, если заново залить этот же Json в БД, то ошибки не будет!

Какая версия? Можно текст ошибки целиком со стеком посмотреть?

Версия 6.4.3

Ошибка:

Caused by: java.lang.IllegalArgumentException: mapper [fullprice] cannot be changed from type [long] to [float] at
org.elasticsearch.index.mapper.MappedFieldType.checkTypeName(MappedFieldType.java:141) at
org.elasticsearch.index.mapper.MappedFieldType.checkCompatibility(MappedFieldType.java:153) at
org.elasticsearch.index.mapper.FieldTypeLookup.validateField(FieldTypeLookup.java:157) at
org.elasticsearch.index.mapper.FieldTypeLookup.copyAndAddAll(FieldTypeLookup.java:108) at
org.elasticsearch.index.mapper.MapperService.internalMerge(MapperService.java:440) at
org.elasticsearch.index.mapper.MapperService.internalMerge(MapperService.java:355) at
org.elasticsearch.index.mapper.MapperService.merge(MapperService.java:287) at
org.elasticsearch.cluster.metadata.MetaDataMappingService$PutMappingExecutor.applyRequest(MetaDataMappingService.java:312) at
org.elasticsearch.cluster.metadata.MetaDataMappingService$PutMappingExecutor.execute(MetaDataMappingService.java:229) at
org.elasticsearch.cluster.service.MasterService.executeTasks(MasterService.java:639) at
org.elasticsearch.cluster.service.MasterService.calculateTaskOutputs(MasterService.java:268) at
org.elasticsearch.cluster.service.MasterService.runTasks(MasterService.java:198) at
org.elasticsearch.cluster.service.MasterService$Batcher.run(MasterService.java:133) at
org.elasticsearch.cluster.service.TaskBatcher.runIfNotProcessed(TaskBatcher.java:150) at
org.elasticsearch.cluster.service.TaskBatcher$BatchedTask.run(TaskBatcher.java:188) at
org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:624) at
org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.runAndClean(PrioritizedEsThreadPoolExecutor.java:244) at
org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:207) at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at
java.lang.Thread.run(Thread.java:748)

Я не понимаю, как такая ошибка возможна при условии что

Есть заранее созданный индекс. В нем есть поле fullprice. В маппинге указан у него тип double.

Вы уверены что маппинг заранее создается правильно и для правильного типа/индекса?

Да. Моппинги создаём заранее, иначе возникали коллизии при добавлении. Причём если ещё раз попытаться запихать Json который не прошёл, он успешно потом добавляется

какие то мысли есть по данной проблеме?)

Обновили версию БД до 6.6.1

ошибка все так же имеет место быть.

версия
{
"name" : "h2VWSmu",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "WBanQVMMSR6n0SgfKweehg",
"version" : {
"number" : "6.6.1",
"build_flavor" : "default",
"build_type" : "deb",
"build_hash" : "1fd8f69",
"build_date" : "2019-02-13T17:10:04.160291Z",
"build_snapshot" : false,
"lucene_version" : "7.6.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}

вот ссылка на свежий стек
https://xpaste.pro/p/c54a807cd874cc56a11f863251188135

Покажите, пожалуйста, как выглядит mapping для индекса purchase_plan_44?

http://xpaste.pro/p/f36e31e49392ee611e472864359b8aa8

Как вы получили этот маппинг? Это из команды, которую вы запускаете для создания этого индекса? Я хотел бы взглянуть на реальный маппинг для этого конкретного индекса purchase_plan_44, полученный командой GET purchase_plan_44.

Присланный маппинг был получен через Kaizer.

Вот с помощью команды

https://xpaste.pro/p/b7d3717bfc04f2fd016bafe014ebbbf9

Маппинг, который мы мне прислали не из того индекса, с которым произошла ошибка, которую вы присылали ранее. Так что либо эти два индекса с одним и тем же именем находятся в разных кластерах, либо кто-то удалил индекс с именем purchase_plan_44 после того, как произошла ошибка и создал другой индекс с таким же именем.

Скорее всего, вы думаете, что вы создаете индекс заранее, но некоторые данные все-таки проскакивают до того, как вы создали индекс, вызывают эту ошибку и после этого вы пересоздаете индекс.

Чтобы проверить эту теорию, поищите по логу строку purchase_plan_44. Когда индекс создается вместе с маппингом, то лог на мастере должен выглядеть так:

[INFO ][o.e.c.m.MetaDataCreateIndexService] [h2VWSmu] [purchase_plan_44] creating index, cause [api], templates [], shards [5]/[1], mappings [purchase]

Если индекс создался автоматически из-за bulk индексации, то лог будет выглядеть так:

[INFO ][o.e.c.m.MetaDataCreateIndexService] [h2VWSmu] [purchase_plan_44] creating index, cause [auto(bulk api)], templates [], shards [5]/[1], mappings []

Обратите внимание на cause. api - означает, что индекс создали вы, если там auto(....) то значит записи начали поступать, до того, как вы создали индекс. И обратите внимание на mappings [...].

Я перед посылкой маппинга прислал свежий лог по ошибке с purchase_plan_44. Просто данные ошибки появляются не только на этом индексе. И к только я увидел в логе ошибку, я просто послал новую

Вы можете прислать ошибку и маппинг, которые соответствовали бы друг другу?

Так последний маппинг и последняя ошибка соответствуют