⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 forumsearch.cs

📁 本系统是在asp版《在线文件管理器》的基础上设计制作
💻 CS
字号:
//------------------------------------------------------------------------------
// <copyright company="Telligent Systems">
//     Copyright (c) Telligent Systems Corporation.  All rights reserved.
// </copyright> 
//------------------------------------------------------------------------------

using System;
using System.Collections;
using System.Web;
using CommunityServer.Components;
using CommunityServer.Configuration;

namespace CommunityServer.Discussions.Components
{
	/// <summary>
	/// Provides searching to the forums
	/// </summary>
	public class ForumSearch : Search
	{
		public ForumSearch()
		{
			
		}


        protected override ArrayList GetPermissionFilterList()
        {
            return Sections.FilterByAccessControl(Forums.GetForums(false,true,false),Permission.Read);
        }


        protected override SearchResultSet GetSearchResults(SearchQuery query, SearchTerms terms)
        {
            

            ForumDataProvider fdp = ForumDataProvider.Instance();
            SearchResultSet results = fdp.GetSearchResults(query,terms);

            
            if (!results.HasResults)
				throw new CSException(CSExceptionType.SearchNoResults);

            return results;
        }

        /// <summary>
        /// Indexes posts on the specified SettingsID
        /// </summary>
	    public override void IndexPosts(int setSize, int settingsID)
	    {
                     
            ForumDataProvider fdp = ForumDataProvider.Instance();
            PostSet postSet =  fdp.SearchReindexPosts(setSize, settingsID);

            
            foreach (Post post in postSet.Posts) 
            {

                Hashtable words = new Hashtable();
                int totalBodyWords = 0;

                // Process words in the forum name
                //
                // TDD 11/05/2004
                // Since we're running this in a background thread, the Section property of the post can not be resolved
                // because we don't have a proper context. We also cant get the Section from the PostID because Sections
                // doesn't have a method to get a Section and we can't assume that we're indexing just forum posts.
                //
                // In the future this will need to be improved by having each application define it search component and
                // loading that component up based on the application type of the forum.
                //words = Index(post.Section.Name, words, WordLocation.Forum);

                // Process the authors name
                //
                words = Index(post.Username, words, WordLocation.Author, settingsID);

                // Process the post subject
                //
                words = Index(post.Subject, words, WordLocation.Subject,settingsID);

                // Process the post body
                //
                words = Index(post.Body, words, WordLocation.Body, settingsID);

                // Get a count of the total words in the body
                //
                totalBodyWords = CleanSearchTerms(post.Body).Length;

                InsertIntoSearchBarrel(words, post, settingsID, totalBodyWords);

            }
	    }

        /// <summary>
        /// Scores a forum post
        /// </summary>
        /// <param name="word"></param>
        /// <param name="post"></param>
        /// <param name="totalBodyWords"></param>
        /// <returns></returns>
	    protected override double CalculateWordRank(Word word, Post post, int totalBodyWords)
	    {
            int wordOccurrence = 0;
            double replyWeight = 0;
            double wordCount = 0;
            int locked = 0;
            int pinned = 0;
			double rating = 0;
			int totalRatings = 0;

            // Word weighting:
            // ============================
            // Word Occurence:      20
            // Replies:             20
            // Total words in post: 20
            // Locked:               5
            // Pinned:               5
            // Word in Forum title:  5
            // Word in Subject:     10
			// Rating:				15
            //                    ----
            // Max score:          100

            // Assign a score for how many times the word occurs in the post
            //
            wordOccurrence = word.Occurence * 2;
            if (wordOccurrence > 20)
                wordOccurrence = 20;

            // Calculate the score for replies
            //
            if ( (post.PostLevel == 1) && (post.Replies == 0)) 
            {
            
                replyWeight = 0;  // A post with no replies

            } 
            else 
            {

                replyWeight = ( (post.PostLevel - (post.Replies * 0.01)) / (post.PostLevel + post.Replies) ) * 20f;

                // If less than 0, weighting is 0
                if (replyWeight < 0)
                    replyWeight = 0;

            }

            // Calculate a score for the count of total words in the post
            //
            if (totalBodyWords > 65)
                wordCount = 20;
            else
                wordCount = (totalBodyWords / 65f) * 20f;

            // Calculate a score if the post is locked or pinned
            //
            if (post.IsLocked)
                locked = 5;
            if (post is IThread) 
            {
				IThread thread = (IThread) post;

                if ( thread.IsAnnouncement)
                    pinned = 5;

				// Handle ratings
				if ( thread.TotalRatings > 0 ) {

					// 5 points for rating greater than 10 ratings
					if (thread.TotalRatings > 25)
						totalRatings = 5;
					else if (thread.TotalRatings > 20)
						totalRatings = 4;
					else if (thread.TotalRatings > 15)
						totalRatings = 3;
					else if (thread.TotalRatings > 10)
						totalRatings = 2;
					else
						totalRatings = 1;

					rating = (thread.ThreadRating * 2);

				}
            }

            // Calculate the final weight of the word
            //
            return (wordOccurrence + replyWeight + word.OccurenceWeight + wordCount + locked + pinned + totalRatings + rating) / 100f;
	    }


	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -