【问题标题】:How to Update nested objects in Elasticsearch documents?如何更新 Elasticsearch 文档中的嵌套对象?
【发布时间】:2020-09-22 18:05:32
【问题描述】:

我正在尝试找到使用嵌套对象更新文档的最佳做法: 我正在使用 ES 作为视图缓存:

假设我的 SQL DB 中有两个实体: 第一个是AddressHomes,它们之间的关系太多了

Address Table has columns=> Id , Street, ZipCode

Home Table has colmns=> Id, AddressId(FK), price

我将它们存储在 ES 聚合中:

Home : {
Id: 1,
price : 3000,
Address :{
   id: 1,
   street: "blabla",
   zibcode : 12345

  }
}

如果我对地址进行了任何更改,我想用新值更新主页索引中包含相同地址的所有 主页文档。 我需要知道如何在对 ES 的一次请求中更新同一索引中的所有文档。

【问题讨论】:

    标签: c# elasticsearch nest


    【解决方案1】:

    _update_by_query 可能就是你想要的。

    这不是很漂亮,但它应该可以完成工作:

    PUT test/_doc/1
    {
      "Id": 1,
      "price": 3000,
      "Address": {
        "id": 1,
        "street": "blabla",
        "zipcode": 12345
      }
    }
    
    POST test/_update_by_query
    {
      "query": { 
        "term": {
          "Address.id": 1
        }
      },
      "script": {
        "source": "ctx._source['Address']['id'] = 2;ctx._source['Address']['street'] = 'foo';ctx._source['Address']['zipcode'] = 5678"
      }
    }
    
    GET test/_doc/1
    

    然后输出是:

    {
      "_index" : "test",
      "_type" : "_doc",
      "_id" : "1",
      "_version" : 9,
      "_seq_no" : 8,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
        "Address" : {
          "zipcode" : 5678,
          "street" : "foo",
          "id" : 2
        },
        "price" : 3000,
        "Id" : 1
      }
    }
    

    【讨论】:

    • 我可以直接更新Address而不迭代props吗?
    • 我不知道你如何定义完整的子文档而不是覆盖每个单独的属性——我试过了,但恐怕不能让它工作。
    猜你喜欢
    • 2012-05-18
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多