ѡ̳

 找回密码
 ע
搜索
查看: 20|回复: 1
打印 上一主题 下一主题

修改:搜索功能当typeid为0时为全站搜索 --ok

[复制链接]

789

主题

1158

帖子

4197

积分

Ա

Rank: 9Rank: 9Rank: 9

积分
4197
跳转到指定楼层
¥
发表于 2017-12-14 23:27:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
已处理
$typeid = empty($_GET['typeid']) ? 0 : intval($_GET['typeid']);
  1. public function init() {
  2.                 //获取siteid
  3.                 $siteid = isset($_REQUEST['siteid']) && trim($_REQUEST['siteid']) ? intval($_REQUEST['siteid']) : 1;
  4.                 $SEO = seo($siteid);

  5.                 //搜索配置
  6.                 $search_setting = getcache('search');
  7.                 $setting = $search_setting[$siteid];

  8.                 $search_model = getcache('search_model_'.$siteid);
  9.                 $type_module = getcache('type_module_'.$siteid);

  10.                 if(isset($_GET['q'])) {
  11.                         if(trim($_GET['q'])=='') {
  12.                                 header('Location: '.APP_PATH.'index.php?m=search');exit;
  13.                         }
  14.                         $typeid = empty($_GET['typeid']) ? 0 : intval($_GET['typeid']);
  15.                         $time = empty($_GET['time']) || !in_array($_GET['time'],array('all','day','month','year','week')) ? 'all' : trim($_GET['time']);
  16.                         $page = isset($_GET['page']) ? intval($_GET['page']) : 1;
  17.                         $pagesize = 10;
  18.                         $q = safe_replace(trim($_GET['q']));
  19.                         $q = new_html_special_chars(strip_tags($q));
  20.                         $q = str_replace('%', '', $q);        //过滤'%',用户全文搜索
  21.                         $search_q = $q;        //搜索原内容
  22.                         
  23.                         //按时间搜索
  24.                         if($time == 'day') {
  25.                                 $search_time = SYS_TIME - 86400;
  26.                                 $sql_time = ' AND adddate > '.$search_time;
  27.                         } elseif($time == 'week') {
  28.                                 $search_time = SYS_TIME - 604800;
  29.                                 $sql_time = ' AND adddate > '.$search_time;
  30.                         } elseif($time == 'month') {
  31.                                 $search_time = SYS_TIME - 2592000;
  32.                                 $sql_time = ' AND adddate > '.$search_time;
  33.                         } elseif($time == 'year') {
  34.                                 $search_time = SYS_TIME - 31536000;
  35.                                 $sql_time = ' AND adddate > '.$search_time;
  36.                         } else {
  37.                                 $search_time = 0;
  38.                                 $sql_time = '';
  39.                         }
  40.                         if($page==1 && !$setting['sphinxenable']) {
  41.                                 //精确搜索
  42.                                 //$commend = $this->db->get_one("`typeid` = '$typeid' $sql_time AND `data` like '%$q%'");
  43.                                  $commend = $this->db->get_one(" 1 $sql_time AND `data` like '%$q%'");
  44.                         } else {
  45.                                 $commend = '';
  46.                         }
  47.                         
  48.                          //var_dump($commend);
  49.                         //如果开启sphinx
  50.                         if($setting['sphinxenable']) {
  51.                                 $sphinx = pc_base::load_app_class('search_interface', '', 0);
  52.                                 $sphinx = new search_interface();
  53.                                 
  54.                                 $offset = $pagesize*($page-1);
  55.                                 $res = $sphinx->search($q, array($siteid), array($typeid), array($search_time, SYS_TIME), $offset, $pagesize, '@weight desc');
  56.                                 $totalnums = $res['total'];
  57.                                 //如果结果不为空
  58.                                 if(!empty($res['matches'])) {
  59.                                         $result = $res['matches'];
  60.                                 }
  61.                         } else {
  62.                                 pc_base::load_sys_class('segment', '', 0);
  63.                                 $segment = new segment();
  64.                                 //分词结果
  65.                                 $segment_q = $segment->get_keyword($segment->split_result($q));
  66.                                 //如果分词结果为空
  67.                                 if(!empty($segment_q)) {
  68.                                        
  69.                                         //取消分词使用like
  70.                                         //$sql = "`siteid`= '$siteid' AND `typeid` = '$typeid' $sql_time AND MATCH (`data`) AGAINST ('$segment_q' IN BOOLEAN MODE)";
  71.                                     //$sql = "`siteid`= '$siteid' $sql_time AND MATCH (`data`) AGAINST ('$segment_q' IN BOOLEAN MODE)";
  72.                                 $sql = "`siteid`= '$siteid' $sql_time AND `data` like '%$q%'";
  73.                                 } else {
  74.                                        
  75.                                        
  76.                                         //$sql = "`siteid`= '$siteid' AND `typeid` = '$typeid' $sql_time AND `data` like '%$q%'";
  77.                                 $sql = "`siteid`= '$siteid' $sql_time AND `data` like '%$q%'";
  78.                                 
  79.                                 }

  80.                                 $result = $this->db->listinfo($sql, 'searchid DESC', $page, 10);
  81.                         }


  82.             //echo $sql;
  83.             //print_r($result);
  84.            //echo $sql;
  85.                         //如果开启相关搜索功能
  86.                         if($setting['relationenble']) {
  87.                                 //如果关键词长度在8-16之间,保存关键词作为relation search
  88.                                 $this->keyword_db = pc_base::load_model('search_keyword_model');

  89.                                 if(strlen($q) < 17 && strlen($q) > 5 && !empty($segment_q)) {
  90.                                         $res = $this->keyword_db->get_one(array('keyword'=>$q));
  91.                                         if($res) {
  92.                                                 //关键词搜索数+1
  93.                                                 //$this->keyword_db->update(array('searchnums'=>'+=1'), array('keyword'=>$q));
  94.                                         } else {
  95.                                                 //关键词转换为拼音
  96.                                                 pc_base::load_sys_func('iconv');
  97.                                                 $pinyin = gbk_to_pinyin($q);
  98.                                                 if(is_array($pinyin)) {
  99.                                                         $pinyin = implode('', $pinyin);
  100.                                                 }
  101.                                                 $this->keyword_db->insert(array('keyword'=>$q, 'searchnums'=>1, 'data'=>$segment_q, 'pinyin'=>$pinyin));
  102.                                         }
  103.                                 }
  104.                                 //相关搜索
  105.                                 if(!empty($segment_q)) {
  106.                                         $relation_q = str_replace(' ', '%', $segment_q);
  107.                                 } else {
  108.                                         $relation_q = $q;
  109.                                 }
  110.                                 $relation = $this->keyword_db->select("MATCH (`data`) AGAINST ('%$relation_q%' IN BOOLEAN MODE)", '*', 10, 'searchnums DESC');
  111.                         }
  112.                                 
  113.                         //如果结果不为空
  114.                           if(!empty($result) || !empty($commend['id'])) {
  115.                                 //开启sphinx后文章id取法不同
  116.                                 if($setting['sphinxenable']) {
  117.                                         foreach($result as $_v) {
  118.                                                 $sids[] = $_v['attrs']['id'];
  119.                                         }
  120.                                 } else {
  121.                                         foreach($result as $_v) {
  122.                                                 $sids[] = $_v['id'];
  123.                                                 $typeids[$_v['typeid']][] = $_v['id'];
  124.                                         }
  125.                                 }

  126.                                 /*if(!empty($commend['id'])) {
  127.                                         $sids[] = $commend['id'];
  128.                                 }*/
  129.                                 $sids = array_unique($sids);
  130.                                  
  131.                                 $where = to_sqls($sids, '', 'id');
  132.                                 //获取模型id
  133.                                 $model_type_cache = getcache('type_model_'.$siteid,'search');
  134.                                 $model_type_cache = array_flip($model_type_cache);
  135.                                 $modelid = $model_type_cache[$typeid];
  136.                                 
  137.                                 //print_r($model_type_cache);
  138.                //echo $modelid;
  139.                   
  140.                    //var_dump($where);
  141.                                 //是否读取其他模块接口
  142.                                 
  143.                                 //echo $typeid;
  144.                                 if($modelid) {
  145.                                         $this->content_db->set_model($modelid);
  146.                                          /**
  147.                                          * 如果表名为空,则为黄页模型
  148.                                          */
  149.                                         if(empty($this->content_db->model_tablename)) {
  150.                                                 $this->content_db = pc_base::load_model('yp_content_model');
  151.                                                 $this->content_db->set_model($modelid);

  152.                                         }

  153.                                         if($setting['sphinxenable']) {
  154.                                                 $data = $this->content_db->listinfo($where, 'id DESC', 1, $pagesize);
  155.                                                 $pages = pages($totalnums, $page, $pagesize);
  156.                                         } else {
  157.                                                 $data = $this->content_db->select($where, '*');
  158.                                                 //这里如何多模型呢?
  159.                                                 
  160.                                                 
  161.                                                 $pages = $this->db->pages;
  162.                                                 $totalnums = $this->db->number;
  163.                                         }
  164.                                 
  165.                                 //echo $where;
  166.                                  
  167.                                         //如果分词结果为空
  168.                                         if(!empty($segment_q)) {
  169.                                                 $replace = explode(' ', $segment_q);
  170.                                                 foreach($replace as $replace_arr_v) {
  171.                                                         $replace_arr[] =  '<font color=red>'.$replace_arr_v.'</font>';
  172.                                                 }
  173.                                                 foreach($data as $_k=>$_v) {
  174.                                                         $data[$_k]['title'] = str_replace($replace, $replace_arr, $_v['title']);
  175.                                                         $data[$_k]['description'] = str_replace($replace, $replace_arr, $_v['description']);
  176.                                                 }
  177.                                         } else {
  178.                                                 foreach($data as $_k=>$_v) {
  179.                                                         $data[$_k]['title'] = str_replace($q, '<font color=red>'.$q.'</font>', $_v['title']);
  180.                                                         $data[$_k]['description'] = str_replace($q, '<font color=red>'.$q.'</font>', $_v['description']);
  181.                                                 }
  182.                                         }
  183.                                 } else {
  184.                                         //读取专辑搜索接口
  185.                                         /*$special_api = pc_base::load_app_class('search_api', 'special');
  186.                                          $data = $special_api->get_search_data($sids);
  187.                                         $totalnums = count($data);*/
  188.                                  
  189.                                  
  190.                                 // echo "####";
  191.                                 
  192.                                 $sids = array_unique($sids);
  193.                                  
  194.                                 $where = to_sqls($sids, '', 'id');
  195.                                 
  196.                                 
  197.                                 //echo $where;
  198.                                  //print_r($typeids);
  199.                                 
  200.                            //先根据不同的模型分配下ID
  201.                                 
  202.                                 $data = array();
  203.                                 $totalnums = 0;
  204.                                 foreach($typeids as $tid=>$id){
  205.                                        
  206.                                         $modelid =  $model_type_cache[$tid];
  207.                                          $this->content_db->set_model($modelid);
  208.                                          $data_temp = $this->content_db->select($where, '*');
  209.                                                 //这里如何多模型呢?
  210.                                          
  211.                                          $totalnums_temp  = $this->db->number;
  212.                                          
  213.                                         $data = array_merge($data,$data_temp);
  214.                                         $totalnums = $totalnums+ $totalnums_temp;
  215.                                        
  216.                                         }
  217.                                          
  218.                   $pages = pages($totalnums, $page, $pagesize);
  219.                                 
  220.                                 //echo $where;
  221.                                  
  222.                                         //如果分词结果为空
  223.                                         if(!empty($segment_q)) {
  224.                                                 $replace = explode(' ', $segment_q);
  225.                                                 foreach($replace as $replace_arr_v) {
  226.                                                         $replace_arr[] =  '<font color=red>'.$replace_arr_v.'</font>';
  227.                                                 }
  228.                                                 foreach($data as $_k=>$_v) {
  229.                                                         $data[$_k]['title'] = str_replace($replace, $replace_arr, $_v['title']);
  230.                                                         $data[$_k]['description'] = str_replace($replace, $replace_arr, $_v['description']);
  231.                                                 }
  232.                                         } else {
  233.                                                 foreach($data as $_k=>$_v) {
  234.                                                         $data[$_k]['title'] = str_replace($q, '<font color=red>'.$q.'</font>', $_v['title']);
  235.                                                         $data[$_k]['description'] = str_replace($q, '<font color=red>'.$q.'</font>', $_v['description']);
  236.                                                 }
  237.                                         }
  238.                                        
  239.                                        
  240.                                        
  241.                                        
  242.                                        
  243.                                        
  244.                                 }
  245.                         }
  246.                         $execute_time = execute_time();
  247.                         $pages = isset($pages) ? $pages : '';
  248.                         $totalnums = isset($totalnums) ? $totalnums : 0;
  249.                         $data = isset($data) ? $data : '';
  250.                         
  251.                         
  252.                         //print_r($data);
  253.                         
  254.                         include        template('search','list');
  255.                 } else {
  256.                         include        template('search','index');
  257.                 }
  258.         }
