官方搜索插件改进教程

@百晓生 5月前 1665

官方的搜索插件说实话,搜索安全但是搜索效率太低,不能多个关键词匹配。我在自己网站搜索老帖子经常出现输入2个关键词搜不到的情况,只输入1个关键词吧内容又太多,搜索的不够准确!后来看了一下搜索源码,难怪,输入多个空格的词最终还是当一个词搜索的,这就尴尬了。

比如:

搜索此帖输入“xiuno pc”是搜索不到此帖的,那怎么才可以搜索到此帖呢,只能输入“xiuno侧重”,那想输入“xiuno pc”能搜索此帖有没有办法呢?答案是:必须有!

打开搜索文件xn_search\route\search.php,然后我使用的是like搜索类型,添加和修改以下代码

		foreach($keyword_arr as $key => $cond_val){
			$cond_sql .= ($range == 1?"subject":"message")." LIKE '%$cond_val%'";
			if($key != count($keyword_arr) - 1)$cond_sql .= ' AND ';
		}

注意2个小圈圈的要替换成新的SQL语句

最终搜索效果图

这样就可以多关键词匹配到结果了。可能效率会降低,但是总比搜不到自己想要的结果要好的多吧,再者,我们的论坛都是建了索引的,就算你有10W条数据也是秒查找,不影响!

在下PHP新手,MYSQL也仅略会用,有更高效率的可以留帖大家互相学习,探讨……

在下网站https://www.it72.com,欢迎来访!

