2 回答

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í)遇到問題的人。

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")));
- 2 回答
- 0 關(guān)注
- 289 瀏覽
添加回答
舉報(bào)