马上注册,免费下载更多dz插件网资源。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
Discuz使用阿里云NLP分词进行全站及第三方插件穿透智能语义搜索增加评分模型算法实现discuz智能关联搜索算法增强实现方法:
基于以下插件,不改变、不破坏原有插件搜索逻辑,引入 在聚合层引入统一“相关性评分 + 排序”的评分模型:
Discuz! 全站含第三方插件智能聚合搜索插件
https://www.dz-x.net/t/160696/1/1.html
来自: DZ插件网
最终实现搜索效果关联性提升演示:
可可素材插件(keke_down)穿透搜索效果:👉 点此体验~
可可文库插件(keke_doc)穿透搜索效果:👉 点此体验~
可可网校插件(keke_video_base)穿透搜索效果:👉 点此体验~
盒子素材资源插件(one_market)穿透搜索效果:👉 点此体验~
不改动数据库表结构,不改动各业务插件表结构,仅通过 PHP 层做“打分 + 排序” 来提升相关性。
实现“标题权重 > 摘要 > 正文”、“短词精确匹配优先”、“多词命中叠加”等搜索体验指标。
不用大概插件,仅需要在核心模块文件:
为扩展搜索核心增加一个统一评分函数:
查找:
在其下行新增:
- // 统一确保关键词为数组
- $keywords = is_array($keywords) ? $keywords : (array)$keywords;
复制代码 查找:
- self::merge_result($allList, $fidnum, $ret, $fid);
复制代码 替换为:
- self::merge_result($allList, $fidnum, $ret, $fid, $searchtxt, $keywords);
复制代码 查找:
- self::merge_result($allList, $fidnum, $ret, $fid);
复制代码 替换为:
- self::merge_result($allList, $fidnum, $ret, $fid, $searchtxt, $keywords);
复制代码 查找:
- self::merge_result($allList, $fidnum, $ret, $fid);
复制代码 替换为:
- self::merge_result($allList, $fidnum, $ret, $fid, $searchtxt, $keywords);
复制代码 查找:
- self::merge_result($allList, $fidnum, $ret, $fid);
复制代码 替换为:
- self::merge_result($allList, $fidnum, $ret, $fid, $searchtxt, $keywords);
复制代码 由“按 dateline 倒序”改为“按 _score 降序 + dateline 倒序兜底”:
查找:【约135~138行】
- usort($allList, function($a, $b){
- if($a['dateline'] == $b['dateline']) return 0;
- return ($a['dateline'] > $b['dateline']) ? -1 : 1;
- });
复制代码 替换为:【算法引入】
- // ============================
- // 相关性排序(引入评分关联算法)
- // 1. 优先按 _score 降序
- // 2. 若得分相同,再按 dateline 倒序
- // ============================
- if(!empty($allList) && is_array($allList)) {
- usort($allList, function($a, $b) {
- $sa = isset($a['_score']) ? floatval($a['_score']) : 0;
- $sb = isset($b['_score']) ? floatval($b['_score']) : 0;
- if($sa == $sb) {
- $da = isset($a['dateline']) ? intval($a['dateline']) : 0;
- $db = isset($b['dateline']) ? intval($b['dateline']) : 0;
- if($da == $db) {
- return 0;
- }
- return ($da > $db) ? -1 : 1;
- }
- return ($sa > $sb) ? -1 : 1;
- });
- }
复制代码 为每条结果计算 _score 字段:
查找:【约151~172行】
- protected static function merge_result(&$allList, &$fidnum, $ret, $target_fid = 0) {
- if(empty($ret) || empty($ret['list'])) {
- return;
- }
- foreach($ret['list'] as $row) {
- $fid = intval($row['fid']);
-
- // 始终记录统计
- if(!isset($fidnum[$fid])) {
- $fidnum[$fid] = array('num' => 0, 'fname' => $row['fname']);
- }
- // 累加数量
- $fidnum[$fid]['num']++;
- // 2. 根据过滤条件决定是否加入显示列表 (Fix: 解决结果混杂问题)
- // 如果 target_fid 为 0 (搜全部),则全部加入
- // 如果 target_fid 等于当前行 fid,则加入
- if ($target_fid == 0 || $target_fid == $fid) {
- $allList[] = $row;
- }
- }
- }
复制代码 替换为:
- protected static function merge_result(&$allList, &$fidnum, $ret, $target_fid = 0, $searchtxt = '', $keywords = array()) {
- if(empty($ret) || !isset($ret['list']) || !is_array($ret['list']) || empty($ret['list'])) {
- return;
- }
- $keywords = is_array($keywords) ? $keywords : (array)$keywords;
- foreach($ret['list'] as $row) {
- if(!isset($row['fid'])) {
- continue;
- }
- $fid = intval($row['fid']);
- // 1. 始终记录分类统计(保证 Tab 数字完整)
- if(!isset($fidnum[$fid])) {
- $fidnum[$fid] = array(
- 'num' => 0,
- 'fname' => isset($row['fname']) ? $row['fname'] : '',
- );
- }
- $fidnum[$fid]['num']++;
- // 2. 根据过滤条件决定是否加入当前显示列表
- if($target_fid == 0 || $target_fid == $fid) {
- // 计算相关性评分(标题/摘要/标签 + 时间 + 浏览量)
- $row['_score'] = self::calc_score($row, $searchtxt, $keywords);
- $allList[] = $row;
- }
- }
- }
复制代码 重点来了,整个核心算法引擎:
- 在 getcwords() 的返回 data 中,通过 AliNLP 的字段(例如 tf/idf,或 type/pos/score 字段)生成一个简化的 weight;
- 在 validwords() 中保留一份“词 + 权重”的结构,传入扩展搜索层;
- 在 calc_score() 中,将 AliNLP 提供的权重作为额外系数(例如长名词、实体词得分稍高)
查找:
- protected static function build_like_where($columns, $keywords) {
复制代码 在其上行新增:
通过以上算法核心,实现:
- 在 search_all() 和 merge_result() 里插入了相关性打分逻辑:
- 标题命中原始搜索词 > 标题命中分词关键词 > 摘要 > 标签;
- 多关键词命中叠加;
- 加入适度的浏览量和时间衰减因子;
在原有阿里云NLP分词算法基础上引入的增强算法最终效果体验:实测演示效果:点此体验!
该搜索算法现全套插件分享:
DZ阿里云NLP智能语义全站聚合搜索[多插件组合套餐 支持全站聚合插件内容支持可可素材可可文库可可网校素材资源插件内容穿透搜索]
https://www.dz-x.net/t/160696/1/1.html
来自: DZ插件网
后续如果有对该插件逻辑有兴趣的,比如加入搜索性能和更多算法引入,可以加群讨论:https://jq.qq.com/?_wv=1027&k=xWSYC8tG
©DZ插件网所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 本站内容为站长个人技术研究记录或网络,不提供用户交互功能,所有内容版权归原作者所有。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,得到更好的正版服务。 您在本站任何的赞助购买、下载、查阅、回复等行为等均表示接受并同意签订《DZ插件网免责声明协议》。 如有侵权请邮件与我们联系处理: discuzaddons@vip.qq.com 并出示相关证明以便删除。敬请谅解!
|
最后回复时间:2025-11-27 20:50:26社区官方发言人回复了此贴
|