MySQL搜索组或字符串中的特定单词

时间:2019-06-04 06:22:14

标签: mysql sql

我有产品。客户希望产品名称像“ Lenovo Vibe C2的玻璃保护器”,而用户搜索“ C2的玻璃保护器”以显示产品。我在建立具有类似条件的查询,但它只能使用“玻璃保护器”或“ vibe c2”之类的单词,而只能使用连续的单词...

以下是查询:

$query = Product::find()->joinWith('translation')->joinWith('cats')->joinWith('cats.page')->joinWith('cats.page.parent')->where($whereString);
$whereString .= " AND ( 
                        (
                            product_cat.page_id = '" . $_GET['product_cat'] . "' 
                            OR 
                            parent.id = '" . $_GET['product_cat'] . "' 
                            ) 
                            AND 
                            (
                                page_title LIKE '%" . $_GET['search'] . "%' 
                                OR
                                short_description LIKE '%" . $_GET['search'] . "%'  
                                OR 
                                key_words LIKE '%" . $_GET['search'] . "%'      
                                )
                            )";

产品的标题是:“联想Vibe C2的玻璃保护膜”

用户搜索“玻璃保护器” =>一切正常,产品显示出来。

但是,当用户搜索“玻璃保护器C2” =>时,什么都没有显示……数据库中没有此产品。

2 个答案:

答案 0 :(得分:2)

一种解决方案是创建一个搜索,该搜索使用正则表达式将搜索字符串分解为带有通配符的单个单词。

SELECT * FROM some_table
WHERE page_title REGEXP CONCAT('.*', REPLACE('Glass protector C2', ' ', '.*'), '.*')

因此,这将需要对所有3列进行,当然,硬编码的搜索字符串将替换为查询中使用的变量

答案 1 :(得分:0)

您可能应该使用全文搜索来实现此目的,因为like运算符不是针对您要运行的查询类型而构建的。

您首先需要在要搜索的列上创建全文索引。
在您的示例中,索引创建命令如下所示-

ALTER TABLE Product
ADD FULLTEXT(page_title, short_description,…)

创建索引后,您可以使用全文搜索来查询它,在您的示例中,正确的选择可能是布尔布尔全文搜索。
您可以像这样-

SELECT * FROM Product WHERE MATCH (page_title, short_description)
    AGAINST ('+vibe +c2' IN BOOLEAN MODE);

您可以查找文档以获取更多参考-https://dev.mysql.com/doc/refman/8.0/en/fulltext-boolean.html