我正在使用 Elasticsearch 的Update by Query API使用这样的Painless 脚本更新一些文档(实际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 更新)不要更改其他字段的顺序?
万一这很重要,我在 macOS 上使用 Elasticsearch OSS 版本 7.6.1。我还没有检查 Ingest 管道是否可以在这里工作,因为我不熟悉它们。
(事实证明,我可以通过将MetadataPropertyHandling
属性设置为 来使反序列化更加灵活,如此处ReadAhead
所述。这可行,但如前所述,它可能会损害性能,并且可能存在字段顺序很重要的其他情况。从技术上讲,它不应该;JSON不是 XML,但总有一些边缘情况确实很重要。)