|
用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。 ; b! I7 K: A$ Z3 }/ C
第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段: ID 自動編號 ) A6 ]! ~$ J* G8 H
U_Name 文本
4 H! v7 n T; i$ @+ c U_Info 備註 第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下: / m7 u& s) l9 Q0 `& T P& X
以下是代碼片段:% Y4 t; _2 S) l" t+ v" x
<!-- Search.asp -->
$ a0 l6 V5 x3 R9 k; a7 L9 {; x<form name="frm_Search" method="get" action="Search.asp">
& X7 j% g1 r c3 x/ [" t; b請輸入關鍵字:
/ g% [/ y) U1 Y1 `* m<input type="text" name="key" size="10"> ) W; @' N6 t# t5 o6 D( R
<input type="submit" value="搜索">
% n! p6 F( _- T4 a7 `' ^) ]</form> |
下面,就進入了實現智能搜索的關鍵部分。 首先,建立數據庫連接。在Search.asp的開始處加入如下代碼: 2 D/ _( P f p
以下是代碼片段:
9 w8 N- i( `6 P# K; q1 F" C3 k2 p<%
$ @" Z6 E0 }9 N6 J- ]1 V6 q0 r Dim strProvider,CNN 6 y, {: a5 }9 `. B* k R! I
strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" ( V" n# ]8 n9 U8 O% h; a
strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下 , U6 {0 `8 ~* K
Set CNN = Server.CreateObject("ADODB.connection") 2 |2 S7 T3 b5 Y* o: m0 k9 Q
CNN.Open strProvider 打開數據庫連接
8 l; d2 U4 `+ N" Z& l: P! t%> |
接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。
5 ]$ W" F7 t5 x. U
# [0 v3 W' l) V/ P- [ |以下是代碼片段:7 F" W8 H. ~! x" N2 {, T$ K: @
<font color="#FF0000">未找到任何結果!!!</font> 7 ]7 I' B& O. Y8 O3 _% I, @. ^# ?
<%
K/ j! S+ _7 h; {2 B6 D# \& rElse
$ \( N- j# q* P% N%>
- V, N* b! c0 U- x: ` L" f/ U搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p> & r; H. m" v) J# [# A: }! X
<% 0 S: }0 a+ g: b: ^6 X( H
While Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接 / j1 x( d4 G2 g& J+ t; f
%>
. h' b. e8 z7 N; A' s# {9 c. W$ e<!-- 此處可設為你所需要的鏈接目標 -->
8 C/ P* `6 Y8 t1 t<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font> " W" o, _5 i5 v9 V) @+ D
<!-- 顯示部分詳細內容 -->
! j6 n$ K$ R8 Z* }$ @6 A6 n9 O' d* J<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p> $ r3 j3 g+ u% B( r
<%
u8 T( m* g$ U1 p RST.MoveNext 1 f: o9 L& ?* O* s
Wend
9 J% `0 I# I6 X h8 g$ d7 j* ` RST.Close - u6 L; T" J7 R
Set RST=Nothing
' [! @/ \% [ b! C5 N End If % b" U v. J9 S) F8 {
End If
/ s* }: D, P/ g: c1 r%> |
! k( [ [' G% E8 _1 F8 e! I2 C 在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下: 2 [! f& {6 _' r) z
以下是代碼片段:
9 D/ V3 u0 q1 { K- a<%
( V2 }) s K: ?' R1 z% {& QFunction AutoKey(strKey)
F$ n0 `, X4 f( O8 d5 k; c, LCONST lngSubKey=2 5 ^, X( z; W j8 [0 ^
Dim lngLenKey, strNew1, strNew2, i, strSubKey # l1 m- j4 v- j) A
# \+ ^, T6 S' X+ Z1 x; e J4 g
』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。
8 W) ]9 G% G, `) \
" Y# L; C# |. U& e) X0 [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 : H5 }$ G a$ `6 w/ |
Response.Redirect "error.htm"
5 ]+ j+ f6 C3 W, `End If 5 {+ _, N! G, i1 b+ p$ K$ r
lngLenKey=Len(strKey)
4 B* A1 d8 S; GSelect Case lngLenKey / e9 C9 n n3 b( F9 B
Case 0 若為空串,轉到出錯頁
: l* f7 C/ N9 ~* S' D: C1 DResponse.Redirect "error.htm"
* }7 \" { N, e# k# e" Q8 sCase 1 若長度為1,則不設任何值 , [* G0 j. \) m. P; u" ^) w: p' n3 q
strNew1="" . R1 a( y, U/ S; W
strNew2="" , M5 v" [: b+ {0 u6 O
』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件
5 X* W+ Q6 i. s$ [& W% w: _# tFor i=1 To lngLenKey-(lngSubKey-1) 7 ~' ^! ~3 |: E* x$ c: w( X* i
strSubKey=Mid(strKey,i,lngSubKey) 4 q3 T& L8 w( w+ I. ?
strNew1=strNew1 & " or U_Name like %" & strSubKey & "%"
/ Z2 i7 n4 g' Z: a8 ystrNew2=strNew2 & " or U_Info like %" & strSubKey & "%"
4 f4 Z. ?0 }& X9 Y# ~1 k7 O4 RNext
, F/ e8 i# ^- n# ^End Select }8 e/ Q- Y0 c' C2 o! w2 `
』得到完整的SQL語句 & K. B5 I4 S* B& _6 \
5 l: D; ~: l$ O6 o
AutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2 * F' E% S) D! {3 n3 x o9 Z5 A& z
End Function ; `9 W& i' \2 T( r' L; P1 a3 Q
%> |
要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。 最後,別忘了將數據連接關閉,以釋放資源。 . p3 L8 k0 a, e) L# j
以下是代碼片段:! V! h) }5 u6 w, }8 ]. o, u
<% 9 _! C' m" q, N! S, g6 n- ~8 u4 j
CNN.Close
3 A# x# h- b! d: p; S' k* U9 t( f' CSet CNN=Nothing ; A" L0 z: n( Y; U* P, f" B
%> |
至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。 |