最新回复 (26)
  • 参观者 5月前
    引用 2
    沙发,收藏了
  • oliolo 5月前
    引用 3
    必须收藏
  • 求不得 5月前
    引用 4
    模糊查询比精确查询更有效率,因为有时候只会记个大概,想搜却匹配不上合适的关键字。
  • ༺凨影༻ 5月前
    引用 5
    精神很值得表扬,不过两个关键词必须是帖子标题都有包含的,否则和输入完整标题无异。
  • @百晓生 5月前
    引用 6
    ༺凨影༻ 精神很值得表扬,不过两个关键词必须是帖子标题都有包含的,否则和输入完整标题无异。

    想多了兄弟,按你说的搜索标题无关的内容也出来(或者说是意思相近的),那不是一大堆无用的结果?好比输入123,给你一堆456,789的结果,岂不是很尴尬……
    搜索就是为模糊并精确的查找想要的结果。
    倒是可以出个根据网站标题或内容生成一些提示的插件,根据首关键字自动出提示,那就厉害了。

  • ༺凨影༻ 5月前
    引用 7
    @百晓生 ༺凨影༻ 精神很值得表扬,不过两个关键词必须是帖子标题都有包含的,否则和输入完整标题无异。 想多了兄弟,按你说的搜索标题无关的内容也出来(或者说是意思相近的), ...
    其实可以多做一个判断或者设置,自行选择,是模糊查找还是精确查找;
    或者前台可以对搜索结果进行精确查找的筛选;大致思路是这样的。
  • 515138 5月前
    引用 8
    支持一下。
  • 我们结婚吧 5月前
    引用 9
    aaa 打脸了多少人,感谢分享!
    你确定这代码能用?改了后索结果404
  • 123456 5月前
    引用 10
    我们结婚吧 你确定这代码能用?改了后索结果404
    可以用 我试了,你可能改错了
  • 我们结婚吧 5月前
    引用 11
    123456 可以用 我试了,你可能改错了
    把你改完的页面上传附件来参考下,改了后搜索结果404。
  • George 5月前
    引用 12
    啥也不说  先赞一波
  • 我对修罗的搜索已经没报希望了
    以前用的XUNSEARCH 现在用的阿里云的开放搜索, xunsearch 中文搜索效果是真的好,英文就不行了,太垃圾了了,现在开放搜索 中文英文都一般般吧,不过比自带的搜索 好多了
  • @百晓生 5月前
    引用 14
    我们结婚吧 把你改完的页面上传附件来参考下,改了后搜索结果404。
    	} elseif($search_type == 'like') {
    		$cond_sql = '';
    		foreach($keyword_arr as $key => $cond_val){
    			$cond_sql .= ($range == 1?"subject":"message")." LIKE '%$cond_val%'";
    			if($key != count($keyword_arr) - 1)$cond_sql .= ' AND ';
    		}
    		if($range == 1) {
    			$threadlist = db_sql_find("SELECT * FROM bbs_thread WHERE $cond_sql LIMIT 50;");
    			$threadlist = arrlist_multisort($threadlist, 'tid', FALSE);
    			foreach($threadlist as &$thread) {
    				thread_format($thread);
    				$thread['subject'] = search_keyword_highlight($thread['subject'], $keyword_arr);
    			}
    		} else if($range == 0) {
    			$posts = 0;
    			$postlist = db_sql_find("SELECT * FROM bbs_post WHERE $cond_sql LIMIT 50;");
    			$postlist = arrlist_multisort($postlist, 'pid', FALSE);
    			foreach($postlist as &$post) {
    				post_format($post);
    				$post['message_fmt'] = search_message_format($post['message_fmt']);
    				$post['message_fmt'] = search_keyword_highlight($post['message_fmt'], $keyword_arr);
    				$post['filelist'] = array();
    				$post['floor'] = 0;
    				$thread = thread_read_cache($post['tid']);
    				$post['subject'] = search_keyword_highlight($thread['subject'], $keyword_arr);
    			}
    		}
    		
    	} elseif($search_type == 'site_url') {

    替换146~174行代码

  • senlo 5月前
    引用 15
    感谢分享!
  • 我们结婚吧 5月前
    引用 16
    @百晓生 } elseif($search_type == 'like') { $cond_sql ...
    清除缓存后可以用了,谢谢。
  • Jayden 5月前
    引用 17
    不错
  • 泥人传说 4月前
    引用 18
    这个站内搜索本来就不合理,搜索的结果不是根据关键词的配置度来显示的~~~~~
  • 泥人传说 4月前
    引用 19
    @百晓生 ༺凨影༻ 精神很值得表扬,不过两个关键词必须是帖子标题都有包含的,否则和输入完整标题无异。 想多了兄弟,按你说的搜索标题无关的内容也出来(或者说是意思相近的), ...
    那就搜索联想功能,你在搜索框里面输入内容的时候智能联想提示一些相关的关键词,选择后回车即可!!!
  • 泥人传说 4月前
    引用 20
    那叫搜索联想功能,你在搜索框里面输入内容的时候智能联想提示一些相关的关键词,选择后回车即可!!!
  • 泥人传说 4月前
    引用 21
    试了一下,你这个搜索的结果配置度也不行啊!!!~~~~~对这个程序也是醉了~~~~~
  • oliolo 2月前
    引用 22


    楼主您好,这个怎么解决啊? 会出现搜到代码情况

  • @百晓生 2月前
    引用 23

    刚上来就看到你这个问题,这个问题问的好啊!

    查了一下代码,发现高亮模块有问题。多个关键字高亮存在span标签里面就会重新高亮替换。只要过滤一下span即可。

    搜索插件高亮search.func.php代码更新一下。

    function search_keyword_highlight($s, $keyword_arr) {
        foreach($keyword_arr as $key => $keyword) {
            if($key >= 1){
                $chunks = preg_split('/(<span.*?\/span>)/ms', $s, - 1, PREG_SPLIT_DELIM_CAPTURE);
                foreach ($chunks as $c) {
                    if (strpos($c, '<span') !== 0){
                        $tmp = $c;
                        $c = str_ireplace($keyword, '<span class="text-danger">'.$keyword.'</span>', $c);
                        $s = str_ireplace($tmp, $c, $s);
                    }
                }
            }else{
                $s = str_ireplace($keyword, '<span class="text-danger">'.$keyword.'</span>', $s);
            }
        }
        return $s;
    }


    最后于 2月前 被@百晓生编辑 ,原因:
  • @百晓生 2月前
    引用 24
    不过关键字太多,并且太短会严重影响服务器CPU开销。可以优化一下。关键字组合上限3,长度2以上
  • @百晓生 2月前
    引用 25


    官网居然也有这种问题,哈哈……

  • horse320 2月前
    引用 26
    这个帖子必须赞!!
  • axiuno 2月前
    引用 27
    nice
返回
发新帖