public async Task <ISearchResponse <T> > Search <T, TRequest>(TRequest request) where T : class where TRequest : class
        {
            try
            {
                var esNodes = string.Join(';', _esClient.ConnectionSettings.ConnectionPool.Nodes.Select(x => x.Uri));
                _logger.LogDebug($"ElasticSearch Search begins {esNodes}");

                if (request == null)
                {
                    return(new SearchResponse <T>());
                }

                HousingSearchRequest searchRequest = (HousingSearchRequest)(object)request;

                var pageOffset = _pagingHelper.GetPageOffset(searchRequest.PageSize, searchRequest.Page);

                var result = await _esClient.SearchAsync <T>(x => x.Index(_indexSelector.Create <T>())
                                                             .Query(q => BaseQuery <T>().Create(request, q))
                                                             .PostFilter(q => _filterFactory.Create <T, TRequest>(request).GetDescriptor(q, request))
                                                             .Sort(_sortFactory.Create <T, TRequest>(request).GetSortDescriptor)
                                                             .Size(searchRequest.PageSize)
                                                             .Skip(pageOffset)
                                                             .TrackTotalHits()).ConfigureAwait(false);

                _logger.LogDebug("ElasticSearch Search ended");

                return(result);
            }
            catch (ElasticsearchClientException e)
            {
                _logger.LogError(e, "ElasticSearch Search threw an ElasticSearchClientException. DebugInfo: " + e.DebugInformation);
                throw;
            }
            catch (Exception e)
            {
                _logger.LogError(e, "ElasticSearch Search threw an exception");
                throw;
            }
        }
Ejemplo n.º 2
0
        public LuceneModelFilter ParseQuery(string defaultField, NameValueCollection queryParameters)
        {
            var orderbyField = queryParameters[StringConstants.OrderByParameter];
            var query        = queryParameters[StringConstants.QueryParameter];
            //var selects = queryParameters[StringConstants.SelectParameter];
            var filter = queryParameters[StringConstants.FilterParameter];
            var skip   = queryParameters[StringConstants.SkipParameter];
            var top    = queryParameters[StringConstants.TopParameter];

            var luceneQuery = m_queryFactory.Create(query);
            //var luceneSelectFilter = m_selectFilterFactory.Create(selects);
            var luceneFilter = m_filterFactory.Create(filter);
            var luceneSort   = m_sortFactory.Create(orderbyField);

            //Validation on Skip/Top
            var skipValue = -1;

            if (skip.IsNullOrWhiteSpace() == false && int.TryParse(skip, out skipValue) == false)
            {
                throw new FormatException("When specified, the Skip parameter must be an integer.");
            }

            var topValue = -1;

            if (top.IsNullOrWhiteSpace() == false && int.TryParse(top, out topValue) == false)
            {
                throw new FormatException("When specified, the Top parameter must be an integer.");
            }

            var modelFilter = new LuceneModelFilter
            {
                Query = luceneQuery,
                //SelectFilter =  luceneSelectFilter,
                Filter = luceneFilter,
                Sort   = luceneSort,
                Skip   = skipValue,
                Take   = topValue
            };

            return(modelFilter);
        }