sql多关键字匹配,优先权显示的算法

http://hi.baidu.com/%CB%AD%BB%E1%D4%DA%CE%D2%CA%D6%D0%C4/blog/item/de1b0c38d9068827b8998f2a.html

 

假设只有一个table,名为pages,有四个字段,id, url,title,body。里面储存了很多网页,网页的url地址,title和网页的内容,然后你用一个sql查询将url匹配的排在最 前,title匹配的其次,body匹配最后,没有任何字段匹配的,不返回。

就是上面这道面试题,让我想了一个下午,在网上找资料,最后用下面方法实现
SELECT *
FROM page where url like ‘%baidu%’ or title like ‘%baidu%’ or like ”
ORDER BY CHARINDEX(‘baidu’, url) DESC, CHARINDEX(‘baidu’, title) DESC,
CHARINDEX(‘baidu’, body) DESC

但我感觉这种方法并不是最简单的,后来把这个方法发给面试的人,他给我了一种更简单方法,只要用基本的Sql语句就可以实现。代码如下

 

select a.[id],a.mark from
(
select [page].[id],100 as mark from [page] where [page].[url] like ‘%baidu%’
union
select [page].[id],50 as mark from [page] where [page].[title] like ‘%baidu%’
union
select [page].[id],10 as mark from [page] where [page].[body] like ‘%baidu%’
) as a   order by mark desc

用union 实现联合查询,在每个查询语句中定义一个临时变量mark 并给mark赋值,在最后的输出时采用mark来排序,这样实现真的好简单。其实这都考验我们对Sql的编程思想。

PHP采集程序相关

采集程序最简单的思路就是:获取页面代码——分析代码——获取需要的部分——写入数据库。

当然,在获取页面代码之前我们首先要获得被采集页面的url,这里我们从百度新闻获取某关键词最新新闻列表。

function get_baidu_news_url($str){
    if(!$str) return;
    $str = gbk($str);

    //使用正则匹配出列表中的新闻URL
    $html = utf8(file_get_contents('http://news.baidu.com/ns?tn=newstitle&cl=2&rn=20&word=' . urlencode($str)));
    preg_match_all("/<a href=http:\/\/(.+?)  mon=(.+?)>(.+?)<\/a>/is",$html,$match);

    $urlarr = $match[1];
    if($urlarr){
        //URL前面补上http://
        array_walk($new_urlarr, create_function('&$v', '$v = "http://".$v ;'));
        cache_write($cachename, $new_urlarr, CACHE_PATH);
    }
    return $new_urlarr;
}

拿到新闻页面的URL之后,下一步就是采集页面上的新闻,当然这一步要针对各个网站定制不同的匹配规则,这里以新浪为例。新浪新闻以“<!– 正文内容 begin –>”开始,“<!– 正文内容 end –>”结束,所以匹配正文的正则为

preg_match_all("/<!-- 正文内容 begin -->([\s|\S]*?)<!-- 正文内容 end -->/is",$html,$match);

同理,匹配标题的正则为

preg_match_all("/<h1 id=\"artibodyTitle\"(.*?)>(.+?)<\/h1>/is",$html,$title_match);

函数完整代码:

function news_content_sina($url){
    if(!$url) return;
    $html = utf8(file_get_contents($url));
    preg_match_all("/<!-- 正文内容 begin -->([\s|\S]*?)<!-- 正文内容 end -->/is",$html,$match);
 preg_match_all("/<h1 id=\"artibodyTitle\"(.*?)>(.+?)<\/h1>/is",$html,$title_match);

    $title = $title_match[2][0];
    $content = news_content_format($match[1][0]);
    if($title && $content) return compact('url','title','content');
}

上面方法中用到了 news_content_format(),这个方法是用来格式化采集到的正文,去掉js、css、iframe、注释以及站内链接,下面代码中可以看到,我们去除了站内链接但保留了其他的<a>标签链接,这样就可以避免某些重要外链丢失影响新闻完整性,比如某考试报名地址链接。

function news_content_format($content){
    $search = array ("'<script[^>]*?>.*?</script>'si",   // 去掉 javascript
                    "'<style[^>]*?>.*?</style>'si",   // 去掉 css
                    "'<iframe[^>]*?>.*?</iframe>'si",   // 去掉 iframe
                    "'<!--[/!]*?[^<>]*?>'si",           // 去掉 注释 标记
     "'<a(.*?) href=(.*?)(sina.com|weibo.com)(.*?)>(.*?)<\/a>'si",  // 去掉 内部 链接
    );
    $replace = array ("","","","","","\${5}"); 
    $content = preg_replace($search, $replace, $content);
 $content = strip_tags($content, '<p> <br> <img> <table> <tr> <td> <strong> <a>');
 return $content;
}

到这里,采集的功能基本上就完成了,但是还有一点要注意,就是新闻中的图片如果也需要采集到本地的话,就要用到下面这个方法。

