刚才在看 WeCenter 2.2.2 的搜索相关的代码,感觉有点不合理。我把分析写出来,与大家讨论一下。
以发表问题时(高级模式)添加话题为例:
首先我们在输入框中输入关键字,然后 ajax 方法访问服务器,最后从服务器返回匹配结果。其中的关键代码是:
file: UPLOAD\models
// 代码1
public function search($q, $search_type, $limit = 20, $topic_ids = null) {
// 分析: q 是我们上传的关键字,$search_type 是 topic, $limit=10
// 其中对 $q 的处理是以空格为分割符,把关键字保存为一个数组,如果关键字长度为1就去除该关键字。。。
$q = (array)explode(' ', str_replace(' ', ' ', trim($q)));
foreach ($q AS $key => $val)
{
if (cjk_strlen($val) == 1)
{
unset($q[$key]);
}
}
// 接下去调用代码2了
}
// 代码2
// 从代码2看到它把关键字数组给合成一个字符串。。。。然后查询语句就是 LIKE '关键字%'
public function search_topics($q, $limit = 20)
{
if (is_array($q))
{
$q = implode('', $q);
}
if ($result = $this->fetch_all('topic', "topic_title LIKE '" . $this->quote($q) . "%'", null, $limit))
{
foreach ($result AS $key => $val)
{
if (!$val['url_token'])
{
$result[$key]['url_token'] = urlencode($val['topic_title']);
}
}
}
return $result;
}
// 最后,假设我们输入的关键字是: 求 深入浅出 C 语言 (第二版)
// 经过以上流程处理后最终查询的是 LIKE '深入浅出语言(第二版)%'
// 总结一下我认为不合理的地方:
// 1. 单个字被过滤导致像 C 这样的关键字丢失了。
// 2. 空格其实没做用了——最终会被代码过滤掉
// 3. 关键字必需从开头就符合,不如 LIKE '%关键字%'
// 当然以上是个理见解,欢迎指教。。
阅读全文
收起全文