我们想要解决的是,希望标题中出现关键字的文章排在上面,文章中出现的关键字排在下面。

下面使用sql的union+临时表方法解决这一问题:

  1. SELECT * FROM
  2. (SELECT gid,title FROM emlog_blog WHERE title LIKE '%python%' ORDER BY date DESC) t3
  3. UNION 
  4. SELECT * FROM
  5. (SELECT gid,title FROM emlog_blog WHERE content LIKE '%python%' ORDER BY date DSC) t4

但是emlog函数拼接sql语句的时候,逻辑似乎是写死的,修改起来比较麻烦,所以去掉了ORDER排序,变成这样:

  1. select gid,title from blog_blog where (title like '%python%') 
  2. union select gid,title from blog_blog where (content like '%python%') 
  3. union select gid,title from blog_blog where (excerpt like '%python%');

好了。正文开始:

修改方法为:

将原来的/emlog/lib/controller/search_controller.php文件中,$sqlSegment那一行修改为:

  1. $sqlSegment = "and (title like '%{$keyword}%' or content like '%{$keyword}%' or excerpt like '%{$keyword}%') order by date desc";

(因为emlog结构的问题,不能改变查询数目的sql语句逻辑)

接着找到这一句:

  1. $logs = $Log_Model->getLogsForHome($sqlSegment, $page, $index_lognum);

在这一句的前面添加:

  1. $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查询,搜索功能的查询效率会比之前的文章慢一倍,其他无影响。

转自:斐斐blog