CakePHP全文搜索MySQL评级

时间:2012-05-31 04:26:51

标签: 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

有没有办法在CakePHP 2.X中执行此操作? 此外,我需要在同时分页时执行此操作。所以我想我需要为paginator写条件,而不是直接'查询'。

感谢您的帮助!

3 个答案:

答案 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.'%'

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