带评级的CakePHP全文搜索MySQL
我已经读到,为了能够对搜索结果进行排名,您可以这样查询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中有没有实现这一点的方法? 此外,我需要在分页的同时执行此操作。所以我认为我需要为分页器编写条件,而不是直接的“查询” 谢
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'])