/// <summary>
        /// 创建指定时间索引
        /// </summary>
        /// <param name="setting">ElasticSearch设置</param>
        private void IndexCreateAndMapping(ElasticSearchSetting setting)
        {
            var esMappingSettings = new EsCreateIndexSettings()
            {
                Setting        = setting,
                NumberOfShards = NumberOfShards,
                AliasIndex     = AliasIndex
            };

            EsClientProvider.CreateIndex(esMappingSettings, EntityMapping);
        }
 /// <summary>
 /// 初始化
 /// </summary>
 /// <param name="setting">Es配置信息</param>
 internal static ElasticClient Init(ElasticSearchSetting setting)
 {
     try
     {
         var settings = GetSettings(setting);
         return(new ElasticClient(settings));
     }
     catch (Exception ex)
     {
         throw new Exception($"EsClientProvider.Register:{ex.Message}");
     }
 }
        /// <summary>
        /// 获取客户端
        /// </summary>
        /// <param name="setting">Es配置信息</param>
        /// <returns></returns>
        internal static ElasticClient GetClient(ElasticSearchSetting setting)
        {
            if (!ClientDictionary.ContainsKey(setting.EsHttpAddress))
            {
                var currentIndexClientDictionary = new ConcurrentDictionary <string, ElasticClient>();
                ClientDictionary.TryAdd(setting.EsHttpAddress, currentIndexClientDictionary);
            }
            if (ClientDictionary[setting.EsHttpAddress].ContainsKey(setting.EsDefaultIndex))
            {
                return(ClientDictionary[setting.EsHttpAddress][setting.EsDefaultIndex]);
            }
            var client = Init(setting);

            ClientDictionary[setting.EsHttpAddress].TryAdd(setting.EsDefaultIndex, client);
            return(client);
        }
        /// <summary>
        /// 获取Es链接设置
        /// </summary>
        /// <returns></returns>
        private static ConnectionSettings GetSettings(ElasticSearchSetting setting)
        {
            var urls = setting.EsHttpAddress.Split(';').Select(s => new Uri(s));
            //链接池
            var pool     = new StaticConnectionPool(urls);
            var settings = new ConnectionSettings(pool).DefaultIndex(setting.EsDefaultIndex);

            if (!string.IsNullOrEmpty(setting.UserName) && !string.IsNullOrEmpty(setting.Password))
            {
                settings.BasicAuthentication(setting.UserName, setting.Password);
            }
            //网络代理
            if (!string.IsNullOrEmpty(setting.EsNetworkProxy))
            {
                settings.Proxy(new Uri(setting.EsNetworkProxy), "", "");
            }
            //连接数限制
            if (setting.EsConnectionLimit > 0)
            {
                settings.ConnectionLimit(setting.EsConnectionLimit);
            }
            return(settings);
        }
Example #5
0
 public ElasticSearchProvider()
 {
     _elasticSearchSetting = ElasticSearchSetting.Instance;
 }
        /// <summary>
        /// Es客户端
        /// </summary>
        /// <param name="index">索引名称</param>
        public ElasticClient EsClientByIndex(string index = "")
        {
            if (CurrSetting == null)
            {
                if (Setting == null)
                {
                    if (ElasticSearchConfig.ElasticSearchSetting == null ||
                        ElasticSearchConfig.ElasticSearchSetting.EsHttpAddress == null)
                    {
                        throw new Exception("esHttpAddress cannot be empty");
                    }

                    CurrSetting = new ElasticSearchSetting()
                    {
                        EsHttpAddress     = ElasticSearchConfig.ElasticSearchSetting.EsHttpAddress,
                        UserName          = ElasticSearchConfig.ElasticSearchSetting.UserName,
                        Password          = ElasticSearchConfig.ElasticSearchSetting.Password,
                        EsDefaultIndex    = ElasticSearchConfig.ElasticSearchSetting.EsDefaultIndex,
                        EsNetworkProxy    = ElasticSearchConfig.ElasticSearchSetting.EsNetworkProxy,
                        EsConnectionLimit = ElasticSearchConfig.ElasticSearchSetting.EsConnectionLimit
                    };
                }
                else
                {
                    CurrSetting = new ElasticSearchSetting()
                    {
                        EsHttpAddress     = Setting.EsHttpAddress,
                        UserName          = Setting.UserName,
                        Password          = Setting.Password,
                        EsDefaultIndex    = Setting.EsDefaultIndex,
                        EsNetworkProxy    = Setting.EsNetworkProxy,
                        EsConnectionLimit = Setting.EsConnectionLimit
                    };
                }
            }

            if (!string.IsNullOrWhiteSpace(index) && index != CurrentIndex)
            {
                //传参进来的索引
                CurrSetting.EsDefaultIndex = index;
                var currClient = GetClient(CurrSetting);
                //索引是否已映射
                if (EsClientProvider.MappingDictionary.ContainsKey(CurrSetting.EsDefaultIndex))
                {
                    return(currClient);
                }
                //判断索引是否存在
                var exists = currClient.Indices.Exists(CurrSetting.EsDefaultIndex).Exists;
                if (!exists)
                {
                    throw new Exception($"Index:{CurrSetting.EsDefaultIndex} does not exist");
                }
                RunEntityMapping(currClient, CurrSetting.EsDefaultIndex);
                return(currClient);
            }
            else
            {
                //程序创建的索引
                CurrSetting.EsDefaultIndex = CurrentIndex;
                var currClient = GetClient(CurrSetting);
                //索引是否已映射
                if (EsClientProvider.MappingDictionary.ContainsKey(CurrSetting.EsDefaultIndex))
                {
                    return(currClient);
                }
                //判断索引是否存在
                var exists = currClient.Indices.Exists(CurrSetting.EsDefaultIndex).Exists;
                //索引存在
                if (exists)
                {
                    RunEntityMapping(currClient, CurrSetting.EsDefaultIndex);
                    return(currClient);
                }
                //索引不存在
                var aliasIndex = AliasIndex;
                if (string.IsNullOrEmpty(AliasIndex))
                {
                    aliasIndex = CurrSetting.EsDefaultIndex;
                }

                IIndexState indexState = new IndexState()
                {
                    Settings = new IndexSettings()
                    {
                        NumberOfReplicas = 0,
                        NumberOfShards   = NumberOfShards
                    }
                };
                //按别名创建索引
                if (!string.IsNullOrEmpty(aliasIndex) && !aliasIndex.Equals(CurrSetting.EsDefaultIndex))
                {
                    currClient.Indices.Create(CurrSetting.EsDefaultIndex, c => c.InitializeUsing(indexState).Aliases(a => a.Alias(aliasIndex)));
                }
                else
                {
                    currClient.Indices.Create(CurrSetting.EsDefaultIndex, c => c.InitializeUsing(indexState));
                }
                RunEntityMapping(currClient, CurrSetting.EsDefaultIndex);
                return(currClient);
            }
        }