/// <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); }
/// <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); }