From 80c994b5c2e60abbfa24e16383e0a31bd22d36e7 Mon Sep 17 00:00:00 2001 From: Renaud Paquay Date: Fri, 30 Jul 2010 19:18:47 -0700 Subject: [PATCH] Search bug: filter out non existent content items from index There is latency between the content of the index and the content items in the database. We need to filter out content items returned from the indexing service that aren't published in the database. --HG-- branch : dev --- .../Controllers/SearchController.cs | 37 +++++++++++++++---- .../Orchard.Search/Services/SearchService.cs | 3 +- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs b/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs index 8d1c11747..da2f13e4b 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs @@ -7,6 +7,8 @@ using Orchard.Settings; using Orchard.Search.Models; using System.Linq; using System; +using System.Collections.Generic; +using Orchard.Collections; namespace Orchard.Search.Controllers { [ValidateInput(false)] @@ -24,16 +26,37 @@ namespace Orchard.Search.Controllers { public ActionResult Index(string q, int page = 1, int pageSize = 10) { var searchFields = CurrentSite.As().Record.SearchedFields.Split(new[] {',', ' '}, StringSplitOptions.RemoveEmptyEntries); + var searchHits = _searchService.Query(q, page, pageSize, + CurrentSite.As().Record.FilterCulture, + searchFields, + searchHit => searchHit); + + var searchResultViewModels = new List(); + + foreach(var searchHit in searchHits) { + var contentItem = _contentManager.Get(searchHit.ContentItemId); + // ignore search results which content item has been removed or unpublished + if(contentItem == null){ + searchHits.TotalItemCount--; + continue; + } + + searchResultViewModels.Add(new SearchResultViewModel { + Content = _contentManager.BuildDisplayModel(contentItem, "SummaryForSearch"), + SearchHit = searchHit + }); + } + + var pageOfItems = new PageOfItems(searchResultViewModels) { + PageNumber = page, + PageSize = searchHits.PageSize, + TotalItemCount = searchHits.TotalItemCount + }; + var searchViewModel = new SearchViewModel { Query = q, DefaultPageSize = 10, // <- yeah, I know :| - PageOfResults = _searchService.Query(q, page, pageSize, - CurrentSite.As().Record.FilterCulture, - searchFields, - searchHit => new SearchResultViewModel { - Content = _contentManager.BuildDisplayModel(_contentManager.Get(searchHit.ContentItemId), "SummaryForSearch"), - SearchHit = searchHit - }) + PageOfResults = pageOfItems }; //todo: deal with page requests beyond result count diff --git a/src/Orchard.Web/Modules/Orchard.Search/Services/SearchService.cs b/src/Orchard.Web/Modules/Orchard.Search/Services/SearchService.cs index 152abe66d..c73336d73 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Services/SearchService.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Services/SearchService.cs @@ -51,8 +51,9 @@ namespace Orchard.Search.Services { searchBuilder = searchBuilder .Slice((page > 0 ? page - 1 : 0) * (int)pageSize, (int)pageSize); + var searchResults = searchBuilder.Search(); - var pageOfItems = new PageOfItems(searchBuilder.Search().Select(shapeResult)) { + var pageOfItems = new PageOfItems(searchResults.Select(shapeResult)) { PageNumber = page, PageSize = pageSize != null ? (int)pageSize : totalCount, TotalItemCount = totalCount