0

我正在使用 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,但总有一些边缘情况确实很重要。)

4

0 回答 0