首页 > 网站建设 > 正文

phpcms全文搜索的解决办法

来源:播品传媒   2015-07-26 17:15:27   点击:

phpcms v9自带的搜索功能只能搜索标题,不能搜索文章内容,就是标题也搜不全,区分不同模型很不爽,用户不懂什么模型,这并不是用户想要的

phpcms v9自带的搜索功能只能搜索标题,不能搜索文章内容,就是标题也搜不全,区分不同模型很不爽,用户不懂什么模型,这并不是用户想要的站内搜索。

今日有兴趣修改了一下v9默认的搜索功能,可以不按模型搜索全站内容

下面是被修改后的search模块中的index.php代码:

<?php
defined('IN_PHPCMS') or exit('No permission resources.');
pc_base::load_sys_class('form','',0);
pc_base::load_sys_class('format','',0);
class index {
        function __construct() {
                $this->db = pc_base::load_model('search_model');
                $this->content_db = pc_base::load_model('content_model');
        }
        
        /**
         * 关键词搜索
         */
        public function init() {
                //获取siteid
                $siteid = isset($_REQUEST['siteid']) && trim($_REQUEST['siteid']) ? intval($_REQUEST['siteid']) : 1;
                $SEO = seo($siteid);

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

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

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

            $sql_time = $sql_tid = '';
            if($typeid) $sql_tid = ' AND typeid = '.$typeid;
                        //按时间搜索
                        if($time == 'day') {
                                $search_time = SYS_TIME - 86400;
                                $sql_time = ' AND adddate > '.$search_time;
                        } elseif($time == 'week') {
                                $search_time = SYS_TIME - 604800;
                                $sql_time = ' AND adddate > '.$search_time;
                        } elseif($time == 'month') {
                                $search_time = SYS_TIME - 2592000;
                                $sql_time = ' AND adddate > '.$search_time;
                        } elseif($time == 'year') {
                                $search_time = SYS_TIME - 31536000;
                                $sql_time = ' AND adddate > '.$search_time;
                        } else {
                                $search_time = 0;
                                $sql_time = '';
                        }
                        if($page==1 && !$setting['sphinxenable']) {
                                //精确搜索
                                $commend = $this->db->get_one("`siteid`= '$siteid' $sql_tid $sql_time AND `data` like '%$q%'");
                        } else {
                                $commend = '';
            }
                        //如果开启sphinx
                        if($setting['sphinxenable']) {
                                $sphinx = pc_base::load_app_class('search_interface', '', 0);
                                $sphinx = new search_interface();
                                
                                $offset = $pagesize*($page-1);
                                $res = $sphinx->search($q, array($siteid), array($typeid), array($search_time, SYS_TIME), $offset, $pagesize, '@weight desc');
                                $totalnums = $res['total'];
                                //如果结果不为空
                                if(!empty($res['matches'])) {
                                        $result = $res['matches'];
                                }
                        } else {
                                
                                $sql = "`siteid`= '$siteid' $sql_tid $sql_time AND `data` like '%$q%'";
                                

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

                                if(!empty($commend['id'])) {
                                        if($commend['typeid']) $sids[$commend['typeid']][] = $commend['id'];
                                }
                                $model_type_cache = getcache('type_model_'.$siteid,'search');
                $model_type_cache = array_flip($model_type_cache);
                $data = array();
                foreach($sids as $_k=>$_val) {
                    $tid = $_k;
                                    $ids = array_unique($_val);

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

                                    //是否读取其他模块接口
                                    if($modelid) {
                                            $this->content_db->set_model($modelid);
                                        
                                            /**
                                            * 如果表名为空,则为黄页模型
                                            */
                                            if(empty($this->content_db->model_tablename)) {
                                                    $this->content_db = pc_base::load_model('yp_content_model');
                                                    $this->content_db->set_model($modelid);

                                            }
                        $datas = $this->content_db->select($where, '*');
                    }
                    $data = array_merge($data,$datas);
                }
                $pages = $this->db->pages;
                $totalnums = $this->db->number;
            
                //如果分词结果为空
                if(!empty($segment_q)) {
                    $replace = explode(' ', $segment_q);
                    foreach($replace as $replace_arr_v) {
                        $replace_arr[] =  '<font color=red>'.$replace_arr_v.'</font>';
                    }
                    foreach($data as $_k=>$_v) {
                        $data[$_k]['title'] = str_replace($replace, $replace_arr, $_v['title']);
                        $data[$_k]['description'] = str_replace($replace, $replace_arr, $_v['description']);
                    }
                } else {
                    foreach($data as $_k=>$_v) {
                        $data[$_k]['title'] = str_replace($q, '<font color=red>'.$q.'</font>', $_v['title']);
                        $data[$_k]['description'] = str_replace($q, '<font color=red>'.$q.'</font>', $_v['description']);
                    }
                }
                        }
                        $execute_time = execute_time();
                        $pages = isset($pages) ? $pages : '';
                        $totalnums = isset($totalnums) ? $totalnums : 0;
                        //$data = isset($data) ? $data : '';
                        $datas = array();
                        $datas = $data;
                        
                        include        template('search','list');
                } else {
                        include        template('search','index');
                }
        }

        
        public function public_get_suggest_keyword() {
                $url = $_GET['url'].'&q='.$_GET['q'];
                $trust_url = array('c8430fcf851e85818b546addf5bc4dd3');
                $urm_md5 = md5($url);
                if (!in_array($urm_md5, $trust_url)) exit;
                
                $res = @file_get_contents($url);
                if(CHARSET != 'gbk') {
                        $res = iconv('gbk', CHARSET, $res);
                }
                echo $res;
        }
        
        /**
         * 提示搜索接口
         * TODO 暂时未启用,用的是google的接口
         */
        public function public_suggest_search() {
                //关键词转换为拼音
                pc_base::load_sys_func('iconv');
                $pinyin = gbk_to_pinyin($q);
                if(is_array($pinyin)) {
                        $pinyin = implode('', $pinyin);
                }
                $this->keyword_db = pc_base::load_model('search_keyword_model');
                $suggest = $this->keyword_db->select("pinyin like '$pinyin%'", '*', 10, 'searchnums DESC');
                
                foreach($suggest as $v) {
                        echo $v['keyword']."\n";
                }                
        }
}
?>


调用方法:

在phpcms/default/search/header.html模板上面找到以下代码:

<input type="hidden" name="typeid" value="{$typeid}" id="typeid"/>


替换以下代码:
<input type="hidden" name="typeid" value="0" id="typeid"/>


这样默认就是搜索全站了!


如果对phpcms搜索样式不满意,可以在phpcms/default/search/下修改模版的样式。

忙活了大半天,体验一下本站的站内搜索,看看怎么样?现在搜索页面的样式修改的还不太满意,改天在静下心来好好改改。

文章关键词:phpcms v9 全文搜索


网站建设

PHP为什么会成为建站的主...
  目前网站建设...

织梦cms PHPcms 帝国cms比较
现在建网站不需要...

什么是互联网能力?
互联网能力就是利...

为什么要建网站?
为什么要建网站?...

怎样选择建站公司?
网站建设公司很多...

什么是互联网思维?
什么是互联网思维...

换域名后,phpcms评论排...
最近新换了域名,...

phpcms全文搜索的解决办法
phpcms v9自带的...

谷歌浏览器为什么比其它...
谷歌chrome浏览器...

统治了16年的HTTP1.1协议升级2.0
HTTP超文本传输协...

互联网的发展引发的社会变化
互联网起源于电脑...

photoshop常用的图片处理方法
在网站后台发布信...