public ActionResult Result(SearchCriteria criteria)
        {
            if (criteria == null)
                criteria = new SearchCriteria();

            var searchResult = searchService.Search(criteria);

            return View(searchResult);
        }
        public ActionResult Paging(SearchCriteria criteria)
        {
            if (criteria == null)
                criteria = new SearchCriteria();

            var searchResult = searchService.Search(criteria);
            var numberOfPages = Convert.ToInt32(Math.Ceiling(searchResult.TotalSearchResults / (double)criteria.PageSize));

            return View(new SearchPagingModel() { Criteria = criteria, NumberOfPages = numberOfPages });
        }
        public ActionResult Facet(SearchCriteria criteria)
        {
            if (criteria == null)
                criteria = new SearchCriteria();

            var searchResult = searchService.Search(criteria); 

            return View(new SearchFacetModel() 
            { 
                Criteria = criteria, 
                Result = searchResult
            });
        }
        public ISearchResult Search(SearchCriteria criteria)
        {
            var key = "LazySearchService";
            if (criteria != null)
                key += criteria.GetHashCode().ToString();

            if (!cache.ContainsKey(key))
            {
                cache.AddEntity(key, innerService.Search(criteria));
            }

            return cache.GetEntity(key);
        }
        public ISearchResult Search(SearchCriteria criteria)
        {
            if (criteria == null || string.IsNullOrWhiteSpace(criteria.Text))
                return new SearchResult();

            var timer = new Sitecore.Diagnostics.HighResTimer(true);

            var index = ContentSearchManager.GetIndex("sitecore_master_index") as SpatialLuceneIndex;

            using (var context = index.CreateSearchContext() as SpatialLuceneSearchContext)
            {
                if (criteria.PointRadius != null)
                {
                    context.SetGeoFilter(new PointRadiusCriterion()
                    {
                        FieldName = "_geohash",
                        RadiusKm = criteria.PointRadius.RadiusKm,
                        Latitude = criteria.PointRadius.Latitude,
                        Longitude = criteria.PointRadius.Longitude,
                        Sort = PointRadiusCriterion.SortOption.Ascending
                    });
                }

                var queriable = context.GetQueryable<SearchResultItem>();

                Expression<Func<SearchResultItem, bool>> predicate = PredicateBuilder.True<SearchResultItem>();
                foreach(var entry in criteria.Text.Split(' '))
                {
                    predicate = predicate.And(i => i.Content == entry);
                }
                
                var result = queriable
                    .Where(predicate)
                    .Page(criteria.CurrentPage-1, criteria.PageSize)
                    .FacetPivotOn(p => p.FacetOn(d => d["categories"]).FacetOn(d => d["haspoint"]))
                    .GetResults();

                var searchResult = new SearchResult()
                {
                    ResultDocuments = result.Hits.Select(hit => hit.Document).ToList(),
                    Facets = CollectFacets(result.Facets.Categories),
                    TotalSearchResults = result.TotalSearchResults,
                };
                searchResult.TotalMilliseconds = timer.ElapsedTimeSpan.Milliseconds;

                return searchResult;
            }
        }