ASP智能搜索的實(shí)現(xiàn)
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
asp實(shí)現(xiàn)搜索引擎的功能是一件很方便的事,可是,如何實(shí)現(xiàn)類似3721的智能搜索呢?比如,當(dāng)在搜索條件框內(nèi)輸入“中國(guó)人民”時(shí),自動(dòng)從中提取“中國(guó)”、“人民”等關(guān)鍵字并在數(shù)據(jù)庫(kù)內(nèi)進(jìn)行搜索??赐瓯疚暮?,你就可以發(fā)現(xiàn),這個(gè)功能實(shí)現(xiàn)起來(lái)竟然是如此的簡(jiǎn)單。ok,follow me![br][br][br]第一步,我們要建立一個(gè)名為db_sample.mdb的數(shù)據(jù)庫(kù)(本文以access2000數(shù)據(jù)庫(kù)為例),并在其中建立表t_sample。表t_sample包括如下字段:[br]id 自動(dòng)編號(hào)[br]u_name 文本[br]u_info 備注[br]第二步,我們開始設(shè)計(jì)搜索頁(yè)面search.asp。該頁(yè)面包括一個(gè)表單(frm_search),表單內(nèi)包括一個(gè)文本框和一個(gè)提交按鈕。并將表單的method屬性設(shè)為“get” ,action屬性設(shè)為“search.asp",即提交給網(wǎng)頁(yè)自身。代碼如下:[br][br][br][br]下面,就進(jìn)入了實(shí)現(xiàn)智能搜索的關(guān)鍵部分。[br]首先,建立數(shù)據(jù)庫(kù)連接。在search.asp的開始處加入如下代碼:[br]<%[br]dim strprovider,cnn[br]strprovider="provider=microsoft.jet.oledb.4.0;data source="[br]strprovider=strprovider & server.mappath("\") & "\data\db_sample.mdb" '假設(shè)數(shù)據(jù)庫(kù)存放在主頁(yè)根目錄下的data目錄下[br]set cnn = server.createobject("adodb.connection")[br]cnn.open strprovider '打開數(shù)據(jù)庫(kù)連接[br]%>[br]接下來(lái),判斷 asp頁(yè)所接收到的數(shù)據(jù),并在數(shù)據(jù)庫(kù)中進(jìn)行搜索。[br]<%[br]dim s_key,rst,strsql[br]s_key = trim(request("key")) '得到搜索關(guān)鍵字的值[br]if s_key <>"" then [br]set rst=server.createobject("adodb.recordset")[br]strsql=autokey(s_key) '此處使用自定義函數(shù) autokey(),該函數(shù)為實(shí)現(xiàn)智能搜索的核心[br]rst.open strsql,cnn,3,2 '得到搜索后的記錄[br][br]if rst.bof and rst.eof then[br]%>[br]未找到任何結(jié)果?。。?/font> [br]<%[br]else[br]%>[br]搜索名稱為“<%= s_key %>”的項(xiàng),共找到 <%= rst.recordcount %> 項(xiàng):
[br]<%[br]while not rst.eof '遍歷整個(gè)記錄集,顯示搜索到的信息并設(shè)置鏈接[br]%>[br][br]" target="_blank"><%= rst("u_name") %> [br]<%[br]rst.movenext[br]wend[br]rst.close[br]set rst=nothing[br]end if[br]end if[br]%>[br]在上面的代碼中,有一個(gè)自定義函數(shù) autokey ,該函數(shù)是實(shí)現(xiàn)智能搜索的核心所在。代碼如下:[br]<%[br]function autokey(strkey)[br]const lngsubkey=2[br]dim lnglenkey, strnew1, strnew2, i, strsubkey[br][br]'檢測(cè)字符串的合法性,若不合法則轉(zhuǎn)到出錯(cuò)頁(yè)。出錯(cuò)頁(yè)你可以根據(jù)需要進(jìn)行設(shè)定。[br]if instr(strkey,"=")<>0 or instr(strkey,"`")<>0 or instr(strkey,"'")<>0 or instr(strkey," ")<>0 or instr(strkey," ")<>0 or instr(strkey,"'")<>0 or instr(strkey,chr(34))<>0 or instr(strkey,"\")<>0 or instr(strkey,",")<>0 or instr(strkey,"<")<>0 or instr(strkey,">")<>0 then[br]response.redirect "error.htm"[br]end if[br][br]lnglenkey=len(strkey)[br]select case lnglenkey[br]case 0 '若為空串,轉(zhuǎn)到出錯(cuò)頁(yè)[br]response.redirect "error.htm" [br]case 1 '若長(zhǎng)度為1,則不設(shè)任何值[br]strnew1=""[br]strnew2=""[br]case else '若長(zhǎng)度大于1,則從字符串首字符開始,循環(huán)取長(zhǎng)度為2的子字符串作為查詢條件[br]for i=1 to lnglenkey-(lngsubkey-1)[br]strsubkey=mid(strkey,i,lngsubkey)[br]strnew1=strnew1 & " or u_name like '%" & strsubkey & "%'"[br]strnew2=strnew2 & " or u_info like '%" & strsubkey & "%'"[br]next[br]end select[br][br]'得到完整的sql語(yǔ)句[br]autokey="select * from t_sample where u_name like '%" & strkey & "%' or u_info like '%" & strkey & "%'" & strnew1 & strnew2[br][br]end function[br]%>[br]要實(shí)現(xiàn)智能搜索,其核心就是將搜索關(guān)鍵字進(jìn)行自動(dòng)分組。在此處,我們使用了循環(huán)取長(zhǎng)度為2的子串的方法。為什么不將子串長(zhǎng)度定為1、3、4或其他呢?這是因?yàn)槿糇哟L(zhǎng)度小于2即為1時(shí),會(huì)失去將關(guān)鍵字分組的功能,而若子串長(zhǎng)度大于2,則會(huì)丟失一些詞組。大家可以將 const lngsubkey=2改為其他數(shù)字試一試,孰優(yōu)孰劣自見(jiàn)分曉。[br]最后,別忘了將數(shù)據(jù)連接關(guān)閉,以釋放資源。[br]<%[br]cnn.close[br]set cnn=nothing[br]%>[br]至此,這個(gè)智能搜索引擎已經(jīng)完成了。你還可以將其繼續(xù)完善,比如添加分頁(yè)、突出顯示等功能。好了,不耽誤大家時(shí)間了,趕快去試一試吧。 ^_^ [br] 該文章在 2010/7/22 21:29:49 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |