对于es的更新 *** 作,也是有一定的场景需要更新es中的数据,但并不是可以随意更改,毕竟es的优势是海量数据的查询。
多的不说直接看如何 *** 作,首先我们来看下,Es提供的api接口是如何做到修改的?
ES API中给我们提供了一个_update_by_query的api。我直接拿来试:
这是请求的body,通过post请求
{ "query": { "term": { "ship_id": 100 } }, "script": { "lang": "painless", "source": "ctx._source.remark = params.live_name;ctx._source.nick_name = params.nick_name", "params": { "live_name": "备注备注", "nick_name":"李四" } } }
调用的方式,请看一下图片:
这里可以进行批量的多字段更新,经过某条件查询,这里查询条件好像只能支持单条件的,如果有其他办法,还请大神门指针。
c# 代码如下:
public async TaskUpdateByQueryAsync (string scriptSourceStr, QueryContainerDescriptor query, Dictionary scriptParams) where T : class, new() { IUpdateByQueryRequest request = new UpdateByQueryRequest(IndexName); Iscript script = new Inlinescript(scriptSourceStr); script.Lang = "painless"; script.Params = scriptParams; request.script = script; //QueryContainerDescriptor query = new QueryContainerDescriptor (); //query.Term(it => it.chat_user_id, 123423); request.Query = query; var response = await DB.UpdateByQueryAsync(request); return response.Total > 0 ? true : false; }
外面类调用该方法:
QueryContainerDescriptorquery = new QueryContainerDescriptor (); query.Term(it => it.friend_user_id, eventData.userId); Dictionary dic = new Dictionary (); dic.Add("head_icon", eventData.headImageUrl); dic.Add("nick_name", eventData.userName); _userShipEsHelper.UpdateByQueryAsync("ctx._source.head_icon = params.head_icon; ctx._source.nick_name = params.nick_name", query, dic).ConfigureAwait(false).GetAwaiter().GetResult(); //注:_source里面的params就是对应的dic里面的元素值
es的更新还可以根据主键id来更新,es的数据源中我们可以选择一个字段作为id。直接上代码:
public async TaskUpdateAsync(Id id, object obj) { Nest.IUpdateRequest request = new Nest.UpdateRequest (IndexName, id) { Doc = obj }; var response = await DB.UpdateAsync(request); return response.Result == Result.Updated; }
我们需要在实体中增加id的标识:
[ElasticsearchType(IdProperty = "ship_id")] public class UserShipEventReport { public long ship_id{ get; set; } public long chat_user_id { get; set; } public long friend_user_id { get; set; } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)