小弟做一个门户的新闻页,这个新闻页需求有一个“相关文章”,就是用标题模糊搜索相关文章后显示前台,好多网站都有这样的区域.
问题来了:
这个数据量比较大,大概100万左右,实时搜索的话那数据库压力太大,而且前台显示比较慢.
第二就是缓存,缓存后访问量高的话再多的内存也爆了,有没有更好的办法呢?小弟技术有限,特来请教。

解决方案 »

  1.   

    tag技术,输入文章的时候得添加关键字,然后根据关键字处理
    先分词,按照相同词出现的频率,比较相似度
    提供后台运行的服务,异步延迟加载
      

  2.   


    这类搜索不需要即刻显示,但是需要即刻开始。比如一个文章的相关文章,你需要1分钟才计算出来,那么就是这一分钟之内的文章页面内可能在这个地方显示为空的。但是第一次访问以后1分钟之后,再访问这个文章页面,就有相关文章内容了。我不知道你说的“缓存”是什么意思。有些人想当然地说缓存就是把一个数据库表放到内存中,我对这种东西毫不以为然。缓存就是这样,key=“查询内容id为123456的文章的相关文章”,比如结果是6个文章id,进行一次缓存就是把这个key跟6个id匹配起来放入Cache,而缓存其它文章的相关文章查询结果则需要另外进行一次缓存,这跟把什么数据库表放入内存作为一次缓存有什么关系?
      

  3.   


    这种方法可行是可行,但是鸭梨还是不小啊,毕竟是like出来的。而且是有多少个词就要搜索多少次。
      

  4.   

    比如说你要缓存1个小时(设置Cache.Insert方法的absoluteExpiration参数为1小时),那么你的网站估计有1M内存足够记录那些1小时内频繁被访问的文章的相关文章数据了(这样就不必重复去查询数据库了)。只需要占用区区1M内存,而不是你说的什么“内存也爆了”,你说的缓存估计就是那种胡乱把整个数据库表扔进内存的做法吧。会不会控制缓存,关键看你是不是在缓存中放置大量脏数据。比如数据库已经更新了,你内存中的数据却是脏的、旧的数据,这就不好了。缓存中的数据此时应该自动清除,这样代码下一次在缓存中读取不到数据时,就会真正去数据库查询并重新放入缓存。因此管理缓存其实就是看看你会不会对Dependency参数编程。
      

  5.   


    抛开缓存,我问你你能保证页面上立刻打开并且有相关文章列表吗?你把两个问题给我纠结在一起,本来是应该既要做到A又要做到B的,你便说“A不成,因为不是B;B不成,因为不是A”,这中两头堵的方式还是别做开发做测试算了。
      

  6.   

    不用like
    ACCESS用instr()
    sql用charindex()
      

  7.   

    我给你明确点说吧:说每当访问一个文章都要去计算相关文章列表(不管以什么数据库表结构)都是在做练习题呢,你自己想想你的所谓100万个文章、假设有1千万个分类(其实这只能进行过度粗糙的分类而不是查询真正的相关文章),该如何计算。我根本不知道该如何计算相关文章,我只是告诉你该如何设计程序,哪怕这个计算需要1分钟才出来结果也没有关系。当我们要显示文章id=123456的相关文章时,我们查询一下看看有没有已经计算好的结果,如果有就直接拿出来放到文章内容页面上;如果没有,那么我们查询一下是否已经开始计算这个文章的相关文章任务了,如果没有开始则开始。但是我们等待不了几十毫秒,所以我们可能根本无法拿出结果来,于是只好返回空的列表。可是既然这个任务已经开始了,那么下一次再查询id=123456这个文章时就有相关文章列表了。这就是我在#6楼第一段的意思!而进一步地,就算给一个id就能查询出所有相关的id(注意我并没有纠缠你如何查询相关文章的算法问题),也没有必要每一次都跑到数据库上去取结果啊。以为数据库忙着处理各种各样的数据。而你只要拿出不足1M的内存就足以为所有热门文章的相关文章列表保持1个小时的缓存了。
      

  8.   


    你对缓存还是把数据表中的数据全都丢到内存里的思路,这种方式怎么可能用起来缓存?假设一个业务逻辑需求:“返回某个文章id的相关文章id列表”,我们就把它的结果缓存5分钟,设置absoluteExpiration和slidingExpiration参数都为5分钟,也就是超过5分钟都不被重复访问的内容根本没有价值缓存。那么反过来说,你可以算算你的网站5分钟内经常被重复访问的文章才有多少个?我说的1小时才用1M缓存,你认为5分钟会用多少?什么叫做“缓存24小时”?就是说24小时才有一次重复访问的文章,你也觉得有必要占用内存来缓存!这完全是我不以为然的那种对待缓存的观念。那么你说的那种缓存,是我觉得毫无意义的做法。
      

  9.   

    假设有1千万个分类  -->  假设平均每一个文章你的用户都输入10个tag
      

  10.   

    楼主,缓存不一定是指 asp.net 的 cache,放开点想,他可以是一个表,结果类似这样:article_id
    related_article_id
    updated_at如果是新闻类网站,相关文章的数量不会太多,一般最新十条二十条就可以,即使你有100万记录,top加where,也不会怎么吃力。数据可以一天更新一次,updated_at 字段可以用来帮助选择更新时机,而就不用一次更新整个表。
      

  11.   

    其实没有那么难。1、不知道你用的是什么数据库,先假设是SQL Server吧(这个我比较熟)。
    给新闻表(News)设置一个主键,int 自增的,就叫做NewsID吧,这个要聚集索引。然后呢有一个标题的字段 NewsTitle。你可以放心大胆的用下面这条SQL获取“相关文章”:select top 5 NewsTitile ,[其他需要的字段,不需要的不要写] from News where NewsTitle like '%key%' order by NewsID desc不管是10万条记录还是100万条记录,保证1秒内得到结果。不信的话,你可以自己试一试。
      

  12.   

    你的那种做法是小数据的,大数据的话,要加两个表先。一个保存关键字,就是tag。一个表保存tag对应的文章的id。