2007/01 28
s9y默认的搜索是使用MySQL的全文检索,但他并不支持中文的搜索。不过英文搜索很强的,看一下下面来自MySQL manual的说明:
布尔全文搜索的性能支持以下操作符:

+
一个前导的加号表示该单词必须 出现在返回的每一行的开头位置。

-
一个前导的减号表示该单词一定不能出现在任何返回的行中。

(无操作符)
在默认状态下(当没有指定 + 或–的情况下),该单词可有可无,但含有该单词的行等级较高。这和MATCH() ... AGAINST()不使用IN BOOLEAN MODE修改程序时的运作很类似。

> <
这两个操作符用来改变一个单词对赋予某一行的相关值的影响。 > 操作符增强其影响,而 <操作符则减弱其影响。

( )
括号用来将单词分成子表达式。括入括号的部分可以被嵌套。

~
一个前导的代字号用作否定符, 用来否定单词对该行相关性的影响。 这对于标记“noise(无用信息)”的单词很有用。包含这类单词的行较其它行等级低,但因其可能会和-号同时使用,因而不会在任何时候都派出所有无用信息行。

*
星号用作截断符。于其它符号不同的是,它应当被追加到要截断的词上。

"
一个被括入双引号的短语 (‘"’) 只和字面上包含该短语输入格式的行进行匹配。全文引擎将短语拆分成单词,在FULLTEXT索引中搜索该单词。 非单词字符不需要严密的匹配:短语搜索只要求符合搜索短语包含的单词且单词的排列顺序相同的内容。例如, "test phrase" 符合 "test, phrase"。

若索引中不存在该短语包含的单词,则结果为空。例如,若所有单词都是禁用词,或是长度都小于编入索引单词的最小长度,则结果为空。



比如说,如果大家很讨厌rollenc而目前又想在这个blog上找subversion的资料。可以简单的搜索:+subversion -rollenc

既然不能全文检索不能支持中文,那么简单的LIKE总会吧,文章不多,所以,速度上面应该还可以接受。于是在/include/functions_entries.inc.php加上了几句,验证一下,是否是中文,是的话就使用LIKE,不是中文就使用强大的全文检索。
		if(preg_match("/^[\x80-\xff]+$/", $term))
		{
			$cond['find_part'] = "((e.title LIKE ('%" . addslashes($term) . "%')) or (e.body LIKE ('%" . addslashes($term) . "%')) or (e.extended LIKE ('%" . addslashes($term) . "%')))";
		}
		else
		{
			if (preg_match('@["\+\-\*~<>\(\)]+@', $term)) {
				$cond['find_part'] = "MATCH(title,body,extended) AGAINST('$term' IN BOOLEAN MODE)";
			} else {
				$cond['find_part'] = "MATCH(title,body,extended) AGAINST('$term')";
			}
		}

而替代以前的
			if (preg_match('@["\+\-\*~<>\(\)]+@', $term)) {
				$cond['find_part'] = "MATCH(title,body,extended) AGAINST('$term' IN BOOLEAN MODE)";
			} else {
				$cond['find_part'] = "MATCH(title,body,extended) AGAINST('$term')";
			}


搞定,不过中文搜索功能较弱就是了。
注:s9y版本Serendipity 1.1,其它版本中也有是找到相应文件的MATCH (...) AGAINST 语句改掉就是了。
Defined tags for this entry:

Posted by rollenc

Last modified on 2007-01-28 00:51

0 Trackbacks

  1. No Trackbacks

0 Comments

  1. No comments

Add Comment


E-Mail addresses will not be displayed and will only be used for E-Mail notifications.