1

我有一个 PHP / mySQL 搜索函数,它在值 $keywords_search 中使用一个或多个关键字。问题是它匹配任何关键字,这意味着如果搜索完成,它返回的结果要么只包含“牛奶”,要么只包含“啤酒”,如果有人搜索“牛奶啤酒”。如何更改它以使结果必须包含字符串中的所有关键字?

以下是代码:

$query[] = "((a.name REGEXP '( )*(" . str_replace(' ', ')*( )*(', $keywords_search) . ")( )*') 
OR (a.description REGEXP '( )*(" . str_replace(' ', ')*( )*(', $keywords_search) . ")( )*'))";

任何帮助是极大的赞赏!

4

2 回答 2

1

您最好将关键字放入规范化的子表中,这会使此类搜索变得微不足道。MySQL 的正则表达式匹配不允许您指定应匹配的一系列交替中的多少,它只是告诉您是否有任何匹配。

例如

SELECT count(*) AS cnt
FROM keywords
WHERE keyword IN ('a', 'b', 'c')
GROUP BY id
HAVING (cnt = 3)

只会显示任何特定 id 包含所有三个关键字的记录。

使用正则表达式版本和未规范化的字符串字段,您必须将关键字拆分为多个单独的正则表达式并将它们与AND

例如

SELECT ...
FROM ...
WHERE keyword REGEX ('keyword1') AND keyword REGEX ('keyword2') AND ....
于 2012-05-06T20:33:11.683 回答
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

于 2012-05-06T20:29:10.427 回答