设为首页收藏本站

PHPIN.NET

 找回密码
 立即注册
查看: 838|回复: 0

[技巧手记] 帝国CMS搜索优化(支持多关键字词空格搜索结果)

[复制链接]

374

主题

381

帖子

2554

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2554
发表于 2015-3-12 16:29:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
帝国CMS搜索优化(支持多关键字词空格搜索结果)

本方法带来的其他影响因素暂未测试(目前已知热门搜索关键字词调用的时候,关键字也是带有空格的。暂未发现其他)
简单优化了下官方的默认搜索系统,让搜索支持多个关键字词之间可以使用空格区分(两个关键词之间多少空格都无所谓,多个关键词也无所谓,都支持)
效果截图,搜索前:
搜索前.png

效果截图,搜索后:
搜索后.png 后台搜索记录截图:
后台搜索记录.png

修改方法,打开/e/search/index.php
1、找到:
  1. //处理关键字
  2. function SearchDoKeyboardVar($keyboard){
  3.         $keyboard=RepPostVar2(trim($keyboard));
  4.         $keyboard=str_replace('  ','',$keyboard);
  5.         return $keyboard;
  6. }
复制代码
修改为:
  1. //处理关键字
  2. function SearchDoKeyboardVar($keyboard){
  3.         $keyboard=RepPostVar2(trim($keyboard));
  4.         //$keyboard=str_replace('  ','',$keyboard);
  5. /*xuan 搜索关键字优化*/
  6. $keyboard=preg_replace('/[\s]+/s', ' ', $keyboard);
  7. /*xuan 搜索关键字优化*/
  8.         return $keyboard;
  9. }
复制代码

2、找到:
  1. //(有两处,修改第二处)
  2. $where=$f." LIKE '%".$keyboard."%'";
  3. 7.0版为:
  4. $where=$f." LIKE '%".str_replace(" ","%",$keyboard)."%'";
复制代码
修改为:
  1. /*xuan 搜索关键字优化*/
  2. preg_match_all("/[^\s]+/s",$keyboard,$keyarr);
  3. foreach ($keyarr[0] as $val){
  4. $tj.=$f." like '%".$val."%' or ";
  5. }
  6. $where=substr($tj,0,-4);
  7. /*xuan 搜索关键字优化*/
复制代码


