使用ASP實現搜索引擎的功能非常方便,但是如何實現智能搜索呢?在閱讀本文之后,您會發現這個其實實現這個功能是非常簡單的,下面就跟著錯新技術頻道小編的步伐來了解吧!
ASP智能搜索的實現步驟
????第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數
據庫為例),并在其中建立表T_Sample。表T_Sample包括如下字段:
????????ID????????????自動編號
????????U_Name????文本
????????U_Info??????備注
????第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單
(Frm_Search),表單內包括一個文本框和一個提交按鈕。并將表單的method屬
性設為“get”?,action屬性設為“Search.asp",即提交給網頁自身。代碼如下
:
????
????
???????請輸入關鍵字:?
???????
???????
????
????下面,就進入了實現智能搜索的關鍵部分。
????首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:
????<%
????Dim?strProvider,CNN
????????strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data?Source="
????????strProvider=strProvider?&?Server.MapPath("/")?&?
"/data/db_Sample.mdb"??'假設數據庫存放在主頁根目錄下的data目錄下
????????Set?CNN?=?Server.CreateObject("ADODB.connection")
????????CNN.Open?strProvider??'打開數據庫連接
????%>
????接下來,判斷?ASP頁所接收到的數據,并在數據庫中進行搜索。
????<%
????Dim?S_Key,RST,StrSQL
????????S_Key?=?Trim(Request("key"))???'得到搜索關鍵字的值
????????If?S_Key?<>""?then?
????????????Set?RST=Server.CreateObject("ADODB.RecordSet")
????????????StrSQL=AutoKey(S_Key)??'此處使用自定義函數?AutoKey(),該函
數為實現智能搜索的核心
????????????RST.Open?StrSQL,CNN,3,2??'得到搜索后的記錄
????????????If?RST.BOF?And?RST.EOF?Then
????%>
????????????????未找到任何結果?。。?
????<%
????????????????Else
????%>
????????????????????搜索名稱為“<%=?S_Key?%
>”的項,共找到?<%=?RST.RecordCount?%
>?項:
????<%
????????????????????While?Not?RST.EOF???'遍歷整個記錄集,顯示搜索到的信
息并設置鏈接
????%>
????????????????????????
????????????????????????href="info.asp?ID=<%=?RST("ID")?%>"?target="_blank"><%=?RST("U_Name")?
%>
??
????????????????????????
????????????????????????<%=?Left(RST
("U_Info"),150)?%>?>
??
????<%
????????????????????????RST.MoveNext
????????????????????Wend
????????????????????RST.Close
????????????????????Set?RST=Nothing
????????????End?If
????????End?If
????%>
????在上面的代碼中,有一個自定義函數?AutoKey?,該函數是實現智能搜索的核
心所在。代碼如下:
????<%
????Function?AutoKey(strKey)
????????CONST?lngSubKey=2
????????Dim?lngLenKey,?strNew1,?strNew2,?i,?strSubKey
????????'檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要
進行設定。
????????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
????????????Response.Redirect?"error.htm"
????????End?If
????????lngLenKey=Len(strKey)
????????Select?Case?lngLenKey
????????????Case?0???'若為空串,轉到出錯頁
????????????????Response.Redirect?"error.htm"??
????????????Case?1???'若長度為1,則不設任何值
????????????????strNew1=""
????????????????strNew2=""
????????????Case?Else??'若長度大于1,則從字符串首字符開始,循環取長度為
2的子字符串作為查詢條件
????????????????For?i=1?To?lngLenKey-(lngSubKey-1)
????????????????????strSubKey=Mid(strKey,i,lngSubKey)
????????????????????strNew1=strNew1?&?"?or?U_Name?like?'%"?&?strSubKey?
&?"%'"
????????????????????strNew2=strNew2?&?"?or?U_Info?like?'%"?&?strSubKey?
&?"%'"
????????????????Next
????????End?Select
????????'得到完整的SQL語句
????????AutoKey="Select?*?from?T_Sample?where?U_Name?like?'%"?&?strKey?
&?"%'?or?U_Info?like?'%"?&?strKey?&?"%'"?&?strNew1?&?strNew2
????End?Function
????%>
????要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使
用了循環取長度為2的子串的方法。為什么不將子串長度定為1、3、4或其他呢?
這是因為若子串長度小于2即為1時,會失去將關鍵字分組的功能,而若子串長度
大于2,則會丟失一些詞組。大家可以將?CONST?lngSubKey=2改為其他數字試一試
,孰優孰劣自見分曉。
????最后,別忘了將數據連接關閉,以釋放資源。
????<%
????????CNN.Close
????????Set?CNN=Nothing
????%>
??以上就是如何實現智能搜索,更多技術知識請繼續關注錯新技術頻道!
新聞熱點
疑難解答