站内搜索是一个网站重要的组成部份, 一个强大的站内搜索能令访客更快捷的找到所需的内容, 同时保证搜索的质量和结果。目前,大部份主流CMS均提供了站内搜索模块,部份还提供了模糊查询功能,但由于普遍缺乏中文分词系统,造成搜索结果不理想。对于被搜索引擎宠坏的访问者,不要指望他们会以空格或其它方法来区分关键词。这样,由于无法很好的搜索到相关信息,站内搜索几乎成为鸡肋。
虽然基于.net或asp组件有很多分词解决方案,但对于中小网站而言,由于主流的平台仍是ASP/PHP,这样要使用分词付出的代价将相当高昂。有没有完全通过脚本的中文分词解决方案呢?
这里,就提供一个完全免费的解决方法,它甚至可以不在你的服务器上运行,直接在客户端完成分词过程,而你的服务器端,则只需处理分词的结果并进行模糊搜索。
脚本采用了VBScript,对于ASP系统可以非常方便的转换为服务器脚本,这样便无缝的与现有网站程序对接。当然,这会占用一些服务器的资源。既然是轻量级应用,那当然是把系统开销降至最低为目的。
源代码如下
//create by e2web@e2web.cn
Function urldecoding(vstrin)
dim i,strreturn,strSpecial
strSpecial = "!""#$%&'()*+,/:;<=>?@[]^`{|}~%"
strreturn = ""
for i = 1 to len(vstrin)
thischr = mid(vstrin,i,1)
if thischr="%" then
intasc=eval("&h"+mid(vstrin,i+1,2))
if instr(strSpecial,chr(intasc))>0 then
strreturn= strreturn & chr(intasc)
i=i+2
else
intasc=eval("&h"+mid(vstrin,i+1,2)+mid(vstrin,i+4,2))
strreturn= strreturn & chr(intasc)
i=i+5
end if
else
if thischr="+" then
strreturn= strreturn & " "
else
strreturn= strreturn & thischr
end if
end if
next
urldecoding = strreturn
end Function
Function bytes2BSTR(vIn)
strReturn = ""
For i = 1 To LenB(vIn)
ThisCharCode = AscB(MidB(vIn,i,1))
If ThisCharCode < &H80 Then
strReturn = strReturn & Chr(ThisCharCode)
Else
NextCharCode = AscB(MidB(vIn,i+1,1))
strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
i = i + 1
End If
Next
bytes2BSTR = strReturn
End Function
Function GetURL()
set XmlHttp = CreateObject("Microsoft.XMLHTTP")
XmlHttp.Open "GET", "http://www.baidu.com/s?word="+search.str.value, false
XmlHttp.setRequestHeader "Content-Type","text/XML"
XmlHttp.Send
dim html
html = bytes2BSTR(XmlHttp.responseBody)
if instr(html,"http://cache.baidu.com/c?word=")>0 then
html=split(html,"<a href=""http://cache.baidu.com/c?word=")(1)
html=split(html,"&url=http")(0)
html=replace(urldecoding(html),";"," ")
end if
search.action="http://download.pchome.net/php/search.php?searchstr="+html
search.submit()
End Function
Function s()
search.action="http://download.pchome.net/php/search.php?searchstr="+search.str.value
search.submit()
End Function
</ script >
< Form name ="search" method ="POST" >
< p >< input type ="text" name ="str" size ="26" value ="图像处理软件" >
< input type ="submit" value ="分词搜索" name ="B1" onclick =GetURL() > < input type ="submit" value ="普通搜索" name ="B2" onclick =s() ></ Form >
程序原理非常简单,在这里需要通过XMLHTTP调用了百度的快照分词结果,当然,也可以换成其它具有类似功能的搜索引擎,如YAHOO。如搜索“图像处理软件”,那么通过百度将返回分词后的字符串“图像 处理 软件”,演示采用了PCHOME的下载搜索,结果显而易见,分词后搜索结果比未分词时增加了10多条记录,而对于用户来说,他只需要输入想查询的关键词就可以了。你可以适当更改代码,如判断用户是否输了空格,以确定是用机器分词还是人工分词来进行搜索。
接下来,只需将代码嵌入你的网站,并设置好相应的查询URL,那么你的网站也将拥有一个强大的分词搜索系统了,当然,前提是你现有的搜索模块已具备多关键词模糊查询功能。
也许很多人对这种投机的方式不感冒,同时这种方式在实际使用中也会有种种限制,但用如此低的成本获取更好的用户体验,为什么不试试呢。不过,对于有开发能力的网站管理者,可能更愿意开发一个完全属于自己的分词模块,我在以后的环节,会继续提供纯脚本和字典来实现中文分词的思路。