为了提高查找的效率,把数据从数据库中一次性提取到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; }
嗯,就先介绍这么多吧,以后有好的思路再发布与大家分享......待续