コード例 #1
0
    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;
        }
    }
コード例 #2
0
ファイル: Search.cs プロジェクト: ssynenkyi/halachreview.com
 /// <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);
     }
 }
コード例 #3
0
ファイル: Search.cs プロジェクト: ssynenkyi/halachreview.com
        /// <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);
        }
コード例 #4
0
        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);
        }