Exemplo n.º 1
0
        /// <summary>
        /// 指定索引的总数据量
        /// </summary>
        /// <param name="indices"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public long TotalWithSql(
            string[] indices = null,
            string query     = null)
        {
            var request = new TranslateSqlRequest()
            {
                Query = query
            };
            var respone_sql   = ElasticClient.LowLevel.Sql.Translate <StringResponse>(PostData.Serializable(request));
            var query_Dsl     = respone_sql.Body;
            var respone_count = ElasticClient.LowLevel.Count <CountResponse>(GetIndex(indices), query_Dsl);

            if (!respone_count.IsValid)
            {
                throw new ElasticsearchException(respone_count);
            }
            return(respone_count.Count);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 查询(sql)
        /// </summary>
        /// <param name="recordCount">总数据量(不分页)</param>
        /// <param name="indices">指定索引(null:默认,[]:全部,["i_0","i_1","i_2"]:指定)</param>
        /// <param name="query">sql查询语句</param>
        /// <param name="size">数据量</param>
        /// <param name="time">快照保存时间(秒,默认60)</param>
        /// <param name="isThrow">抛出异常</param>
        /// <returns></returns>
        public List <T> SearchWithSql <T>(
            out long recordCount,
            string[] indices = null,
            string query     = null,
            int?size         = null,
            int time         = 60,
            bool isThrow     = false) where T : class
        {
            //if (pageIndex != null && pageIndex * pageRows > 10000)
            //    throw new Exception("数据量过大");

            var indices_ = GetIndices(indices);

            var      _time = TimeSpan.FromSeconds(time);
            List <T> data  = new List <T>();

            var sql = $"select * from {GetIndex(indices)} {query}";

            if (size != null)
            {
                sql += $" limit {size}";
            }

            bool Transfinite = Total(indices_) > 10000;

            var request = new TranslateSqlRequest()
            {
                Query     = sql,
                FetchSize = size
            };
            var respone_sql       = ElasticClient.LowLevel.Sql.Translate <StringResponse>(PostData.Serializable(request));
            var query_Dsl         = respone_sql.Body;
            var requestParameters = Transfinite ? new SearchRequestParameters()
            {
                Scroll = _time
            } : null;
            ISearchResponse <T> respone_search = ElasticClient.LowLevel.Search <SearchResponse <T> >(GetIndex(indices), query_Dsl, requestParameters);

            recordCount = respone_search.Total;

            if (Transfinite)
            {
                while (true)
                {
                    if (!respone_search.IsValid || respone_search.ScrollId == null)
                    {
                        if (isThrow)
                        {
                            throw new Exception(respone_search.ServerError.Error.Reason);
                        }
                        break;
                    }

                    if (!respone_search.Documents.Any_Ex())
                    {
                        break;
                    }

                    data.AddRange(respone_search.Documents);
                    respone_search = ElasticClient.Scroll <T>(_time, respone_search.ScrollId);
                }
            }
            else
            {
                if (!respone_search.IsValid)
                {
                    if (isThrow)
                    {
                        throw new Exception(respone_search.ServerError.Error.Reason);
                    }
                }
                else
                {
                    data.AddRange(respone_search.Documents);
                }
            }

            ElasticClient.ClearScroll(new ClearScrollRequest(respone_search.ScrollId));

            return(data);
        }