/// <summary>
        /// Executes an asyncronus SearchQuery using the Search API and returns a list of generic pocos.
        /// https://www.elastic.co/guide/en/elasticsearch/reference/5.4/_the_search_api.html
        /// </summary>
        /// <typeparam name="TPoco">Has to Implement the IElasticPoco interface</typeparam>
        /// <param name="searchQuery">SearchQuery object.</param>
        /// <returns>IEnumerable<TPoco></returns>
        public async Task <IEnumerable <TPoco> > ExecuteSearchAsync <TPoco>(IExecutableSearchQuery <TPoco> searchQuery)
            where TPoco : IElasticPoco
        {
            var query = searchQuery as SearchQuery <TPoco>;

            IndexExists(query.IndexName);

            return(ProcessSeachResponse <TPoco>(await LowLevelClient.SearchAsync <string>(query.IndexName, Generator.Generate(query))));
        }
 /// <summary>
 ///
 /// </summary>
 /// <typeparam name="TPoco"></typeparam>
 /// <param name="search"></param>
 /// <param name="client"></param>
 /// <returns></returns>
 public static IEnumerable <TPoco> ExecuteWith <TPoco>(this IExecutableSearchQuery <TPoco> search, ElasticLiteClient client)
     where TPoco : IElasticPoco => client.ExecuteSearch(search);
 /// <summary>
 ///
 /// </summary>
 /// <param name="search"></param>
 /// <param name="client"></param>
 public static async Task <IEnumerable <TPoco> > ExecuteAsyncWith <TPoco>(this IExecutableSearchQuery <TPoco> search, ElasticLiteClient client)
     where TPoco : IElasticPoco => await client.ExecuteSearchAsync(search);