我有产品。客户希望产品名称像“ 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” =>时,什么都没有显示……数据库中没有此产品。
答案 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