文章类型: .NET
关键词: .net,C#,SQL,server,Data,Table,Dictionary按值排序,Array.sort,文章,查找相关文章
内容摘要: .net中,运用数据表DataTable,字典Dictionary,数组排序Array.sort通过文章的关键词来查找文章的相关文章

查找文章的相关文章的思路分析及实现

2015/7/14 15:47:35    来源:apple    阅读:

为了提高查找的效率,把数据从数据库中一次性提取到DataTable中断开数据库进行查询,通过对文章关键词的分割,来查找该文章关键词的出现最多的文章作为最相关的文章保存到泛型集合字典Dictionary中,泛型集合字典Dictionary的键Key保持文章的编号ID,泛型集合字典Dictionary的值Key保存相应文章的关键词出现的个数,通过对泛型集合字典Dictionary的Key进行又高到低进行排序来确定最相关的文章。

关键代码如下:

/// <summary>  
/// 得到相关文章信息集合  
/// </summary>  
/// <returns>返回相关文章信息集合</returns>  
public static IList<Article> GetCorrelativeArticles(long articleID, string articleLabel)  
{  
    //对文章关键词进行分割  
    string[] articleLabelList = articleLabel.Replace(',', ',').Split(',');  
    Dictionary<long, int> keyWordsCountList = new Dictionary<long, int>();  
    //得到所有文章信息  
    DataTable dt = ArticleService.GetArticleDataTable();  
    DataRow[] searchDataRow = dt.Select(" ArticleID=" + articleID);//查找当前文章信息  
    dt.Rows.Remove(searchDataRow[0]);//删除当前要找的文章数据记录  
    long currentArticleID = 0;  
    //统计当前文章关键词在其他文章中出现的个数  
    foreach (string articleKeyWords in articleLabelList)  
    {  
        DataRow[] dRows = dt.Select(" ArticleLabel like '%" + articleKeyWords + "%' ");  
        foreach (DataRow dr in dRows)  
        {  
            currentArticleID = Convert.ToInt64(dr["ArticleID"]);  
            if (keyWordsCountList.ContainsKey(currentArticleID))  
            {  
                keyWordsCountList[currentArticleID]++;  
            }  
            else
            {  
                keyWordsCountList.Add(currentArticleID, 1);  
            }  
        }  
    }  
    
    //由于字典本身不能按值进行排序,这里采用数组的排序方法来解决  
    long[] articleIDList = new long[keyWordsCountList.Count];  
    int[] existTimesList = new int[keyWordsCountList.Count];  
    keyWordsCountList.Keys.CopyTo(articleIDList, 0);  
    keyWordsCountList.Values.CopyTo(existTimesList, 0);  
    Array.Sort(existTimesList, articleIDList);////按照关键词的存在频率进行升序排列  
    //按照关键词的存在频率进行降序排列  
    Array.Reverse(articleIDList);  
    Array.Reverse(existTimesList);  
    
    IList<Article> articles = new List<Article>();  
    Article article = null;  
    //获取最相关的前3篇文章信息且出现关键词最少2个  
    for (int i = 0; i < 3; i++)  
    {  
        if (existTimesList[i] > 1)  
        {  
            DataRow[] correlativeArticleDataRow = dt.Select(" ArticleID=" + articleIDList[i]);  
            article = new Article();  
            article.ArticleID = articleIDList[i];  
            article.Title = correlativeArticleDataRow[0]["Title"].ToString();  
            string articleKeyLabel = correlativeArticleDataRow[0]["ArticleLabel"].ToString();  
            if (articleKeyLabel.Length > 50)  
            {  
                articleKeyLabel = articleKeyLabel.Substring(0, 48) + "..";  
            }  
            article.ArticleLabel = articleKeyLabel;  
            article.CreatedTime = Convert.ToDateTime(correlativeArticleDataRow[0]["CreatedTime"]);  
            articles.Add(article);  
        }  
        else
        {  
            break;  
        }  
    }  
    
    return articles;  
}

 嗯,就先介绍这么多吧,以后有好的思路再发布与大家分享......待续

↑ 上一篇文章:C#中对于DataTable的Select筛选用法 关键词:C#,DataTable,Select,DataView.. 发布日期:2015/7/14 15:46:08
↓ 下一篇文章:验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 配置指定了相同的 validationKey 关键词:验证视图状态,MAC,失败,如果此应用程序由网络场或群集.. 发布日期:2015/7/14 15:50:05
相关文章:
日期DateTime类型在.net中模糊查询SQL数据库的思路分析 关键词:日期类型,DateTime,C#,.net,模糊查询,like查询,SQL,Server,数据库.. 发布日期:2015-07-14 15:51
ASP.NET C#调用存储过程来获取output参数的值 关键词:asp.net,C#,SQL,Server,存储过程,output参数值 发布日期:2015-07-07 17:44
sql语句妙用,各种sql语句的详细用法与讲解 关键词:sql,server,database,详细,用法,讲解 发布日期:2015-07-29 14:31
相关目录:.NETDATABASEJAVAHTML软件开发
我要评论
正在加载评论信息......