我正在使用Elasticsearch的{{3}}用这样的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"]"""
}
}
这是有效的,除了重新索引后,其他字段会重新排序,包括一些使用Painless script自动(反序列化)的类。这意味着在更新之前具有以下来源的文档:
{
"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”)不要更改其他字段的顺序?
万一有问题,我正在macOS上使用Elasticsearch OSS版本7.6.1。我尚未检查Ingest管道在这里是否可以正常工作,因为我对此并不熟悉。
(事实证明,我可以通过将MetadataPropertyHandling
属性设置为ReadAhead
来使反序列化更加灵活,如JSON.NET's type handling所述。这是可行的,但如上所述,这可能会损害性能,并在那里可能在其他情况下,字段顺序也很重要。从技术上讲,这不应该; JSON不是XML,但在某些情况下,它确实很重要。)