前段时间写了emlog搜索功能添加全文搜索功能:https://www.mmuaa.com/post-215.html
但是效果并不是很好,比如搜索python的时候,一些与python无关,只是在文中提到一下,在搜索中就会被排序到上面。
我们想要解决的是,希望标题中出现关键字的文章排在上面,文章中出现的关键字排在下面。
下面使用sql的union+临时表方法解决这一问题:
SELECT * FROM
(SELECT gid,title FROM emlog_blog WHERE title LIKE '%python%' ORDER BY date DESC) t3
UNION
SELECT * FROM
(SELECT gid,title FROM emlog_blog WHERE content LIKE '%python%' ORDER BY date DSC) t4
但是emlog函数拼接sql语句的时候,逻辑似乎是写死的,修改起来比较麻烦,所以去掉了ORDER排序,变成这样:
select gid,title from blog_blog where (title like '%python%')
union select gid,title from blog_blog where (content like '%python%')
union select gid,title from blog_blog where (excerpt like '%python%');
好了。正文开始:
修改方法为:
将原来的/emlog/lib/controller/search_controller.php文件中,$sqlSegment那一行修改为:
$sqlSegment = "and (title like '%{$keyword}%' or content like '%{$keyword}%' or excerpt like '%{$keyword}%') order by date desc";
(因为emlog结构的问题,不能改变查询数目的sql语句逻辑)
接着找到这一句:
$logs = $Log_Model->getLogsForHome($sqlSegment, $page, $index_lognum);
在这一句的前面添加:
$sqlSegment = "and (title like '%{$keyword}%') union (SELECT * FROM " . DB_PREFIX . "blog WHERE type='blog' and hide='n' and checked='y' and (content like '%{$keyword}%' or excerpt like '%{$keyword}%'))";
(这一句用来查询文章)
OK,现在试一试,是不是达到预期效果了
P.S.:使用以上方式请备份文件。由于使用了union查询,搜索功能的查询效率会比之前的文章慢一倍,其他无影响。