这样即可。
懒人直接复制以下代码替换/e/search/index.php中所有代码即可
/e/search/index.php:
  1. <?php
  2. require("../class/connect.php");
  3. require("../class/db_sql.php");
  4. require("../data/dbcache/class.php");
  5. require("../class/q_functions.php");
  6. eCheckCloseMods('search');//关闭模块
  7. $link=db_connect();
  8. $empire=new mysqlquery();

  9. //处理关键字
  10. function SearchDoKeyboardVar($keyboard){
  11.         $keyboard=RepPostVar2(trim($keyboard));
  12.         //$keyboard=str_replace('  ','',$keyboard);
  13. /*xuan 搜索关键字优化*/
  14. $keyboard=preg_replace('/[\s]+/s', ' ', $keyboard);
  15. /*xuan 搜索关键字优化*/
  16.         return $keyboard;
  17. }

  18. //返回SQL
  19. function SearchDoKeyboard($f,$hh,$keyboard){
  20.         $where='';
  21.         $keyboard=SearchDoKeyboardVar($keyboard);
  22.         if(empty($keyboard))
  23.         {
  24.                 return "";
  25.         }
  26.         if(!empty($hh))
  27.         {
  28.                 if($hh=='LT')//小于
  29.                 {
  30.                         $where=$f."<'".$keyboard."'";
  31.                 }
  32.                 elseif($hh=='GT')//大于
  33.                 {
  34.                         $where=$f.">'".$keyboard."'";
  35.                 }
  36.                 elseif($hh=='EQ')//等于
  37.                 {
  38.                         $where=$f."='".$keyboard."'";
  39.                 }
  40.                 elseif($hh=='LE')//小于等于
  41.                 {
  42.                         $where=$f."<='".$keyboard."'";
  43.                 }
  44.                 elseif($hh=='GE')//大于等于
  45.                 {
  46.                         $where=$f.">='".$keyboard."'";
  47.                 }
  48.                 elseif($hh=='NE')//不等于
  49.                 {
  50.                         $where=$f."<>'".$keyboard."'";
  51.                 }
  52.                 elseif($hh=='IN')//包含
  53.                 {
  54.                         $kr=explode(' ',$keyboard);
  55.                         $kcount=count($kr);
  56.                         $kbs='';
  57.                         $dh='';
  58.                         for($i=0;$i<$kcount;$i++)
  59.                         {
  60.                                 $kr[$i]=(float)$kr[$i];
  61.                                 if(empty($kr[$i]))
  62.                                 {
  63.                                         continue;
  64.                                 }
  65.                                 if($kbs)
  66.                                 {
  67.                                         $dh=',';
  68.                                 }
  69.                                 $kbs.=$dh."'".$kr[$i]."'";
  70.                         }
  71.                         if($kbs)
  72.                         {
  73.                                 $where=$f." IN (".$kbs.")";
  74.                         }
  75.                         else
  76.                         {
  77.                                 return '';
  78.                         }
  79.                 }
  80.                 elseif($hh=='BT')//范围
  81.                 {
  82.                         $keyboard=ltrim($keyboard);
  83.                         if(!strstr($keyboard,' '))
  84.                         {
  85.                                 return '';
  86.                         }
  87.                         $kr=explode(' ',$keyboard);
  88.                         $kr[0]=(float)$kr[0];
  89.                         $kr[1]=(float)$kr[1];
  90.                         if(!trim($kr[0])||!trim($kr[1]))
  91.                         {
  92.                                 return '';
  93.                         }
  94.                         $where=$f." BETWEEN '".$kr[0]."' and '".$kr[1]."'";
  95.                 }
  96.                 else//相似
  97.                 {
  98.                         $where=$f." LIKE '%".$keyboard."%'";
  99.                 }
  100.         }
  101.         else
  102.         {
  103.                 //$where=$f." LIKE '%".str_replace(" ","%",$keyboard)."%'";
  104. /*xuan 搜索关键字优化*/
  105. preg_match_all("/[^\s]+/s",$keyboard,$keyarr);
  106. foreach ($keyarr[0] as $val){
  107. $tj.=$f." like '%".$val."%' or ";
  108. }
  109. $where=substr($tj,0,-4);
  110. /*xuan 搜索关键字优化*/
  111.         }
  112.         return $where;
  113. }

  114. //变量
  115. if($_GET['searchget']==1)
  116. {
  117.         $_POST=$_GET;
  118. }

  119. $ip=egetip();
  120. $searchtime=time();
  121. $getvar=$_POST['getvar'];
  122. if(empty($getvar))
  123. {
  124.         $getfrom="history.go(-1)";
  125.         $dogetvar='';
  126. }
  127. else
  128. {
  129.         $getfrom="../../search/";
  130.         $dogetvar="&getvar=1";
  131. }
  132. //返回
  133. $getfrom=DoingReturnUrl($getfrom,$_POST['ecmsfrom']);
  134. //搜索用户组
  135. if($public_r['searchgroupid'])
  136. {
  137.         $psearchgroupid=$public_r['searchgroupid'];
  138.         @include("../data/dbcache/MemberLevel.php");
  139.         $searchgroupid=(int)getcvar('mlgroupid');
  140.         if($level_r[$searchgroupid][level]<$level_r[$psearchgroupid][level])
  141.         {
  142.                 printerror("NotLevelToSearch",$getfrom,1);
  143.         }
  144. }
  145. //搜索间隔
  146. $lastsearchtime=getcvar('lastsearchtime');
  147. if($lastsearchtime)
  148. {
  149.         if($searchtime-$lastsearchtime<$public_r[searchtime])
  150.         {
  151.                 printerror("SearchOutTime",$getfrom,1);
  152.         }
  153. }
  154. //搜索字段
  155. $searchclass=$_POST['show'];
  156. if(empty($searchclass)||@strstr($searchclass," "))
  157. {
  158.         printerror("SearchNotRecord",$getfrom,1);
  159. }
  160. //时间范围
  161. $add='';
  162. $addtime='';
  163. $starttime=RepPostVar($_POST['starttime']);
  164. if(empty($starttime))
  165. {
  166.         $starttime="0000-00-00";
  167. }
  168. $endtime=RepPostVar($_POST['endtime']);
  169. if(empty($endtime))
  170. {
  171.         $endtime="0000-00-00";
  172. }
  173. if($endtime!="0000-00-00")
  174. {
  175.         $addtime=" and (newstime BETWEEN '".to_time($starttime." 00:00:00")."' and '".to_time($endtime." 23:59:59")."')";
  176. }
  177. //价格
  178. $addprice='';
  179. $startprice=(int)$_POST['startprice'];
  180. $endprice=(int)$_POST['endprice'];
  181. if($endprice)
  182. {
  183.         $addprice=" and (price BETWEEN ".$startprice." and ".$endprice.")";
  184. }
  185. //搜索栏目及表
  186. $classid=RepPostVar($_POST['classid']);
  187. $s_tbname=RepPostVar($_POST['tbname']);
  188. $s_tempid=(int)$_POST['tempid'];
  189. $trueclassid=0;
  190. if($classid)//按栏目
  191. {
  192.         if(strstr($classid,","))//多栏目
  193.         {
  194.                 $son_r=sys_ReturnMoreClass($classid,1);
  195.                 $trueclassid=$son_r[0];
  196.                 $add.=' and ('.$son_r[1].')';
  197.         }
  198.         else
  199.         {
  200.                 $trueclassid=intval($classid);
  201.                 $add.=$class_r[$trueclassid][islast]?" and classid='$trueclassid'":" and ".ReturnClass($class_r[$trueclassid][sonclass]);
  202.         }
  203.         $tbname=$class_r[$trueclassid][tbname];
  204.         $modid=$class_r[$trueclassid][modid];
  205. }
  206. elseif($s_tbname)//按数据表
  207. {
  208.         $tbnamenum=$empire->gettotal("select count(*) as total from {$dbtbpre}enewstable where tbname='$s_tbname' limit 1");
  209.         if(!$tbnamenum)
  210.         {
  211.                 printerror("SearchNotRecord",$getfrom,1);
  212.         }
  213.         $tbname=$s_tbname;
  214.         //模型id
  215.         $thestemp_r=$empire->fetch1("select modid from ".GetTemptb("enewssearchtemp")." where tempid='$s_tempid'");
  216.         if(empty($thestemp_r['modid']))
  217.         {
  218.                 printerror("SearchNotRecord",$getfrom,1);
  219.         }
  220.         $modid=$thestemp_r['modid'];
  221. }
  222. else
  223. {
  224.         $tbname=$public_r['tbname'];
  225.         $modid=0;
  226. }
  227. //表不存在
  228. if(empty($tbname)||InfoIsInTable($tbname))
  229. {
  230.         printerror("SearchNotRecord",$getfrom,1);
  231. }
  232. //标题分类
  233. $ttid=RepPostVar($_POST['ttid']);
  234. $truettid=0;
  235. if($ttid)
  236. {
  237.         if(strstr($ttid,","))//多标题分类
  238.         {
  239.                 $son_r=sys_ReturnMoreTT($ttid);
  240.                 $truettid=$son_r[0];
  241.                 $add.=' and ('.$son_r[1].')';
  242.         }
  243.         else
  244.         {
  245.                 $truettid=intval($ttid);
  246.                 $add.=" and ttid='$truettid'";
  247.         }
  248. }
  249. //会员
  250. $member=$_POST['member'];
  251. if($member==1)
  252. {
  253.         $add.=' and ismember=1';
  254. }
  255. elseif($member==2)
  256. {
  257.         $add.=' and ismember=0';
  258. }
  259. //模型
  260. $tempr=array();
  261. if(empty($class_r[$trueclassid][searchtempid]))
  262. {
  263.         if(empty($modid))
  264.         {
  265.                 $tempr=$empire->fetch1("select modid from ".GetTemptb("enewssearchtemp")." where isdefault=1 limit 1");
  266.         }
  267.         else
  268.         {
  269.                 $tempr[modid]=$modid;
  270.         }
  271. }
  272. else
  273. {
  274.         $tempr[modid]=$modid;
  275. }

  276. //关键字
  277. $keyboard=$_POST['keyboard'];
  278. $keyboardone=0;
  279. if(is_array($keyboard))
  280. {}
  281. elseif(strstr($keyboard,','))
  282. {
  283.         $keyboard=explode(',',$keyboard);
  284. }
  285. else
  286. {
  287.         $keyboard=trim($keyboard);
  288.         $len=strlen($keyboard);
  289.         if($len<$public_r[min_keyboard]||$len>$public_r[max_keyboard])
  290.         {
  291.                 printerror("MinKeyboard",$getfrom,1);
  292.         }
  293.         $keyboardone=1;
  294. }

  295. //符号
  296. $hh=$_POST['hh'];
  297. $hhone=0;
  298. if(is_array($hh))
  299. {}
  300. elseif(strstr($hh,','))
  301. {
  302.         $hh=explode(',',$hh);
  303. }
  304. else
  305. {
  306.         $hhone=1;
  307. }

  308. //字段
  309. if(!is_array($searchclass))
  310. {
  311.         $searchclass=explode(',',$searchclass);
  312. }

  313. $andor=$_POST['andor'];
  314. $andor=$andor=='and'?'and':'or';

  315. $mr=$empire->fetch1("select searchvar,tbname from {$dbtbpre}enewsmod where mid='$tempr[modid]'");
  316. if(!strstr($mr[searchvar],",price,"))//是否包含价格
  317. {
  318.         $addprice="";
  319.         $startprice=0;
  320.         $endprice=0;
  321. }
  322. //搜索特殊字段
  323. $mr[searchvar].='id,keyboard,userid,username,';
  324. $where='';
  325. $newsearchclass='';
  326. $count=count($searchclass);
  327. for($i=0;$i<$count;$i++)
  328. {
  329.         if(empty($searchclass[$i]))
  330.         {
  331.                 continue;
  332.         }
  333.         $searchclass[$i]=str_replace(',','',$searchclass[$i]);
  334.         if(!strstr($mr[searchvar],",".$searchclass[$i].","))
  335.         {
  336.                 continue;
  337.         }
  338.         $searchclass[$i]=RepPostVar($searchclass[$i]);
  339.         $dh=empty($newsearchclass)?'':',';
  340.         $newsearchclass.=$dh.$searchclass[$i];
  341.         $dohh=$hhone==1?$hh:$hh[$i];
  342.         $dokeyboard=$keyboardone==1?$keyboard:$keyboard[$i];
  343.         $onewhere=SearchDoKeyboard($searchclass[$i],$dohh,$dokeyboard);
  344.         if($onewhere)
  345.         {
  346.                 $or=empty($where)?'':' '.$andor.' ';
  347.                 $where.=$or.'('.$onewhere.')';
  348.         }
  349. }
  350. //参数错
  351. if(empty($newsearchclass))
  352. {
  353.         printerror("SearchNotRecord",$getfrom,1);
  354. }
  355. if($where)
  356. {
  357.         $add.=' and ('.$where.')';
  358. }
  359. $allwhere=$add.$addtime.$addprice;
  360. $keyboard=$keyboardone==1?SearchDoKeyboardVar($keyboard):'';
  361. $andsql=addslashes($allwhere);
  362. if(strlen($newsearchclass)>250||strlen($classid)>200||strlen($andsql)>3000||strlen($keyboard)>100||strlen($ttid)>200)
  363. {
  364.         printerror("SearchNotRecord",$getfrom,1);
  365. }
  366. //验证码
  367. $checkpass=md5($allwhere.$tbname);
  368. $query="select count(*) as total from {$dbtbpre}ecms_".$tbname.($allwhere?' where '.substr($allwhere,5):'');
  369. $search_r=$empire->fetch1("select searchid from {$dbtbpre}enewssearch where checkpass='$checkpass' limit 1");
  370. $searchid=$search_r[searchid];
  371. //排序
  372. $orderby=RepPostVar($_POST['orderby']);
  373. $myorder=(int)$_POST['myorder'];
  374. if($orderby)
  375. {
  376.         $orderr=ReturnDoOrderF($tempr[modid],$orderby,$myorder);
  377.         $orderby=$orderr['returnf'];
  378. }
  379. else
  380. {
  381.         $orderby='newstime';
  382. }
  383. //是否有历史记录
  384. if($searchid)
  385. {
  386.     $search_num=$empire->gettotal($query);
  387.         $sql=$empire->query("update {$dbtbpre}enewssearch set searchtime='$searchtime',result_num='$search_num',onclick=onclick+1,orderby='$orderby',myorder='$myorder',tempid='$s_tempid' where searchid='$searchid'");
  388.         if(empty($search_num))
  389.         {
  390.                 $searchid=0;
  391.         }
  392. }
  393. else
  394. {
  395.         $search_num=$empire->gettotal($query);
  396.         if(empty($search_num))
  397.         {
  398.                 $searchid=0;
  399.         }
  400.         else
  401.         {
  402.                 $iskey=$keyboardone==1?0:1;
  403.                 $sql=$empire->query("insert into {$dbtbpre}enewssearch(searchtime,keyboard,searchclass,result_num,searchip,classid,onclick,orderby,myorder,checkpass,tbname,tempid,iskey,andsql,trueclassid) values('$searchtime','$keyboard','$newsearchclass','$search_num','$ip','$classid',1,'$orderby','$myorder','$checkpass','$tbname','$s_tempid','$iskey','$andsql','$trueclassid')");
  404.                 $searchid=$empire->lastid();
  405.         }
  406. }
  407. //设置最后搜索时间
  408. $set1=esetcookie("lastsearchtime",$searchtime,$searchtime+3600*24);
  409. if(!$searchid)
  410. {
  411.         printerror("SearchNotRecord",$getfrom,1);
  412. }
  413. else
  414. {
  415.         Header("Location:result/?searchid=$searchid".$dogetvar);
  416. }
  417. db_close();
  418. $empire=null;
  419. ?>
复制代码


本方法兼容帝国CMS7.0/7.2,其他版本暂未测试。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|PHPIN.NET ( 冀ICP备00000001号 )|网站地图  

GMT+8, 2016-12-3 12:28

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表