Beispiel #1
0
        private static SearchResults PopulateSearchResultsFromFeed(SyndicationFeed feed, int offset, int limit)
        {
            SearchResults searchResults = new SearchResults();
            int           totalHits     = 0;

            int.TryParse(GetAttributeValue(feed, SearchSettings.Config.SyndicationFeedAttributeNameTotalHits), out totalHits);
            string attributeValue = GetAttributeValue(feed, SearchSettings.Config.SyndicationFeedAttributeNameVersion);

            foreach (SyndicationItem current in feed.Items)
            {
                try
                {
                    IndexResponseItem indexResponseItem = new IndexResponseItem(current.Id);
                    indexResponseItem.Title       = ((current.Title != null) ? current.Title.Text : null);
                    indexResponseItem.DisplayText = (((TextSyndicationContent)current.Content != null) ? ((TextSyndicationContent)current.Content).Text : null);
                    indexResponseItem.Created     = current.PublishDate.DateTime;
                    indexResponseItem.Modified    = current.LastUpdatedTime.DateTime;
                    indexResponseItem.Uri         = current.BaseUri;
                    indexResponseItem.Culture     = GetAttributeValue(current, SearchSettings.Config.SyndicationItemAttributeNameCulture);
                    indexResponseItem.ItemType    = GetAttributeValue(current, SearchSettings.Config.SyndicationItemAttributeNameType);
                    indexResponseItem.NamedIndex  = GetAttributeValue(current, SearchSettings.Config.SyndicationItemAttributeNameNamedIndex);
                    indexResponseItem.Metadata    = GetElementValue(current, SearchSettings.Config.SyndicationItemElementNameMetadata);
                    DateTime value;
                    if (DateTime.TryParse(GetAttributeValue(current, SearchSettings.Config.SyndicationItemAttributeNamePublicationEnd), CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out value))
                    {
                        indexResponseItem.PublicationEnd = new DateTime?(value);
                    }
                    DateTime value2;
                    if (DateTime.TryParse(GetAttributeValue(current, SearchSettings.Config.SyndicationItemAttributeNamePublicationStart), CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out value2))
                    {
                        indexResponseItem.PublicationStart = new DateTime?(value2);
                    }
                    float num = 1f;
                    indexResponseItem.BoostFactor = (float.TryParse(GetAttributeValue(current, SearchSettings.Config.SyndicationItemAttributeNameBoostFactor), out num) ? num : 1f);
                    Uri uri = null;
                    indexResponseItem.DataUri = (Uri.TryCreate(GetAttributeValue(current, SearchSettings.Config.SyndicationItemAttributeNameDataUri), UriKind.RelativeOrAbsolute, out uri) ? uri : null);
                    float num2 = 0f;
                    indexResponseItem.Score = (float.TryParse(GetAttributeValue(current, SearchSettings.Config.SyndicationItemAttributeNameScore), out num2) ? num2 : 0f);
                    AddAuthorsToIndexItem(current, indexResponseItem);
                    AddCategoriesToIndexItem(current, indexResponseItem);
                    AddACLToIndexItem(current, indexResponseItem);
                    AddVirtualPathToIndexItem(current, indexResponseItem);
                    if (SearchResultFilterHandler.Include(indexResponseItem))
                    {
                        searchResults.IndexResponseItems.Add(indexResponseItem);
                    }
                }
                catch (Exception ex)
                {
                    SearchSettings.Log.Error(string.Format("Could not populate search results for syndication item with id '{0}'. Message: {1}{2}", current.Id, ex.Message, ex.StackTrace));
                }
            }
            if (SearchSettings.Config.UseIndexingServicePaging)
            {
                searchResults.TotalHits = totalHits;
                searchResults.Version   = attributeValue;
                return(searchResults);
            }
            SearchResults searchResults2 = new SearchResults();

            searchResults2.TotalHits = searchResults.IndexResponseItems.Count;
            foreach (IndexResponseItem current2 in searchResults.IndexResponseItems.Skip(offset).Take(limit))
            {
                searchResults2.IndexResponseItems.Add(current2);
            }
            searchResults2.Version = attributeValue;
            return(searchResults2);
        }
Beispiel #2
0
        // Hieu Le: Added sort param
        protected internal virtual SearchResults GetSearchResults(string query, string namedIndexingService, Collection <string> namedIndexes, int offset, int limit, Collection <string> sortFields)
        {
            var dictionary = new Dictionary <string, string>();
            var results    = new SearchResults();
            var namedIndexingServiceElement = SearchSettings.GetNamedIndexingServiceElement(namedIndexingService);

            string text = string.Empty;

            if (namedIndexes != null && namedIndexes.Count > 0)
            {
                foreach (string current in namedIndexes)
                {
                    text = text + current + "|";
                }
                text = text.Substring(0, text.LastIndexOf("|", StringComparison.Ordinal));
            }

            #region Customized
            // Hieu Le: Build sort text
            var sortFieldsTextBuilder = new StringBuilder();
            if (sortFields != null && sortFields.Count > 0)
            {
                foreach (string sortField in sortFields)
                {
                    sortFieldsTextBuilder.Append(sortField);
                    sortFieldsTextBuilder.Append("|");
                }
                if (sortFieldsTextBuilder.Length > 0)
                {
                    sortFieldsTextBuilder.Remove(sortFieldsTextBuilder.Length - 1, 1);
                }
            }
            #endregion

            dictionary.Add("{q}", query);
            dictionary.Add("{namedindexes}", text);
            dictionary.Add("{accesskey}", namedIndexingServiceElement.AccessKey);
            dictionary.Add("{offset}", SearchSettings.Config.UseIndexingServicePaging ? offset.ToString(CultureInfo.InvariantCulture.NumberFormat) : "0");
            dictionary.Add("{limit}", SearchSettings.Config.UseIndexingServicePaging ? limit.ToString(CultureInfo.InvariantCulture.NumberFormat) : SearchSettings.Config.MaxHitsFromIndexingService.ToString(CultureInfo.InvariantCulture.NumberFormat));

            // Customized: Added sort to dictionary
            dictionary.Add("{sort}", sortFieldsTextBuilder.ToString());

            string text2 = SearchSettings.Config.SearchUriTemplate;
            foreach (string current2 in dictionary.Keys)
            {
                text2 = text2.Replace(current2, HttpUtility.UrlEncode(dictionary[current2]));
            }
            text2 = namedIndexingServiceElement.BaseUri + text2;
            XmlTextReader xmlReader = null;
            SearchSettings.Log.Debug(string.Format("Start get search results from service with url '{0}'", text2));
            OnSearchRequestSending(this, new EventArgs());
            try
            {
                MakeHttpRequest(text2, namedIndexingServiceElement, "GET", null, delegate(WebResponse response)
                {
                    xmlReader = new XmlTextReader(response.GetResponseStream());
                    xmlReader.Normalization = false;
                    SyndicationFeed feed    = SyndicationFeed.Load(xmlReader);
                    results = PopulateSearchResultsFromFeed(feed, offset, limit);
                });
                OnSearchRequestSent(this, new EventArgs());
            }
            catch (Exception ex)
            {
                SearchSettings.Log.Error(string.Format("Could not get search results for uri '{0}'. Message: {1}{2}", text2, ex.Message, ex.StackTrace));
                return(results);
            }
            SearchSettings.Log.Debug(string.Format("End get search results", new object[0]));
            return(results);
        }