在MySQL和CodeIgniter中使用Match和Against

时间:2012-08-01 15:02:18

标签: php mysql codeigniter full-text-indexing match-against

我正在尝试在我的codeIgniter项目中实现搜索功能。我有一个名为product_search的表,我使用以下命令设置全文索引:

ALTER TABLE `product_search` ADD FULLTEXT (`prod_title`, `prod_desc`)

然后我使用以下codeIgniter代码搜索它:

$this->db->select("prod_id");
$this->db->where("MATCH (`prod_title`, `prod_desc`) AGAINST ('{$searchStr}')");
$this->db->or_where("prod_id LIKE '%{$searchStr}%'");
$this->db->or_where("prod_sku LIKE '%{$searchStr}%'");
$this->db->or_where("prod_title LIKE '%{$searchStr}%'");
$this->db->or_where("prod_desc LIKE '%{$searchStr}%'");

$query = $this->db->get("product_search");

然而,这会导致以下错误:

  

错误号码:1064

     

您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在'AGAINST('silk')附近使用正确的语法或prod_id LIKE'%silk%'或prod_sku LIKE'%silk%'或`刺激第3行

     

SELECT prod_id FROM(product_search)WHERE MATCHprod_titleprod_desc)AGAINST('silk')或prod_id LIKE' %silk%'或prod_sku LIKE'%silk%'或prod_title LIKE'%silk%'或prod_desc LIKE'%silk%'

     

文件名:models / products_model.php

     

行号:430

为什么要在MATCH周围加上反击?

如果我删除了MATCH和它后面的括号之间的空格,那么我收到以下错误信息:

  

错误号码:1191

     

找不到与列列表匹配的FULLTEXT索引

     

SELECT prod_id FROM(product_search)WHERE MATCH(prod_titleprod_desc)AGAINST('silk')或prod_id LIKE'%silk%'或prod_sku LIKE'%silk%'或prod_title LIKE'%silk%'或prod_desc LIKE'%silk%'

     

文件名:models / products_model.php

     

行号:430

但是,我使用top命令添加全文索引。 出了什么问题?

1 个答案:

答案 0 :(得分:4)

我通过添加IN BOOLEAN MODE来解决问题,如下所示:

SELECT `prod_id`
FROM (`product_search`)
WHERE MATCH (`prod_title`, `prod_desc`) AGAINST ('silk' IN BOOLEAN MODE)
OR `prod_id` LIKE '%silk%' OR `prod_sku` LIKE '%silk%'
OR `prod_title` LIKE '%silk%'
OR `prod_desc` LIKE '%silk%';