Есть ли способ обновить документ безболезненным сценарием без изменения порядка незатронутых полей?
Я использую Elasticsearch Update by Query API для обновления некоторых документов с помощью безболезненного скрипта, подобного этому (фактическийquery
посложнее):
POST ts-scenarios/_update_by_query?routing=test
{
"query": {
"term": { "routing": { "value": "test" } }
},
"script": {
"source": """ctx._source.tagIDs = ["5T8QLHIBB_kDC9Ugho68"]"""
}
}
Это работает, за исключением того, что при переиндексировании другие поля переупорядочиваются, включая некоторые классы, которые автоматически (де) сериализуются с использованием обработки типов JSON.NET. Это означает документ со следующим источником до обновления:
{
"routing" : "testsuite",
"activities" : [
{
"$type" : "Test.Models.SomeActivity, Test"
},
{
"$type" : "Test.Models.AnotherActivity, Test",
"CustomParameter" : 1,
"CustomSetting" : false
}
]
}
заканчивается как
{
"routing" : "testsuite",
"activities" : [
{
"$type" : "Test.Models.SomeActivity, Test"
},
{
"CustomParameter" : 1,
"CustomSetting" : false,
"$type" : "Test.Models.AnotherActivity, Test"
}
],
"tagIDs" : [
"5T8QLHIBB_kDC9Ugho68"
]
}
который JSON.NET не может десериализовать. Есть ли способ указать сценарию (или API обновления по запросу) не изменять порядок этих других полей?
Если это важно, я использую Elasticsearch OSS версии 7.6.1 на macOS. Я не проверял, будет ли здесь работать конвейер Ingest, так как я не знаком с ними.
(Оказывается, я могу сделать десериализацию более гибкой, установив на MetadataPropertyHandling
собственность ReadAhead
, как упоминалось здесь. Это работает, но, как уже упоминалось, это может снизить производительность и могут быть другие ситуации, когда порядок полей имеет значение. Технически этого не должно быть; JSON - это не XML, но всегда есть крайние случаи, когда это имеет значение.)