第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何使用 Nest Elasticsearch 更新嵌套對(duì)象?

如何使用 Nest Elasticsearch 更新嵌套對(duì)象?

C#
蕪湖不蕪 2022-08-20 16:12:17
我有產(chǎn)品索引,為簡(jiǎn)單起見,它有兩個(gè)字段Id和ProductAttributes作為嵌套對(duì)象,定義如下:public class ProductType{    public Guid Id { get; set; }    public List<ProductAttribute> ProductAttributes { get; set; } }public class ProductAttribute{    public Guid Id { get; set; }    public string Name { get; set; }    public string Value { get; set; }}以及以下映射:elasticClient.CreateIndex("product", i => i       .Settings(s => s                 .NumberOfShards(2)                 .NumberOfReplicas(0)                 )                 .Mappings(m => m                   .Map<ProductType>(map => map                         .AutoMap()                         .Properties(p => p                          .Nested<ProductAttribute>(n => n                            .Name(c => c.ProductAttributes)                            .AutoMap()                            .Properties(nc => nc                               .Keyword(t => t                                   .Name(nn => nn.Name)                                   )                              .Keyword(t => t                                .Name(nn => nn.Value)                             )                  )             )現(xiàn)在我正在嘗試更新嵌套對(duì)象中的名稱字段,并且我已嘗試使用腳本更新實(shí)現(xiàn)它,如下所示:        var scriptParams = new Dictionary<string, object>                            {                                {"name", "new name"}                            };        var result = elasticClient.UpdateByQuery<ProductType>(u => u                              .Script(sn => sn                                   .Inline(                                          $"ctx._source.productAttributes= params.name;"                                       )                                  .Params(scriptParams)                              )                              .Conflicts(Conflicts.Proceed)                              .Refresh(true)                          );但是使用上面的查詢我無法更新嵌套對(duì)象,您能告訴我如何使用嵌套ES使用_update_by_query api更新嵌套對(duì)象嗎?
查看完整描述

2 回答

?
慕的地8271018

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊

最后,我發(fā)現(xiàn)了如何根據(jù)特定的嵌套對(duì)象的id僅更新其名稱屬性,如下所示:


var result = elasticClient.UpdateByQuery<ProductType>(u => u

                  .Query(q => q

                        .Nested(n => n

                          .Path(Infer.Field<ProductType>(ff => ff.ProductAttributes))

                          .Query(nq => nq

                              .Term(Infer.Field<ProductType>(ff => ff.ProductAttributes.First().Id), productAttributeId)

                          )

                        )

                  )

                  .Script(ss => ss.Inline("if (ctx._source.productAttributes != null){for (item in ctx._source.productAttributes){if (item.id == params.id) {item.name = params.name;}}}")

                     .Params(new Dictionary<string, object>()

                     {

                         {"id", productAttributeId},

                         {"name", productAttributeName}

                     }).Lang("painless")

                  )

                  .Conflicts(Conflicts.Proceed)

                  .Refresh(true)

              );

這里生成的查詢:


 POST product/producttype/_update_by_query?conflicts=proceed&refresh=true 

{

  "query": {

    "bool": {

      "must": [

        {

          "nested": {

            "query": {

              "term": {

                "productAttributes.id": {

                  "value": "563243f0-8fbb-4adf-a78d-1339e5971a43"

                }

              }

            },

            "path": "productAttributes"

          }

        }

      ]

    }

  },

  "script": {

    "params": {

        "id":"563243f0-8fbb-4adf-a78d-1339e5971a43",

        "name": "CPU"

    },

    "lang": "painless",

    "inline": "if (ctx._source.productAttributes != null){for (item in ctx._source.productAttributes){if (item.id == params.id) {item.name = params.name;}}}"

  }

}

那么上面的查詢有什么作用:


它首先搜索產(chǎn)品屬性為 563243f0-8fbb-4adf-a78d-1339e5971a43 ID 的產(chǎn)品,然后循環(huán)訪問 productAttribute 嵌套對(duì)象以僅更新具有該 ID 的屬性,然后再次為文檔重新編制索引。


我希望我的答案可以幫助其他在 Elasticsearch 中更新嵌套對(duì)象時(shí)遇到問題的人。


查看完整回答
反對(duì) 回復(fù) 2022-08-20
?
MMTTMM

TA貢獻(xiàn)1869條經(jīng)驗(yàn) 獲得超4個(gè)贊

看起來像問題在這里 $“ctx._source.productAttributes= params.name;”


productAttributes 是一個(gè)對(duì)象(嵌套對(duì)象),params.name 是一個(gè)值(字符串),ES 在查詢響應(yīng)中抱怨什么。


不確定您到底想做什么,如果您的要求是更新所有產(chǎn)品屬性元素的名稱,您可以嘗試以下操作:


        var result = elasticClient.UpdateByQuery<ProductType>(u => u

            .Index("product")

            .Script(ss => ss.Source("for(int i=0; i<ctx._source.productAttributes.size(); i++){HashMap myKV = ctx._source.productAttributes.get(i);myKV.put(params.item.fieldName, params.item.fieldValue);}")

                        .Params(d => d.Add("item", new Dictionary<string, object>()

                        {

                            {"fieldName", "name" },

                            {"fieldValue", "new name" }

                        })).Lang("painless")));


查看完整回答
反對(duì) 回復(fù) 2022-08-20
  • 2 回答
  • 0 關(guān)注
  • 289 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)