栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

C#中 ElasticSearch的数据更新

C#中 ElasticSearch的数据更新

对于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 UpdateByQueryAsync(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;
        }

外面类调用该方法:

            QueryContainerDescriptor query = 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 Task UpdateAsync(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; }
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/670908.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号