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);
        }
Пример #2
0
        /// <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}");
            }
        }
Пример #3
0
        /// <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);
        }