概述
对于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 Task<bool> UpdateByQueryAsync<T>(string scriptSourceStr, QueryContainerDescriptor<T> query, Dictionary<string, object> 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<UserShipEventReport> query = new QueryContainerDescriptor<UserShipEventReport>();
//query.Term(it => it.chat_user_id, 123423);
request.Query = query;
var response = await DB.UpdateByQueryAsync(request);
return response.Total > 0 ? true : false;
}
外面类调用该方法:
QueryContainerDescriptor<UserShipEventReport> query = new QueryContainerDescriptor<UserShipEventReport>();
query.Term(it => it.friend_user_id, eventData.userId);
Dictionary<string, object> dic = new Dictionary<string, object>();
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 Task<bool> UpdateAsync(Id id, object obj)
{
Nest.IUpdateRequest<UserShipEventReport, object> request = new Nest.UpdateRequest<UserShipEventReport, object>(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; }
}
最后
以上就是耍酷大船为你收集整理的C#中 ElasticSearch的数据更新的全部内容,希望文章能够帮你解决C#中 ElasticSearch的数据更新所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复