狂雨小说平台如何实现按关键词匹配度排序
狂雨小说平台算是一个比较好用的开源小说平台了,相信搭建小说网站的朋友都有所了解。但是该平台有一个比较难用的点是搜索功能,当你搜索一部小说的时候它默认是按更新时间排序的,关键词完全匹配上的小说反而排在很后面。比如,你搜索'斗罗大陆',结果搜索界面前几条全是‘斗罗大陆xxx’或者'xxx斗罗大陆',真正的'斗罗大陆'往往在很后面,使用体验非常不好。下面就演示一下如何实现狂雨小说平台按关键词匹配度排序和相关问题的解决思路,我下面实现的是按关键词长度排序,要按匹配度的话大家求一下关键词长度与目标key长度的绝对值来对比吧,思路是一样的。
第一步:添加排序代码
狂雨小说平台小说存储使用的mysql,在搜索小说时使用的就是mysql的排序语句了(order语句),首先找到主题模板下的search.html文件(目录在‘\template\home\’下),修改排序语句如下:
原句:{novel id="novel" limit="30" order="update_time desc" page="1"}
改为:{novel id="novel" limit="30" order="length(title) asc" page="1"}

第二步:解决‘排序表达式错误:length(title)’错误
排序代码添加好了,输入关键词搜索,发现报错:'排序表达式错误:length(title)‘。

这其实是源码作者为了mysql安全,特意匹配了输入的关键词,防止一些注入语句威胁网站安全,我们只需要在这个校验语句上放过符号'()'即可。
找到‘\thinkphp\library\think\db\’下的Builder.php文件,修改以下代码:
原句:preg_match('/^[\w\.]+$/', $key)
改为:preg_match('/^[\w\.()]+$/', $key)

第三步:解决'不支持的数据表达式:length(title)'错误
本以为可以了吧,点击搜索,发现又报错'不支持的数据表达式:length(title)'

这还是作者写的一个校验代码,我们依然只需要在这个校验语句上放过符号'()'即可。
找到‘\thinkphp\library\think\db\builder\’下的Mysql.php文件,修改以下代码:
原句:!preg_match('/^[\w\.\*]+$/', $key)
改为:!preg_match('/^[\w\.()\*]+$/', $key)

好啦,搜索结果就会以关键词长度从小到大排序啦。
解决思路:
1:找到搜索页面
2:找到排序语句,改为自己想要的排序语句
3:解决错误,思路是在源代码搜索报错信息,然后以打印日志等方法定位到报错行,然后就百度找解决方案啦!