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<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; }
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Elasticsearch更新数据有几种方式。其一种方式是通过将旧文档标记为已删除,并增加一个全新的文档来更新数据。虽然无法直接访问旧版本的文档,但它们并不会立即消失。随着索引更多的数据Elasticsearch会在后台清理这些已删除的文档。 另一种方式是使用ElasticSearch提供的丰富的操作数据的API来更新数据。可以使用相同的index API进行实现,通过执行PUT请求来替换现有的文档。这意味着无法直接修改文档,而是需要通过重建索引或替换的方式来更新文档。例如,可以执行以下请求来更新文档:PUT /website/blog/123 { "title": "My first blog entry", "text": "I am starting to get the hang of this...", "date": "2014/01/02" }<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [elasticsearch 更新修改数据(添加和删除字段等)](https://blog.csdn.net/qq_36951116/article/details/113353034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [关于ElasticSearch更新数据的几种方式](https://blog.csdn.net/weixin_38809962/article/details/79768002)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值