技术文摘

帝国CMS通过关键词调用相关文章用like去模糊匹配是一种明智的方法

作者:雨祺   发表于:
浏览:176次    字数:2019  原创
级别: 站长   总稿: 68 篇,  月稿: 0
是否热衷帝国CMS通过关键词调用相关文章用like去模糊匹配呢?当然很多会说是的!那么小编只能说他们要么就是土豪,要么就是小小小白了,要么就是把乌龟爬的速度的锅扔给帝国!有点SQL基础的小伙伴们都知道where条件里面优选是索引字段去排序,其次就是like与rand与+-计算等!服务器再强大也顶不住全表扫描的,有索引就要充分利用索引的!当然索引也不能乱建的!不用太过于聪明去把点击率字段设为索引!帝国CMS数据表已经设计得很好了!地球人都知道频繁更新的字段不适合建立索引!

小编说了这么多,是不是我们不能装酷呢?不能用当前文章的关键词去匹配相关的文章呢!小编只是轻轻的告诉你,当然是可以的!不过你还是得做好心里准备,改良了也不是千万数据能流畅的运行!理论100W下的数据是没有问题的!但是总比like在5W到10W下面就开始性能明显下降的好吧!

title like '%$navinfor[keyboard]%'这样的就不用去想了!这个不仅是耗资源大户。理论10W以上的数据性能下降非常非常厉害了!千万不要去做小白鼠了!而且这个细心的小伙伴们都会发现只能用于一个关键词去匹配的!不啰嗦了,打了这么多文字也够蜘蛛吃了!不会饿到它了!言归正传,下面开始讲解方法。

方法一:去掉第一个也就是前面的第一个百分号!比如内容页关键词匹配相关文章,以新闻数据表为例

like匹配所有关键词的相关标题
  1. <?php 
  2. $kr = explode(",", $navinfor['keyboard']); 
  3. $str = ''
  4. foreach($kr as $keyword){ 
  5.     $str .= ($str ? " or" : '') . " title like '$keyword%' "
  6. ?> 
  7. [e:loop={"select *  from [!db.pre!]ecms_news where $str order by id desc limit 10",0,24,0}] 
  8. <a href="<?=$bqsr['titleurl']?>" target="_blank"><?=$bqr['title']?></a> <br> 
  9. [/e:loop] 
like匹配第一个关键词的相关标题
  1. <?php 
  2. $kr = explode(",", $navinfor['keyboard']); 
  3. $str=" title like '$kr[0]%' "
  4. ?> 
  5. [e:loop={"select *  from [!db.pre!]ecms_news where $str order by id desc limit 10",0,24,0}] 
  6. <a href="<?=$bqsr['titleurl']?>" target="_blank"><?=$bqr['title']?></a> <br> 
  7. [/e:loop] 
方法二也是极力推荐的写法,比like模糊匹配效率高很多且省资源

匹配所有关键词的相关标题
  1. <?php 
  2. $kr = explode(",", $navinfor['keyboard']); 
  3. $str = ''
  4. foreach($kr as $keyword){ 
  5.     $str .= ($str ? " or " : '') . 'instr(title,"'.$keyword.'")>0 '
  6. ?> 
  7. [e:loop={"select *  from [!db.pre!]ecms_news where $str order by id desc limit 10",0,24,0}] 
  8. <a href="<?=$bqsr['titleurl']?>" target="_blank"><?=$bqr['title']?></a> <br> 
  9. [/e:loop] 
匹配第一个关键词的相关标题
  1. <?php 
  2. $kr = explode(",", $navinfor['keyboard']); 
  3. $str='instr(title,"'.$kr[0].'")>0 '
  4. ?> 
  5. [e:loop={"select *  from [!db.pre!]ecms_news where $str order by id desc limit 10",0,24,0}] 
  6. <a href="<?=$bqsr['titleurl']?>" target="_blank"><?=$bqr['title']?></a> <br> 
  7. [/e:loop] 
方法三,也是小编最喜欢的写法,既然都是PHP了,那就不用标签了!直接PHP岂不是更好呢!方法如下:
  1. <?php 
  2. $kr = explode(",", $navinfor['keyboard']); 
  3. $str = ''
  4. foreach($kr as $keyword){ 
  5.     $str .= ($str ? " or " : '') . 'instr(title,"'.$keyword.'")>0 '
  6. $sql=$empire->query("select * from {$dbtbpre}ecms_news where $str order by id desc limit 10");  
  7. while($r=$empire->fetch($sql)){ 
  8. ?> 
  9. <a href="<?=$r['titleurl']?>" target="_blank"><?=$r['title']?></a> <br> 
  10. <?php 
  11. ?> 
如果还想加上memcached或者是redis缓存,那就付费解决吧!本教程只适合帝国默认的灵动标签与PHP与html混写。如果实在需要帝国CMS通过关键词调用相关文章建议用第二种方法!第一种方法虽然效率是比之前的写法title like '%$navinfor[keyboard]%'高了很多,但是同时匹配的相关性差了很多很多毕竟只匹配后面的词。其次就是关键词匹配相关文章最好就匹配第一个关键词就可以了,不用数组循环后再SQL查询,增加了数据库读取次数与连接数。最后还得说说如果上线使用请把select里面的*换成查询调用的具体字段!不要*去查询所有字段!(此教程用*是为了方便且教程例子不能把具体的调用字段列举出来毕竟每个人调用的字段不一样)

【审核人:站长】

收藏   加好友   生成海报   分享
点赞(0)
打赏
Tags:
评论(0人参与,0条评论) 雨祺
0/0
  • 请先说点什么
    最新评论

    发布者资料

    热门文章

    技术文摘

    查看更多技术文摘
    首页
    栏目
    搜索
    会员
    投稿