示例#1
0
        /// <summary>
        /// 修改模板(先删除新增)
        /// </summary>
        /// <param name="templateName">模板名称名称</param>
        /// <returns></returns>
        public async Task <HttpResponseResultModel <bool> > PutTemplateAsync <T>(string templateName) where T : class, new()
        {
            HttpResponseResultModel <bool> httpResponseResultModel = new HttpResponseResultModel <bool>();

            Init <T>();
            client = new ElasticSearchConfiguration(PocoAlias).GetClient();
            var indexTemplateResponse = await client.Indices.TemplateExistsAsync(templateName);

            if (indexTemplateResponse.Exists)
            {
                httpResponseResultModel = await DeleteTemplateAsync(templateName);

                if (httpResponseResultModel.IsSuccess)
                {
                    var indexSettings = new ESIndexSettingsModel();
                    httpResponseResultModel = await CreateTemplateAsync <T>(indexSettings);
                }
            }
            else
            {
                httpResponseResultModel.IsSuccess    = false;
                httpResponseResultModel.ErrorMessage = "模板不存在";
            }
            return(httpResponseResultModel);
        }
示例#2
0
        /// <summary>
        /// 创建模板
        /// </summary>
        /// <typeparam name="T">索引实体</typeparam>
        /// <param name="indexSettings"></param>
        /// <returns></returns>
        public async Task <HttpResponseResultModel <bool> > CreateTemplateAsync <T>(ESIndexSettingsModel indexSettings = null) where T : class, new()
        {
            HttpResponseResultModel <bool> httpResponseResultModel = new HttpResponseResultModel <bool>();

            Init <T>();
            if (indexSettings == null)
            {
                indexSettings = new ESIndexSettingsModel();
            }
            #region 创建模板
            var      index_patterns   = PocoData.DefaultIndexName.ToLower();
            int      numberOfReplicas = indexSettings.NumberOfReplicas;
            int      numberOfShards   = indexSettings.NumberOfShards;
            TimeSpan refreshInterval  = new TimeSpan(0, 0, 0, indexSettings.RefreshInterval);
            string   templateName     = PocoTemplate;
            //设置模板
            //.Setting("index.lifecycle.name", "my_policy")
            //  await _client.IndexLifecycleManagement.PutLifecycleAsync("w", t => t.Policy(p => p.Phases(p1 => p1.Warm(w => w.MinimumAge("60d")))));
            var templateResponse = await client.Indices.PutTemplateAsync(templateName, template => template.Create(true).Map(m => m.AutoMap <T>()).IncludeTypeName(false)
                                                                         .Settings(setting => setting.NumberOfReplicas(numberOfReplicas).NumberOfShards(numberOfShards).RefreshInterval(refreshInterval))
                                                                         .Aliases(a => a.Alias(PocoAlias))
                                                                         .IndexPatterns(index_patterns + "_*")
                                                                         .IncludeTypeName(false)
                                                                         );

            bool isTemplateExist = templateResponse.Acknowledged;
            httpResponseResultModel.IsSuccess = isTemplateExist;
            if (!isTemplateExist)
            {
                httpResponseResultModel.ErrorMessage = "创建模板失败";
            }
            return(httpResponseResultModel);

            #endregion
        }
        /// <summary>
        ///  控制器中的操作执行之前调用此方法
        /// </summary>
        /// <param name="actionContext"></param>
        public override void OnActionExecuting(ActionExecutingContext actionContext)
        {
            var modelState = actionContext.ModelState;

            if (!modelState.IsValid)
            {
                string error = string.Empty;
                foreach (var key in modelState.Keys)
                {
                    var state = modelState[key];
                    if (state.Errors.Any())
                    {
                        var    errorInfo = state.Errors.First();
                        string ex        = (errorInfo.Exception == null ? "" : errorInfo.Exception.ToString());
                        error = string.IsNullOrEmpty(errorInfo.ErrorMessage) ? ex : errorInfo.ErrorMessage;
                        break;
                    }
                }
                HttpResponseResultModel <string> response = new HttpResponseResultModel <string>()
                {
                    IsSuccess = false, ErrorMessage = error, HttpStatusCode = HttpStatusCode.BadRequest
                };

                actionContext.Result = new JsonResult(response);
            }
        }
 /// <summary>
 /// 控制器中的操作异常调用此方法
 /// </summary>
 /// <param name="actionExecutedContext"></param>
 /// <returns></returns>
 public override Task OnExceptionAsync(ExceptionContext actionExecutedContext)
 {
     if (actionExecutedContext.Exception != null)
     {
         WriteErrorAsync(actionExecutedContext);
     }
     if (actionExecutedContext.Exception is NotImplementedException)
     {
         actionExecutedContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.NotImplemented;
     }
     else if (actionExecutedContext.Exception is TimeoutException)
     {
         actionExecutedContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.RequestTimeout;
     }
     else
     {
         HttpResponseResultModel <string> result = new HttpResponseResultModel <string>();
         result.HttpStatusCode   = HttpStatusCode.InternalServerError;
         result.IsSuccess        = false;
         result.ErrorMessage     = "出现异常,请稍后重试";
         result.ExceptionMessage = actionExecutedContext.Exception.ToString();
         actionExecutedContext.HttpContext.Response.StatusCode = (int)result.HttpStatusCode;
         actionExecutedContext.Result = new ObjectResult(result);
     }
     return(base.OnExceptionAsync(actionExecutedContext));
 }
        /// <summary>
        /// 删除索引文件((默认创建ElasticsearchIndex特性上对应的索引)
        /// </summary>
        /// <param name="indexName">索引名</param>
        /// <returns></returns>
        public async Task <HttpResponseResultModel <bool> > DeleteIndexFileAsync(string indexName = "")
        {
            HttpResponseResultModel <bool> httpResponseResultModel = new HttpResponseResultModel <bool>();
            var isSuccess = await indexFileRepository.DeleteIndexFileAsync(indexName).ConfigureAwait(false);

            httpResponseResultModel.BackResult = isSuccess;
            httpResponseResultModel.IsSuccess  = isSuccess;
            return(httpResponseResultModel);
        }
        /// <summary>
        /// 创建索引文件((默认创建ElasticsearchIndex特性上对应的索引)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="indexName"></param>
        /// <param name="indexSettings"></param>
        /// <returns></returns>
        public async Task <HttpResponseResultModel <bool> > CreateIndexFileAsync <T>(string indexName = "", ESIndexSettingsModel indexSettings = null) where T : class, new()
        {
            HttpResponseResultModel <bool> httpResponseResultModel = new HttpResponseResultModel <bool>();

            Init <T>();
            if (string.IsNullOrEmpty(indexName))
            {
                indexName = PocoIndexName;
            }
            if (indexSettings == null)
            {
                indexSettings = new ESIndexSettingsModel();
            }
            IIndexState indexState = new IndexState()
            {
                Settings = new IndexSettings()
                {
                    NumberOfShards   = indexSettings.NumberOfShards,   //分片数,
                    NumberOfReplicas = indexSettings.NumberOfReplicas, //副本数
                }
            };
            bool isIndexExists = client.Indices.Exists(indexName.ToLower()).Exists;

            if (!isIndexExists)
            {
                var isExistTemplateResponse = await client.Indices.TemplateExistsAsync(PocoTemplate);

                if (isExistTemplateResponse.Exists)
                {
                    //创建并Mapping
                    var result = await client.Indices.CreateAsync(indexName.ToLower(), p => p.InitializeUsing(indexState)
                                                                  .Map(mp => mp.AutoMap())
                                                                  .IncludeTypeName(false)
                                                                  .Aliases(a => a.Alias(PocoAlias))
                                                                  ).ConfigureAwait(false);

                    //a => a.Add(add => add.Index(indexName.ToLower()).Alias(PocoAlias).IndexRouting(indexName.ToLower()))
                    var aliasResult = await client.Indices.PutAliasAsync(indexName.ToLower(), PocoAlias, t => t.IndexRouting(indexName.ToLower()));

                    bool isSuccess = result.Acknowledged && aliasResult.IsValid;
                    httpResponseResultModel.IsSuccess = isSuccess;
                    return(httpResponseResultModel);
                }
                httpResponseResultModel.ErrorMessage = "没有模板请先创建模板";
                return(httpResponseResultModel);
            }
            else
            {
                httpResponseResultModel.ErrorMessage = "索引已存在";
                return(httpResponseResultModel);
            }
        }
        /// <summary>
        /// 新增单条索引记录
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="routing"></param>
        /// <returns></returns>
        public async Task <HttpResponseResultModel <bool> > IndexAsync <T>(InsertUpdateModel <T> insertUpdateModel) where T : class, new()
        {
            HttpResponseResultModel <bool> httpResponseResultModel = new HttpResponseResultModel <bool>();
            string indexName = insertUpdateModel.IndexName?.ToLower();

            if (string.IsNullOrEmpty(indexName))
            {
                indexName = PocoIndexName;
            }
            IndexRequest <T> indexRequest = new IndexRequest <T>(insertUpdateModel.Entity, indexName);

            if (!string.IsNullOrEmpty(insertUpdateModel.Routing))
            {
                indexRequest.Routing = insertUpdateModel.Routing;
            }
            var result = await client.IndexAsync(indexRequest).ConfigureAwait(false);

            GetDebugInfo(result);
            httpResponseResultModel.IsSuccess = result.IsValid;
            return(httpResponseResultModel);
        }
        /// <summary>
        /// 批量索引
        /// </summary>
        /// <param name="entities">实体集合</param>
        /// <param name="routing">路由键</param>
        /// <returns></returns>
        public async Task <HttpResponseResultModel <bool> > IndexBatchAsync <T>(InsertUpdateModel <IList <T> > insertUpdateModel) where T : class, new()
        {
            HttpResponseResultModel <bool> httpResponseResultModel = new HttpResponseResultModel <bool>();
            string indexName = insertUpdateModel.IndexName?.ToLower();

            if (string.IsNullOrEmpty(indexName))
            {
                indexName = PocoIndexName;
            }
            BulkDescriptor bulkDescriptor = new BulkDescriptor();

            bulkDescriptor.IndexMany(insertUpdateModel.Entity);
            bulkDescriptor.Index(indexName);
            if (!string.IsNullOrEmpty(insertUpdateModel.Routing))
            {
                bulkDescriptor.Routing(new Routing(insertUpdateModel.Routing));
            }
            var result = await client.BulkAsync(bulkDescriptor).ConfigureAwait(false);

            GetDebugInfo(result);
            //if (result.Errors || !result.ItemsWithErrors.IsNullOrEmpty())
            //{
            //    Task.Run(() =>
            //    {
            //        var json = JsonHelper.SerializeObject(insertUpdateModel.Entity);
            //        WriteLog.WriteLogsAsync(json, "batchError");
            //    });
            //}
            var    isSuccess    = result.ItemsWithErrors.IsListNullOrEmpty();
            string errorMessage = "";

            if (!isSuccess)
            {
                var errorIdList = result.ItemsWithErrors.Select(t => t.Id);
                errorMessage = string.Join(",", errorIdList);
            }
            httpResponseResultModel.IsSuccess    = isSuccess;
            httpResponseResultModel.ErrorMessage = errorMessage;
            return(httpResponseResultModel);
        }
        /// <summary>
        ///  删除单条索引
        /// </summary>
        /// <param name="id">主键id</param>
        /// <param name="routing">路由键</param>
        /// <returns></returns>
        public async Task <HttpResponseResultModel <bool> > DeleteAsync <TPrimaryKeyType>(DeleteSingleModel <TPrimaryKeyType> deleteSingleModel)
        {
            HttpResponseResultModel <bool> httpResponseResultModel = new HttpResponseResultModel <bool>();
            string indexName = deleteSingleModel.IndexName?.ToLower();

            if (string.IsNullOrEmpty(indexName))
            {
                indexName = PocoIndexName;
            }

            DeleteRequest deleteRequest = new DeleteRequest(indexName, deleteSingleModel.Id.ToString());

            if (!string.IsNullOrEmpty(deleteSingleModel.Routing))
            {
                deleteRequest.Routing = deleteSingleModel.Routing;
            }
            var result = await client.DeleteAsync(deleteRequest).ConfigureAwait(false);

            GetDebugInfo(result);
            httpResponseResultModel.IsSuccess = (result.Result == Result.Deleted);
            return(httpResponseResultModel);
        }
        /// <summary>
        /// 根据id更新部分实体字段
        /// </summary>
        /// <typeparam name="TPartialDocument">包含实体T中部分字段的是model</typeparam>
        /// <param name="id">主键</param>
        /// <param name="partEntity">部分实体model</param>
        /// <param name="routing">路由键</param>
        /// <returns></returns>
        public async Task <HttpResponseResultModel <bool> > UpdatePartialDocumentAsync <TPartialDocument, TPrimaryKeyType>(TPrimaryKeyType id, InsertUpdateModel <TPartialDocument> insertUpdateModel) where TPartialDocument : class, new()
        {
            HttpResponseResultModel <bool> httpResponseResultModel = new HttpResponseResultModel <bool>();
            string indexName = insertUpdateModel.IndexName?.ToLower();

            if (string.IsNullOrEmpty(indexName))
            {
                indexName = PocoIndexName;
            }
            UpdateDescriptor <TEntity, TPartialDocument> updRequest = new UpdateDescriptor <TEntity, TPartialDocument>(indexName, id.ToString());

            updRequest.Doc(insertUpdateModel.Entity);
            updRequest.Index(indexName);
            if (!string.IsNullOrEmpty(insertUpdateModel.Routing))
            {
                updRequest.Routing(insertUpdateModel.Routing);
            }
            var response = await client.UpdateAsync <TEntity, TPartialDocument>(updRequest).ConfigureAwait(false);

            GetDebugInfo(response);
            httpResponseResultModel.IsSuccess = (response.Result == Result.Updated);
            return(httpResponseResultModel);
        }
