日常使用es过程中,我们经常会涉及到批量更新以及单个更新,本文通过浅显易懂的demo,用来展示如何通过ID进行单个文档的更新,以及使用script进行批量更新
using ElasticHelper.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Elasticsearch.Net;
using Nest;
namespace ElasticHelper.Helper
{
public interface IEsService<T> where T : BaseModel
{
Task<UpdateResponse<T>> Update(string index, string id, T doc);
Task<bool> UpdateByQuery(string index);
}
public class EsService<T>:IEsService<T> where T : BaseModel
{
private readonly ElasticClient _client;
public EsService()
{
var pool = new SingleNodeConnectionPool(new Uri("http://192.168.214.132:9200"));
var connectconfig = new ConnectionSettings(pool).BasicAuthentication("elastic","ellischen").EnableDebugMode();
_client = new ElasticClient(connectconfig);
}
public async Task<bool> UpdateByQuery(string index)
{
SearchRequest searchrequest = new SearchRequest<T>(index)
{
Query = new LongRangeQuery
{
Field = "pageCount",
GreaterThanOrEqualTo = 199,
LessThanOrEqualTo = 200
}
};
//var documents = _client.Search<T>(searchrequest).Documents.ToList();
//return true;
var response = await _client.UpdateByQueryAsync<T>(x => x.Index(index).Query(x => searchrequest.Query).Script("ctx._source.pageCount = ctx._source.pageCount+990")
.Conflicts(Conflicts.Proceed)
.Refresh(true));
Console.WriteLine(response.DebugInformation);
return true;
}
public Task<UpdateResponse<T>> Update(string index,string id,T books)
{
return _client.UpdateAsync(DocumentPath<T>.Id(id),x=>x.Index(index).DocAsUpsert(true).Doc(books));
}
}
}
https://discuss.elastic.co/t/nest-api-updatebyquery/128759/2
https://hassantariqblog.wordpress.com/2016/09/22/elastic-search-update-document-using-nest-in-net/