无论是什么样的C人劝MYSQL全文搜索(拆分搜索短语和搜索每一个字),或全文搜索。
对于 “分裂的话” 的方法,我建议到:
- 使用正则表达式的分裂,像
preg_match_all('#[a-zA-Z0-9]+#', $text, $words)
;
您不需要 搜索“$”等符号,是吗?
- 编写一个函数,为您生成
where
子句。
功能产生where
条款可能是这样的:
function generateFilter(array $fields, array $words) {
// prepare $word for putting into SQL statement
foreach ($words as &$word) {
// ensure that wildcard characters are used as regular characters
$word = str_replace('%', '\\%', $word);
$word = str_replace('_', '\\_', $word);
// prevent SQL injections
$word = mysql_real_escape_string($word);
}
unset($word);
// generate filter
$filter = array();
foreach ($words as $word) {
$wordFilter = array();
foreach ($fields as $field) {
$wordFilter[] = "{$field} like '%$word%'";
}
$filter[] = implode(' or ', $wordFilter);
}
$filter = '(' . implode(') and (', $filter) . ')';
return $filter;
}
$filter = generateFilter(
array('name', 'surname', 'address'),
array('john', 'doe')
);
echo $filter;
结果:
(name like '%john%' or surname like '%john%' or address like '%john%') and
(name like '%doe%' or surname like '%doe%' or address like '%doe%')
如果使用准备好的语句(这是高度决定),此功能将是一个有点更复杂,因为结果字符串会占用变量的占位符,而$字将被放入必须绑定到预处理语句的一些变量数组中。
“拆分词”方法适用于小字符串和少量数据。如果您有大量数据和/或大字符串,请考虑使用全文搜索。它不需要分割搜索短语,尽管它有一些限制 - 它需要用于搜索的列上的全文索引(IIRC,您可以在多个列上创建索引,然后在所有索引列上同时使用全文搜索,即,您不必特别搜索每一列),它具有最小的关键字长度,并且可能会给出非严格的结果,例如,有时候结果中可能只会出现5个关键字中的3个。尽管它给出了每个结果的相关性 - 接近搜索项的结果将具有更高的相关性。这对按相关性排序结果非常有用。
虽然创建索引似乎是您的额外工作,但它将允许DBMS比没有索引更快地执行搜索。
用户 - 你可以试着描述一下吗?看起来'pname'是表'english'的一个字段,但PHP变量有什么用? '$ val','$ search','$ key_value' ?? – 2011-05-02 07:00:03
他们从形式的价值...感谢我实施了Gaurav查询及其工作。 – user734024 2011-05-02 07:18:09