2

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

SELECT * , 
MATCH (title, body) AGAINST ('$search') AS rating 
FROM posts 
WHERE MATCH (title, body) AGAINST ('$search') 
ORDER BY rating DESC

在 CakePHP 2.X 中有没有办法做到这一点?另外,我需要在分页的同时执行此操作。所以我认为我需要为分页器编写条件,而不是直接的“查询”。

谢谢你的帮助!

4

3 回答 3

3

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

array("MATCH(User.current_position) AGAINST(? IN BOOLEAN MODE)" => $srch_arr['text'])
于 2015-03-06T07:56:14.430 回答
2

好的,我花了一些时间......因为关键问题是对结果匹配进行评分,所以这个查询中复杂的部分是特定字段:

MATCH (title, body) AGAINST ('$search') AS rating

我想我应该只在分页数组中的“字段”选项中写入该字段。结果代码如下:

    $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 实现真实搜索结果的最佳方式。除非有人有更好的选择:)

在双引号之间搜索短语将为您提供应有的结果!

于 2012-05-31T08:14:42.777 回答
2

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

但是代码:

'conditions' =>  "MATCH(SearchIndex.data) AGAINST('$q' IN BOOLEAN MODE)",

删除数据抽象层并打开您的站点以进行 SQL 注入。

它可能不太好(还没有完全测试过),但试试:

'SearchIndex.data LIKE'=>'%'.$search.'%'

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

于 2013-12-02T10:54:49.917 回答