复制代码


回复

使用道具 举报

789

主题

1158

帖子

4197

积分

Ա

Rank: 9Rank: 9Rank: 9

积分
4197
ɳ
 楼主| 发表于 2017-12-16 13:49:54 | 只看该作者
新版
修复分页问题 采用网络上修复好的
  1. <?php
  2. defined('IN_PHPCMS') or exit('No permission resources.');
  3. pc_base::load_sys_class('form','',0);
  4. pc_base::load_sys_class('format','',0);
  5. class index {
  6.         function __construct() {
  7.                 $this->db = pc_base::load_model('search_model');
  8.                 $this->content_db = pc_base::load_model('content_model');
  9.         }
  10.        
  11.         /**
  12.          * 关键词搜索
  13.          */
  14.         public function init() {
  15.                 //获取siteid
  16.                 $siteid = isset($_REQUEST['siteid']) && trim($_REQUEST['siteid']) ? intval($_REQUEST['siteid']) : 1;
  17.                 $SEO = seo($siteid);

  18.                 //搜索配置
  19.                 $search_setting = getcache('search');
  20.                 $setting = $search_setting[$siteid];

  21.                 $search_model = getcache('search_model_'.$siteid);
  22.                 $type_module = getcache('type_module_'.$siteid);

  23.                 if(isset($_GET['q'])) {
  24.                         if(trim($_GET['q'])=='') {
  25.                                 header('Location: '.APP_PATH.'index.php?m=search');exit;
  26.                         }
  27.                         $typeid = empty($_GET['typeid']) ? 0 : intval($_GET['typeid']);
  28.                         $time = empty($_GET['time']) || !in_array($_GET['time'],array('all','day','month','year','week')) ? 'all' : trim($_GET['time']);
  29.                         $page = isset($_GET['page']) ? intval($_GET['page']) : 1;
  30.                         $pagesize = 10;
  31.                         $q = safe_replace(trim($_GET['q']));
  32.                         $q = new_html_special_chars(strip_tags($q));
  33.                         $q = str_replace('%', '', $q);        //过滤'%',用户全文搜索
  34.                         $search_q = $q;        //搜索原内容

  35.             $sql_time = $sql_tid = '';
  36.             if($typeid) $sql_tid = ' AND typeid = '.$typeid;
  37.                         //按时间搜索
  38.                         if($time == 'day') {
  39.                                 $search_time = SYS_TIME - 86400;
  40.                                 $sql_time = ' AND adddate > '.$search_time;
  41.                         } elseif($time == 'week') {
  42.                                 $search_time = SYS_TIME - 604800;
  43.                                 $sql_time = ' AND adddate > '.$search_time;
  44.                         } elseif($time == 'month') {
  45.                                 $search_time = SYS_TIME - 2592000;
  46.                                 $sql_time = ' AND adddate > '.$search_time;
  47.                         } elseif($time == 'year') {
  48.                                 $search_time = SYS_TIME - 31536000;
  49.                                 $sql_time = ' AND adddate > '.$search_time;
  50.                         } else {
  51.                                 $search_time = 0;
  52.                                 $sql_time = '';
  53.                         }
  54.                         if($page==1 && !$setting['sphinxenable']) {
  55.                                 //精确搜索
  56.                                 $commend = $this->db->get_one("`siteid`= '$siteid' $sql_tid $sql_time AND `data` like '%$q%'");
  57.                         } else {
  58.                                 $commend = '';
  59.             }
  60.                         //如果开启sphinx
  61.                         if($setting['sphinxenable']) {
  62.                                 $sphinx = pc_base::load_app_class('search_interface', '', 0);
  63.                                 $sphinx = new search_interface();
  64.                                
  65.                                 $offset = $pagesize*($page-1);
  66.                                 $res = $sphinx->search($q, array($siteid), array($typeid), array($search_time, SYS_TIME), $offset, $pagesize, '@weight desc');
  67.                                 $totalnums = $res['total'];
  68.                                 //如果结果不为空
  69.                                 if(!empty($res['matches'])) {
  70.                                         $result = $res['matches'];
  71.                                 }
  72.                         } else {
  73.                                
  74.                                 $sql = "`siteid`= '$siteid' $sql_tid $sql_time AND `data` like '%$q%'";
  75.                                

  76.                                 $result = $this->db->listinfo($sql, 'searchid DESC', $page, 10);
  77.             }
  78.            
  79.                         //如果结果不为空
  80.                         if(!empty($result) || !empty($commend['id'])) {
  81.                                 foreach($result as $_v) {
  82.                                         if($_v['typeid']) $sids[$_v['typeid']][] = $_v['id'];
  83.                                 }

  84.                                 if(!empty($commend['id'])) {
  85.                                         if($commend['typeid']) $sids[$commend['typeid']][] = $commend['id'];
  86.                                 }
  87.                                 $model_type_cache = getcache('type_model_'.$siteid,'search');
  88.                 $model_type_cache = array_flip($model_type_cache);
  89.                 $data = array();
  90.                 foreach($sids as $_k=>$_val) {
  91.                     $tid = $_k;
  92.                                     $ids = array_unique($_val);

  93.                                     $where = to_sqls($ids, '', 'id');
  94.                                     //获取模型id
  95.                                     $modelid = $model_type_cache[$tid];

  96.                                     //是否读取其他模块接口
  97.                                     if($modelid) {
  98.                                             $this->content_db->set_model($modelid);
  99.                                        
  100.                                             /**
  101.                                             * 如果表名为空,则为黄页模型
  102.                                             */
  103.                                             if(empty($this->content_db->model_tablename)) {
  104.                                                     $this->content_db = pc_base::load_model('yp_content_model');
  105.                                                     $this->content_db->set_model($modelid);

  106.                                             }
  107.                         $datas = $this->content_db->select($where, '*');
  108.                     }
  109.                     $data = array_merge($data,$datas);
  110.                 }
  111.                 $pages = $this->db->pages;
  112.                 $totalnums = $this->db->number;
  113.             
  114.                 //如果分词结果为空
  115.                 if(!empty($segment_q)) {
  116.                     $replace = explode(' ', $segment_q);
  117.                     foreach($replace as $replace_arr_v) {
  118.                         $replace_arr[] =  '<font color=red>'.$replace_arr_v.'</font>';
  119.                     }
  120.                     foreach($data as $_k=>$_v) {
  121.                         $data[$_k]['title'] = str_replace($replace, $replace_arr, $_v['title']);
  122.                         $data[$_k]['description'] = str_replace($replace, $replace_arr, $_v['description']);
  123.                     }
  124.                 } else {
  125.                     foreach($data as $_k=>$_v) {
  126.                         $data[$_k]['title'] = str_replace($q, '<font color=red>'.$q.'</font>', $_v['title']);
  127.                         $data[$_k]['description'] = str_replace($q, '<font color=red>'.$q.'</font>', $_v['description']);
  128.                     }
  129.                 }
  130.                         }
  131.                         $execute_time = execute_time();
  132.                         $pages = isset($pages) ? $pages : '';
  133.                         $totalnums = isset($totalnums) ? $totalnums : 0;
  134.                         $data = isset($data) ? $data : '';
  135.                        
  136.                         include        template('search','list');
  137.                 } else {
  138.                         include        template('search','index');
  139.                 }
  140.         }

  141.        
  142.         public function public_get_suggest_keyword() {
  143.                 $url = $_GET['url'].'&q='.$_GET['q'];
  144.                 $trust_url = array('c8430fcf851e85818b546addf5bc4dd3');
  145.                 $urm_md5 = md5($url);
  146.                 if (!in_array($urm_md5, $trust_url)) exit;
  147.                
  148.                 $res = @file_get_contents($url);
  149.                 if(CHARSET != 'gbk') {
  150.                         $res = iconv('gbk', CHARSET, $res);
  151.                 }
  152.                 echo $res;
  153.         }
  154.        
  155.         /**
  156.          * 提示搜索接口
  157.          * TODO 暂时未启用,用的是google的接口
  158.          */
  159.         public function public_suggest_search() {
  160.                 //关键词转换为拼音
  161.                 pc_base::load_sys_func('iconv');
  162.                 $pinyin = gbk_to_pinyin($q);
  163.                 if(is_array($pinyin)) {
  164.                         $pinyin = implode('', $pinyin);
  165.                 }
  166.                 $this->keyword_db = pc_base::load_model('search_keyword_model');
  167.                 $suggest = $this->keyword_db->select("pinyin like '$pinyin%'", '*', 10, 'searchnums DESC');
  168.                
  169.                 foreach($suggest as $v) {
  170.                         echo $v['keyword']."\n";
  171.                 }

  172.                
  173.         }
  174. }
  175. ?>
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | ע

本版积分规则

QQ|Archiver|ֻ|С|ѡ̳

GMT+8, 2026-5-2 07:14 , Processed in 0.078143 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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