有没有一种方法可以在不更改不受影响字段的顺序的情况下使用无痛脚本来更新文档?

时间:2020-05-19 12:14:41

标签: elasticsearch serialization elasticsearch-painless update-by-query

我正在使用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,但在某些情况下,它确实很重要。)

0 个答案:

没有答案