public async Task Test_UpdateByQueryAsync() { using var scope = ServiceProvider.CreateScope(); var resp = scope.ServiceProvider.GetService <IEsRepository <StudentSample> >(); var student = _students.First(); await resp.InsertAsync(student); // 需要延迟一下 await Task.Delay(1000); var descriptor = new UpdateByQueryDescriptor <StudentSample>(); descriptor .Script(s => s .Source("ctx._source.name='隔壁老王八'") .Lang("painless")) .Query(q => q .Term(r => r .Field(f => f.StudentId) .Value(student.StudentId))); await resp.UpdateByQueryAsync(descriptor); var result = await resp.FindByIdAsync(student.StudentId); Assert.Equal("隔壁老王八", result.Name); await resp.DeleteAsync(student); }
/// <summary> /// 按查询条件更新 /// </summary> /// <param name="descriptor">查询更新描述符</param> /// <param name="cancellationToken">取消令牌</param> public async Task UpdateByQueryAsync(UpdateByQueryDescriptor <TEntity> descriptor, CancellationToken cancellationToken = default) { var indexName = Helper.SafeIndexName <TEntity>(IndexName); descriptor = descriptor.Index(Context.GetIndexName(IndexName)); Func <UpdateByQueryDescriptor <TEntity>, IUpdateByQueryRequest> selector = x => descriptor; var response = await Context.UpdateByQueryAsync(selector, cancellationToken); if (!response.IsValid) { throw new ElasticsearchException($"索引[{indexName}]更新数据失败 : {response.ServerError.Error.Reason}"); } }
/// <summary>生成按查询更新请求</summary> private IUpdateByQueryRequest UseUpdateQuery(UpdateByQueryDescriptor <TIndexType> updateDescriptor, IndexSaveRequest request) { var resourceKeys = request.Metadatas.Select(e => e.ResourceKey).ToArray(); updateDescriptor .Type(this.IndexType) .Query(queryDescriptor => queryDescriptor .Terms(e => e .Field(f => f[MetadataConsts.ResourceKey]) .Terms(resourceKeys) ) ); return(updateDescriptor); }