private List<GeographicalSearchResult> GetSearchResults(SearchUserInput userSearch, int polygonAreaTypeId, ResultsToInclude resultsToInclude) { var isPostcode = userSearch.ContainsAnyNumbers; // Setup the fields to search through BooleanQuery finalQuery = isPostcode ? GetPostcodeQuery(userSearch.SearchText, FieldNames.Postcode) : GetPlaceNameQuery(userSearch, polygonAreaTypeId); // Perform the search var directory = FSDirectory.Open(new DirectoryInfo( Path.Combine(ApplicationConfiguration.SearchIndexDirectory, "placePostcodes"))); var searcher = new IndexSearcher(directory, true); //Add the sorting parameters var sortBy = new Sort( new SortField(FieldNames.PlaceTypeWeighting, SortField.INT, true) ); var docs = searcher.Search(finalQuery, null, ShortResultCount, sortBy); List<GeographicalSearchResult> searchResults = new List<GeographicalSearchResult>(); int resultCount = docs.ScoreDocs.Length; for (int i = 0; i < resultCount; i++) { ScoreDoc scoreDoc = docs.ScoreDocs[i]; Document doc = searcher.Doc(scoreDoc.Doc); var geographicalSearchResult = NewGeographicalSearchResult(doc, polygonAreaTypeId, isPostcode); CheckPolygonAreaCodeIsDefined(polygonAreaTypeId, geographicalSearchResult); AssignEastingAndNorthing(doc, geographicalSearchResult); AddResultIfRequired(resultsToInclude, geographicalSearchResult, searchResults); } return searchResults; }
private static void AddResultIfRequired(ResultsToInclude resultsToInclude, GeographicalSearchResult geographicalSearchResult, List<GeographicalSearchResult> searchResults) { bool addResult = true; switch (resultsToInclude) { case ResultsToInclude.ParentAreasOnly: addResult = geographicalSearchResult.AreCoordinatesValid() == false; break; case ResultsToInclude.PlaceNamesAndPostcodesOnly: addResult = geographicalSearchResult.AreCoordinatesValid(); break; } if (addResult) { searchResults.Add(geographicalSearchResult); } }