我有一个PHP / mySQL搜索功能,在$ keywords_search值中使用一个或多个关键字。问题是它匹配任何关键字,这意味着如果搜索完成,它返回的结果只包含“牛奶”或只是“啤酒”,如果有人搜索“牛奶啤酒”。如何更改它以使结果必须包含字符串中的所有关键字?
以下是代码:
$query[] = "((a.name REGEXP '( )*(" . str_replace(' ', ')*( )*(', $keywords_search) . ")( )*')
OR (a.description REGEXP '( )*(" . str_replace(' ', ')*( )*(', $keywords_search) . ")( )*'))";
非常感谢任何帮助!
答案 0 :(得分:1)
将关键字放入规范化的子表中会更好,这使得这些搜索变得微不足道。 MySQL的正则表达式匹配不允许您指定应该匹配的一系列替换中的多少,它只是告诉您是否有任何匹配。
e.g
SELECT count(*) AS cnt
FROM keywords
WHERE keyword IN ('a', 'b', 'c')
GROUP BY id
HAVING (cnt = 3)
只会显示任何特定ID都包含所有三个关键字的记录。
使用正则表达式版本和未规范化的字符串字段,您必须将关键字拆分为多个单独的正则表达式,并使用AND
链接它们
e.g。
SELECT ...
FROM ...
WHERE keyword REGEX ('keyword1') AND keyword REGEX ('keyword2') AND ....
答案 1 :(得分:0)
您可以使用关键字执行以下操作:
$keywords = array('key', 'word');
$keywordQuery = [];
foreach ($keywords as $keyword) {
$keywordQuery[] = "((a.name REGEXP '( )*({$keyword})( )*') AND (a.description REGEXP '( )*({$keyword})( )*'))";
}
$query = implode(' AND ', $keywordQuery);
比Regexp更好,如果可以的话,你也可以使用MySQL的全文搜索 - Boolean Full-Text Searches。