protected override void OnLoad(EventArgs e) { base.OnLoad(e); rep.ItemDataBound += new RepeaterItemEventHandler(rep_ItemDataBound); var term = Request.QueryString["q"]; var searchField = Request.QueryString["searchField"]; int chapterId; int verseFrom; int verseTo; int.TryParse(Request.QueryString["chapterId"], out chapterId); int.TryParse(Request.QueryString["verseFrom"], out verseFrom); int.TryParse(Request.QueryString["verseTo"], out verseTo); SearchByField enumSearchByField = SearchByField.ChapterVerses; if (!string.IsNullOrEmpty(searchField)) { Enum.TryParse(searchField, out enumSearchByField); } if (!Utils.StringIsNullOrWhitespace(term)) { bool includeComments = (Request.QueryString["comment"] == "true"); var encodedTerm = Server.HtmlEncode(term); if (term == "" || term == "none") { Page.Title = Server.HtmlEncode("Search result"); h1Headline.InnerHtml = "Search result"; } else { Page.Title = Server.HtmlEncode(Resources.labels.searchResultsFor) + " '" + encodedTerm + "'"; h1Headline.InnerHtml = Resources.labels.searchResultsFor + " '" + encodedTerm + "'"; } Uri url; if (!Uri.TryCreate(term, UriKind.Absolute, out url)) { List <IPublishable> list = Search.Hits(term, includeComments, enumSearchByField, chapterId: chapterId, verseFrom: verseFrom, verseTo: verseTo); BindSearchResult(list); } else { SearchByApml(url); } } else { Page.Title = Resources.labels.search; h1Headline.InnerHtml = Resources.labels.search; } }
/// <summary> /// Searches all the posts and returns a ranked result set. /// </summary> /// <param name="searchTerm">The term to search for</param> /// <param name="includeComments">True to include a post's comments and their authors in search</param> /// <returns>A list of IPublishable.</returns> public static List <IPublishable> Hits(string searchTerm, bool includeComments, SearchByField searchByField = SearchByField.ChapterVerses, bool isEmptySearch = false, int chapterId = 0, int verseFrom = 0, int verseTo = 0) { lock (_syncRoot) { var results = BuildResultSet(searchTerm, searchByField, isEmptySearch, chapterId, verseFrom, verseTo ); var items = results.ConvertAll(ResultToPost); results.Clear(); OnSearcing(searchTerm); return(items); } }
/// <summary> /// Builds the results set and ranks it. /// </summary> /// <param name="searchTerm"> /// The search Term. /// </param> /// <param name="includeComments"> /// The include Comments. /// </param> private static List <Result> BuildResultSet( string searchTerm, SearchByField searchByField = SearchByField.ChapterVerses, bool isEmptySearch = false, int chapterId = 0, int verseFrom = 0, int verseTo = 0) { var results = new List <Result>(); var term = CleanContent(searchTerm.ToLowerInvariant().Trim(), false); var terms = term.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); var regex = new Regex(string.Format(CultureInfo.InvariantCulture, "({0})", string.Join("|", terms))); List <Entry> entries = Blog.CurrentInstance.IsSiteAggregation ? AllBlogsEntries : Entries; isEmptySearch = isEmptySearch || (searchByField == SearchByField.ChapterVerses && chapterId == 0 && verseFrom == 0 && verseTo == 0) || (searchByField != SearchByField.ChapterVerses && (searchTerm == "" || searchTerm == "none")); if (!isEmptySearch) { foreach (var entry in entries) { if (entry.Item == null) { continue; } var result = new Result(); if (searchByField == SearchByField.ChapterVerses) { if (entry.Item.ChapterNumber == chapterId) { List <int> verses = entry.Item.Verses.Select(v => v.Number).ToList(); if ((verseFrom == 0 && verseTo == 0) || (verseFrom > 0 && verseTo == 0 && verses.Any(v => v >= verseFrom)) || (verseFrom == 0 && verseTo > 0 && verses.Any(v => v <= verseTo)) || (verseFrom > 0 && verseTo > 0 && verses.Any(v => v >= verseFrom && v <= verseTo))) { results.Add(new Result { Item = entry.Item }); } } } else { switch (searchByField) { case SearchByField.Title: result.Rank += regex.Matches(entry.Title.ToLowerInvariant()).Count; break; case SearchByField.Content: result.Rank += regex.Matches(entry.Content.ToLowerInvariant()).Count; break; case SearchByField.Summary: result.Rank += regex.Matches(entry.Item.Summary.ToLowerInvariant()).Count; break; } if (result.Rank > 0) { result.Item = entry.Item; results.Add(result); } } } } else { results.AddRange(entries.Select(e => new Result { Item = e.Item }).ToList()); } results.Sort(); return(results); }
private static List <Post> FilterPosts(List <Post> notFilteredPost, string searchTerm, SearchByField searchByField = SearchByField.ChapterVerses, int chapterId = 0, int verseFrom = 0, int verseTo = 0) { var results = new List <Post>(); var entries = notFilteredPost; var isEmptySearch = (searchByField == SearchByField.ChapterVerses && chapterId == 0 && verseFrom == 0 && verseTo == 0) || (searchByField != SearchByField.ChapterVerses && (searchTerm == "" || searchTerm == "none")); Regex regex = null; if (searchByField != SearchByField.ChapterVerses && searchTerm != "" && searchTerm != "none") { searchTerm = System.Web.HttpUtility.UrlDecode(searchTerm); if (!string.IsNullOrEmpty(searchTerm)) { var term = Search.CleanContent(searchTerm.ToLowerInvariant().Trim(), false); var terms = term.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); regex = new Regex(string.Format(CultureInfo.InvariantCulture, "({0})", string.Join("|", terms))); } } if (!isEmptySearch) { foreach (var nfPost in notFilteredPost) { if (searchByField == SearchByField.ChapterVerses) { if (nfPost.ChapterNumber == chapterId) { List <int> verses = nfPost.VersesList.Select(v => v.Number).ToList(); if ((verseFrom == 0 && verseTo == 0) || (verseFrom > 0 && verseTo == 0 && verses.Any(v => v >= verseFrom)) || (verseFrom == 0 && verseTo > 0 && verses.Any(v => v <= verseTo)) || (verseFrom > 0 && verseTo > 0 && verses.Any(v => v >= verseFrom && v <= verseTo))) { results.Add(nfPost); } } } else if (regex != null) { searchTerm = System.Web.HttpUtility.UrlDecode(searchTerm); if (!string.IsNullOrEmpty(searchTerm)) { var maches = 0; switch (searchByField) { case SearchByField.Title: if (!string.IsNullOrEmpty(nfPost.Title)) { maches += regex.Matches(nfPost.Title.ToLowerInvariant()).Count; } break; case SearchByField.Content: if (!string.IsNullOrEmpty(nfPost.Content)) { maches += regex.Matches(nfPost.Content.ToLowerInvariant()).Count; } break; case SearchByField.Summary: if (!string.IsNullOrEmpty(nfPost.Summary)) { maches += regex.Matches(nfPost.Summary.ToLowerInvariant()).Count; } break; } if (maches > 0) { results.Add(nfPost); } } } } } else { results.AddRange(entries); } results.Sort(); return(results); }