2

我正在尝试在我的 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 服务器版本相对应的手册,以在第 3 行的 'AGAINST ('silk') OR prod_idLIKE '%silk%' OR prod_skuLIKE '%silk%' OR 'prod'附近使用正确的语法

SELECT prod_idFROM ( product_search) WHERE MATCH( prod_title, prod_desc) AGAINST ('silk') OR prod_idLIKE '%silk%' OR prod_skuLIKE '%silk%' OR prod_titleLIKE '%silk%' OR prod_descLIKE '%silk%'

文件名:models/products_model.php

行号:430

为什么它在 MATCH 周围加上反引号?

如果我删除 MATCH 及其后面的括号之间的空格,则会收到以下错误消息:

错误号:1191

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

SELECT prod_idFROM ( product_search) WHERE MATCH( prod_title, prod_desc) AGAINST ('silk') OR prod_idLIKE '%silk%' OR prod_skuLIKE '%silk%' OR prod_titleLIKE '%silk%' OR prod_descLIKE '%silk%'

文件名:models/products_model.php

行号:430

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

4

1 回答 1

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%';
于 2012-08-02T11:15:11.510 回答