给定:您在 ZF2 模型中有一个正常运行的子串搜索。您如何将其转变为全词搜索?
最佳答案
一种方法是在谓词表达式中使用 MySQL REGEXP 调用。
$select
是 Zend\Db\Sql\Select
的实例,$searchFor
是您的搜索词:
原始子字符串搜索可能使用这样的位置...
$select->where(array(
new Predicate\PredicateSet(
array(
new Zend\Db\Sql\Predicate\Like('tag', '%' . $searchFor . '%'),
new Zend\Db\Sql\Predicate\Like('title', '%' . $searchFor . '%'),
),
Zend\Db\Sql\Predicate\PredicateSet::COMBINED_BY_OR
),
));
...上面的全词版本是:
$select->where(array(
new Predicate\PredicateSet(
array(
new Zend\Db\Sql\Predicate\Expression("tag REGEXP '([[:<:]]" . $searchFor ."[[:>:]])'"),
new Zend\Db\Sql\Predicate\Expression("title REGEXP '([[:<:]]" . $searchFor ."[[:>:]])'"),
),
Zend\Db\Sql\Predicate\PredicateSet::COMBINED_BY_OR
),
));
注意这些是多字段搜索,所以我做了一个 PredicateSet::COMBINED_BY_OR
。我花了很长时间才停止在我的正则表达式中使用 \b
。希望这可以节省一些时间。
关于php - ZF2 - 用于全词搜索的 MySQL 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27709016/