function getimage($body){
 global $img_dir,$img_webhost;//本站图片目录、主机

 if(!empty($body)){  
  $body = stripslashes($body);
  $img_array = array();
        //匹配出采集内容中的图片地址
  preg_match_all("/(src|SRC)=[\"|'|]{0,}(http:\/\/(.*)\.(gif|jpg|jpeg|bmp|png))/isU",$body,$img_array);
  $img_array = array_unique($img_array[2]);
  set_time_limit(0);
        //定义图片名,创建目录
  $imgPath = $img_dir."/".strftime("%Y%m%d",time());
  $imgUrl = "http://".$img_webhost."/".$imgPath;
  $milliSecond = strftime("%H%M%S",time());
  if(!is_dir($imgPath)) @mkdir($imgPath,0777);
  foreach($img_array as $key =>$value)
  {
   $value = trim($value);
            //抓取图片并保存
   $get_file = @file_get_contents($value);
   $rndFileName = $imgPath."/".$milliSecond.$key.".".substr($value,-3,3);
   $fileurl = $imgUrl."/".$milliSecond.$key.".".substr($value,-3,3);
   if($get_file)
   {
    $fp = @fopen($rndFileName,"w");
    @fwrite($fp,$get_file);
    @fclose($fp);
   }
   $body = ereg_replace($value,$fileurl,$body);
  }
  return $body;
 }

写入数据库等常规的操作在这里就不再赘述。

『天涯杂谈』说一说河南胡辣汤

无意中从天涯扒出的一篇神文,与喜欢喝胡辣汤的朋友共享之。
引用地址:http://www.tianya.cn/publicforum/Content/free/1/383504.shtml

说起河南的比较有名的小吃,就不能不提起胡辣汤。

自从17岁离开家,很少吃到地道的家乡风味了。前几年一直住集体宿舍,味觉已然到了麻木的地位,对所有美食失去了兴趣。现在生活稳定了,不再漂泊了,对家乡风味的思念却是越来越重,最忘不了的,就是家乡小吃胡辣汤。

盛胡辣汤的的大铝盆就放在蜂窝煤的炉子上,咕嘟咕嘟地冒着热气,那一股股的香气也随着飘散在空中,不时往人们鼻子里钻,于是人们的脚步被香气牵引过来,纷纷围坐在小圆桌上。那边咖啡色的汤里滚动着深绿色的海带,白的粉条和豆腐丝,黄的黄花菜,红的花生仁儿和肉丁,看起来色彩斑斓煞是好看。色香俱全了,人们迫切地想尝尝味道。

盛汤的人手里拿着一柄奇怪的木勺,先深深伸进汤里,来回使劲的搅动几下,然后再溜着锅边把刚好搅的不稠不稀的胡辣汤盛进碗里。盛汤人再熟练的滴点香油和醋,一碗如岩浆般的热汤就摆在你的眼前了。望着这一碗期待中的汤,看其表,暗红色透着些许土色的汤面浮着木耳粉条等原料。低头闻其味,一股热气夹带着香油、醋和汤特有的辣味不由分说奔进你的鼻腔里,通五官,过六腑势如破竹。拿着小勺轻轻搅动两下,有轻微的糊状感。舀上一勺,弯腰伸过头去,吹几下,匝起嘴来,做预备Kiss装,眼望前方,准备和勺子来个荡气回肠的热吻。小嘴就着勺边轻轻地吸几口(当然这几口可能加起来还不到一口),待嘴适应了那股热劲和辣劲,再一口把剩在勺中的木耳等吃尽。身上立刻暖和起来,精神气儿也足了,声调也就提高了八度:再来一碗!喝这一碗的速度显然就慢了不少,慢悠悠的一小口一小口地抿,这时才品出酸辣香的醇厚味道来。

我不知道是否有人考证正确品汤之法?不会是像品葡萄酒时周星星所说的应该把舌头卷成卷吧?不过品葡萄酒时是应该让酒在嘴里来回流动,这样才能品出酒的不同层次。可是我把胡辣汤在嘴里逛荡了N圈,除了汤的温度有点降低外,仍然是浓烈的辣味。不过这种辣不是像四川那种麻辣,也不同于湖南的辛辣,他们靠的是辣椒刺激味蕾。而胡辣汤好像更多的是靠汤的滚烫温度来增加嘴里辣椒般的灼热感,为汤的辣味推波助澜。不过许多种胡辣汤里的辣都是靠的胡椒粉,但我光顾那家店的汤里好像胡椒粉并不是很浓。不过这汤要凉了就只剩辣味了,也使我明白为什么这汤要不断的加热。这胡辣汤里的原料好像有面筋、粉条、黄花菜、长的奇怪的木耳和少许牛杂,大部分其他胡辣汤的原料也基本是这样,也许可能有些海带等其他原料,但主要就是这些了。也许这些原料并不十分的精贵和营养,但却显示了做汤之人的巧夺天工,也正是这点才造就了胡辣汤平民身份,才能使大众享受这份难得的早餐。

卖胡辣汤的摊点,基本上都喜欢打着逍遥镇的牌子,说起来还有缘故。逍遥镇胡辣汤据传其始创于明朝中叶,由由名贵中药和主料熬制而成,一度被封为宫廷饮品。明末清初,天下大乱,御厨赵杞为避战祸,遂携秘方隐居于西华县逍遥镇,从此之后逍遥胡辣汤普及民间,香泽大河南北。而逍遥镇也因此成为胡辣汤的原产地。

两掺,胡辣汤主热辣;而豆腐脑则主清爽;胡辣汤的汤是一种暗红色夹带着其他原料的颜色;而豆腐脑通身洁白一尘不染;胡辣汤如同代表了北方大汉粗犷,豪放的性格;而豆腐脑则代表了南方小家碧玉的特有的细腻温柔。真不知是那位聪明的店家有这神来之笔,把这两样看似不相容的搭上了红线,不过搭配的到十分的有特色。在碗中两位也刹是好看,喝汤时豆腐脑的白色带给我一种视觉和感觉上的放松。味道上豆腐脑的清淡也把胡辣汤的热辣冲淡了不少,也许是这适应南方人的口味,才使胡辣汤的领地扩大到长江以南。