最简单实现 实现分词搜索功能 实现真正模糊搜索

迅睿框架 更新 2025-10-24 16:39:56 Swlts

搜索实现分词搜索功能


实现原理:

如 “装修二级” 拆分为 “装”“修”“二”“级”,只要目标内容包含这几个字即可匹配,无需考虑顺序和同义词。



找到搜索文件  /dayrui/App/Module/Models/Search.php  

大约187行 注释掉下面这个代码

        // 关键字匹配条件
        if ($param['keyword'] != '') {
            $temp = [];
            $sfield = explode(',', $this->module['setting']['search']['field'] ? $this->module['setting']['search']['field'] : 'title,keywords');
            $search_keyword = explode('|', addslashes((string)$param['keyword']));
            foreach ($search_keyword as $kw) {
                $is = 0;
                if ($sfield) {
                    foreach ($sfield as $t) {
                        if ($t && dr_in_array($t, $field)) {
                            $is = 1;
                            $temp[] = $this->module['setting']['search']['complete'] ? '`'.$table.'`.`'.$t.'` = \''.$kw.'\'' : '`'.$table.'`.`'.$t.'` LIKE \'%'.$kw.'%\'';
                        }
                    }
                }
                if (!$is) {
                    $temp[] = $this->module['setting']['search']['complete'] ? '`'.$table.'`.`title` = \''.$kw.'\'' : '`'.$table.'`.`title` LIKE \'%'.$kw.'%\'';
                }
            }
            $where['keyword'] = $temp ? '('.implode(' OR ', $temp).')' : '';
            $param_new['keyword'] = $search_keyword;
        }



然后下面增加 

    // 关键字匹配条件(分词搜索:拆分单个字符,匹配所有字符)
    if ($param['keyword'] != '') {
        $temp = [];
        $sfield = explode(',', $this->module['setting']['search']['field'] ? $this->module['setting']['search']['field'] : 'title,keywords');
        $original_kw = addslashes((string)$param['keyword']);
        
        // 拆分关键词为单个字符(支持汉字)
        $chars = [];
        $length = mb_strlen($original_kw, 'UTF-8');
        for ($i = 0; $i < $length; $i++) {
            $char = mb_substr($original_kw, $i, 1, 'UTF-8');
            // 过滤空字符和特殊符号
            if ($char && preg_match('/[\p{Han}\d]/u', $char)) {
                $chars[] = $char;
            }
        }
        
        // 如果有有效字符则构建条件
        if (!empty($chars)) {
            foreach ($chars as $char) {
                $char_conditions = [];
                // 对每个搜索字段添加包含当前字符的条件
                if ($sfield) {
                    foreach ($sfield as $t) {
                        if ($t && dr_in_array($t, $field)) {
                            $char_conditions[] = '`'.$table.'`.`'.$t.'` LIKE \'%'.$char.'%\'';
                        }
                    }
                }
                // 如果没有指定字段,默认用title
                if (empty($char_conditions)) {
                    $char_conditions[] = '`'.$table.'`.`title` LIKE \'%'.$char.'%\'';
                }
                // 每个字符必须至少匹配一个字段(用OR连接字段,用AND连接不同字符)
                $temp[] = '('.implode(' OR ', $char_conditions).')';
            }
            // 所有字符条件用AND连接(必须包含所有字符)
            $where['keyword'] = $temp ? '('.implode(' AND ', $temp).')' : '';
        }
        $param_new['keyword'] = $original_kw;
    }



既可以实现分词搜索。

方案

迅睿系统漏洞

GeoSeo收录宝
GeoSeo收录宝(2026-09-01)
升级 ai智能发布功能 升级 支持8国语言后端设置和前端输出功能 ...
Word发布批量上传
Word发布批量上传(2026-08-31)
版本覆盖问题重发
多语言翻译Seolang
多语言翻译Seolang(2026-08-31)
新增 LLM 大模型对话翻译模块 配置层强类型化重构 URL 模...
自定义存储
自定义存储(2026-08-30)
同步服务器端通用版实现,统一管理端、CMS 端和浏览器直传的提示与错...
GeoSeo工具箱
GeoSeo工具箱(2026-08-29)
新增 bing推送 新增 IndexNow推送 新增 baidu...
外贸多语言建站
外贸多语言建站(2026-08-27)
新增阿里云专业版入口 新增阿里云自动识别字符格式
Querylist渐进式采集
Querylist渐进式采集(2026-08-26)
增加范围截取规则
实时任务
实时任务(2026-08-26)
补充并整理完整使用说明、历史版本更新日志,统一帮助页样式。