我已经读过,为了能够对搜索结果进行排名,您可以像这样查询MySQL:
SELECT * ,
MATCH (title, body) AGAINST ('$search') AS rating
FROM posts
WHERE MATCH (title, body) AGAINST ('$search')
ORDER BY rating DESC
有没有办法在CakePHP 2.X中执行此操作? 此外,我需要在同时分页时执行此操作。所以我想我需要为paginator写条件,而不是直接'查询'。
感谢您的帮助!
答案 0 :(得分:3)
像这样使用它也会阻止mysql注入
array("MATCH(User.current_position) AGAINST(? IN BOOLEAN MODE)" => $srch_arr['text'])
答案 1 :(得分:2)
好的,我花了一些时间......因为,关键问题是对得到的匹配进行评级,此查询中的复杂部分是特定字段:
MATCH (title, body) AGAINST ('$search') AS rating
我想我应该在分页数组中的“field”选项中编写该字段。 结果代码如下:
$this->paginate = array(
'limit' => 15,
'fields' => array('*', "MATCH (data) AGAINST ('$q') AS rating"),
'conditions' => "MATCH(SearchIndex.data) AGAINST('$q' IN BOOLEAN MODE)",
'order' => array(
'rating' => 'desc',
),
);
$paginatedResults = $this->paginate('SearchIndex');
这无缝地发挥作用!
我认为这是使用Cake实现真实搜索结果的最佳方式。除非有人有更好的选择:)
在双引号之间搜索短语将为您提供您期望的结果!
答案 2 :(得分:2)
我已经使用了Thomas的上述数据库调用(谢谢),它可以无缝地工作。
然而代码:
'conditions' => "MATCH(SearchIndex.data) AGAINST('$q' IN BOOLEAN MODE)",
删除数据抽象层并打开您的站点以进行SQL注入。
它可能不太好(尚未完全测试),但请尝试:
'SearchIndex.data LIKE'=>'%'.$search.'%'
我希望这在某种程度上有所帮助。