示例#11
0
        /// <summary>
        /// 删除模板
        /// </summary>
        /// <param name="templateName">模板名称名称</param>
        /// <returns></returns>
        public async Task <HttpResponseResultModel <bool> > DeleteTemplateAsync(string templateName)
        {
            HttpResponseResultModel <bool> httpResponseResultModel = new HttpResponseResultModel <bool>();
            var indexTemplateResponse = await client.Indices.TemplateExistsAsync(templateName);

            if (indexTemplateResponse.Exists)
            {
                //删除模板
                var templateResponse = await client.Indices.DeleteTemplateAsync(templateName);

                var isTemplateExist = templateResponse.Acknowledged;
                httpResponseResultModel.IsSuccess = isTemplateExist;
                if (!isTemplateExist)
                {
                    httpResponseResultModel.ErrorMessage = "删除模板失败";
                }
            }
            else
            {
                httpResponseResultModel.IsSuccess    = true;
                httpResponseResultModel.ErrorMessage = "模板不存在";
            }
            return(httpResponseResultModel);
        }
        /// <summary>
        /// 批量删除索引
        /// </summary>
        /// <typeparam name="TPrimaryKeyType"></typeparam>
        /// <param name="ids"></param>
        /// <param name="routing"></param>
        /// <returns></returns>
        public async Task <HttpResponseResultModel <bool> > DeleteBatchAsync <TPrimaryKeyType>(DeleteBatchModel <TPrimaryKeyType> deleteBatchModel)
        {
            HttpResponseResultModel <bool> httpResponseResultModel = new HttpResponseResultModel <bool>();
            string indexName = deleteBatchModel.IndexName?.ToLower();

            if (string.IsNullOrEmpty(indexName))
            {
                indexName = PocoIndexName;
            }
            BulkDescriptor bulkDescriptor = new BulkDescriptor();

            foreach (var id in deleteBatchModel.IdList)
            {
                bulkDescriptor.AddOperation(new BulkDeleteOperation <TEntity>(id.ToString()));
            }
            bulkDescriptor.Index(indexName);
            if (!string.IsNullOrEmpty(deleteBatchModel.Routing))
            {
                bulkDescriptor.Routing(new Routing(deleteBatchModel.Routing));
            }
            var result = await client.BulkAsync(bulkDescriptor).ConfigureAwait(false);

            GetDebugInfo(result);
            var isSuccess = result.ItemsWithErrors.IsListNullOrEmpty();

            httpResponseResultModel.IsSuccess = isSuccess;
            string errorMessage = "";

            if (!isSuccess)
            {
                var errorIdList = result.ItemsWithErrors.Select(t => t.Id);
                errorMessage = string.Join(",", errorIdList);
            }
            httpResponseResultModel.ErrorMessage = errorMessage;
            return(httpResponseResultModel);
        }