CS20中搜索的实现原理:每添加一个Post就会将Post的查询关键词和PostID存入cs_SearchBarrel表中。英文中单词之间有空格分隔,通过空格将文章分成若干关键词很容易。但中文文章词与词之间并无明显的格式上的分隔,这导致CS20无法准确的分辨关键词,会出现很长的句子被判定为一个关键词的情况。
一般情况下,每个关键词经过hash存储于表的WordHash字段中,在搜索时会通过Hashcode进行比对以提高效率。CS20会忽略掉长度小于等于2的词,对于英文文章这种忽略是合理的,但中文文章中这种忽略则会限制用户的使用,将长度判断条件减一的话就应该对中文用户没有太大的影响了。
默认情况下CS20会同时查询标题和正文,而且没有提供单独对标题搜索的选项,应该进一步分析SearchBarrel工程和Component的Search目录下的代码寻求解决方法,另外对Weight字段也不是很清楚。
中文用户一般的搜索习惯应该在默认使用模糊查询,所以修改CommunityServer.SearchTerms和CommunityServer.Components.SearchBarrel.SearchBarrelProvider类在参数不同情况下产生不同的查询条件,如果需要精确查找的话可以在查找文本框的第一个字符输入"="。
有一个问题有些不解:SearchProvider的SearchQueryString方法根据输入的查询条件类型实例生成URL参数字符串并转向SearchResults页,但HttpUtility.UrlEncode(query.QueryText)生成的字符串在在不同系统上结果会不同,应该如何修改能够提高系统的适应性呢?
传递参数的编码问题目前通过在web.config文件中设置<globalization>元素确定默认的requestEncoding和responseEncoding。获取配置文件中requestEncoding编码方案对传递参数进行编码,在转向后的页面中直接通过Request.QueryString["qsName"]得到的是已经通过配置文件中的方案解码的字符串。这也算一种扩展性稍微好些的解决方案吧。