带评级的CakePHP全文搜索MySQL

带评级的CakePHP全文搜索MySQL,cakephp,cakephp-2.0,Cakephp,Cakephp 2.0,我已经读到,为了能够对搜索结果进行排名,您可以这样查询MySQL: SELECT * , MATCH (title, body) AGAINST ('$search') AS rating FROM posts WHERE MATCH (title, body) AGAINST ('$search') ORDER BY rating DESC 在CakePHP2.X中有没有实现这一点的方法? 此外,我需要在分页的同时执行此操作。所以我认为我需要为分页器编写条件,而不是直接的“查询” 谢

我已经读到,为了能够对搜索结果进行排名,您可以这样查询MySQL:

SELECT * , 
MATCH (title, body) AGAINST ('$search') AS rating 
FROM posts 
WHERE MATCH (title, body) AGAINST ('$search') 
ORDER BY rating DESC
在CakePHP2.X中有没有实现这一点的方法? 此外,我需要在分页的同时执行此操作。所以我认为我需要为分页器编写条件,而不是直接的“查询”


谢谢你的帮助

好吧,我花了一些时间。。。由于关键问题是获得结果匹配的评级,因此此查询中复杂的部分是特定字段:

将(标题、正文)与(“$search”)匹配作为评级

我想我应该把这个字段写在分页数组的“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实现真正搜索结果的最佳方法。除非有人有更好的选择:)


在双引号之间搜索短语将得到预期的结果

我使用了Thomas(谢谢)的上述数据库调用,它确实可以无缝地工作

然而,守则:

'conditions' =>  "MATCH(SearchIndex.data) AGAINST('$q' IN BOOLEAN MODE)",
删除数据抽象层并打开站点以进行SQL注入

它可能不太好(尚未完全测试),但请尝试:


我希望这在某种程度上有所帮助。

像这样使用它也会阻止mysql注入

array("MATCH(User.current_position) AGAINST(? IN BOOLEAN MODE)" => $srch_arr['text'])

请参阅注释,没有进一步的保护(从上下文中不清楚),这将打开SQL注入()的应用程序。您可能需要考虑对虚拟字段进行评级。这样,它将位于SearchIndex数组中$这->搜索索引->虚拟字段['rating']=“将(SearchIndex.data)与(“$q.”)匹配”;请改进您的答案并修复sql注入
array("MATCH(User.current_position) AGAINST(? IN BOOLEAN MODE)" => $srch_arr['text'])