| 用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。 . H7 B9 r4 b& c! X) x第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段:
   ID 自動編號 # P, N+ O. @5 n1 C  yU_Name 文本 & r7 M4 F7 s* z  D
 U_Info 備註
   第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:  
. R- v2 i3 H( p, e" [5 n1 k| 以下是代碼片段: + }! @; ^3 L1 X$ c<!-- Search.asp -->  , P8 m/ ?" m1 v! p
 <form name="frm_Search" method="get" action="Search.asp">  $ f; ?' P( I1 O) c+ E
 請輸入關鍵字:
 / Z- B# }9 }9 l( `<input type="text" name="key" size="10">    v+ T, d; D, ~) i5 [7 V1 C
 <input type="submit" value="搜索">
 & |* l5 {$ ]% M</form>
 | 
   下面,就進入了實現智能搜索的關鍵部分。    首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:  
; f6 k8 o" D* |& F4 I2 s1 s| 以下是代碼片段: ; q0 j( B9 ?" w8 P<%  - o! p8 g4 y, H) g
 Dim strProvider,CNN
 # @) S: D9 c* }6 u  strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
 & ^/ z# f) s" E  W  strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下  0 P" e: s7 f% `% h: V% Q
 Set CNN = Server.CreateObject("ADODB.connection")
 ( p; v7 M& k7 P  CNN.Open strProvider 打開數據庫連接
 $ Q4 c4 o7 D1 e6 b! q5 c%>
 | 
   接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。  $ [! n0 b; G; {9 U8 T
% U0 G% K& T6 d3 ~  j6 x2 T* U% O; Q2 B3 p) e
  在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:| 以下是代碼片段: % e, J* i7 m; p<font color="#FF0000">未找到任何結果!!!</font>
 1 x  I8 V/ [+ W<%
 5 d# }* [5 _! E* X4 mElse
 * [7 J( E3 B2 X4 u' R6 I%>
 2 o% o) |6 g! m3 L4 @& f/ ~! u搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>  $ q1 p& L$ \* ^# N5 d
 <%  - c9 L2 X3 Z: W' |0 L' w# n- Q; y
 While Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接  " s8 y& ]6 q1 _) x3 s; _7 h$ W
 %>
 , ]0 r3 r2 ^- `& ~4 |<!-- 此處可設為你所需要的鏈接目標 -->  9 z' y& x2 a$ H) p: p$ e9 O* H
 <font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>  7 V0 f/ K% q" d; W0 ?) L( @- t; ~
 <!-- 顯示部分詳細內容 -->  2 H$ t" V0 g7 ~/ s( D
 <font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>
 % S5 e3 e1 i" n5 u<%  + \  z. U* ?9 W; X* V
 RST.MoveNext
 % v" \( J" Q  r5 E% K' X  Wend  + q/ w  V4 s, e: I
 RST.Close    a9 M/ K2 k. K& V3 S
 Set RST=Nothing
 8 _5 g8 }* Q9 g6 |# r, i* f  End If
 8 A2 V4 d' K2 c. z& e8 rEnd If
 8 w8 a. w" m0 K4 }# A. }%>
 | 
 
& v' e# d4 }: b' r' x' {| 以下是代碼片段:5 b2 t7 a' u7 z8 A; X3 R' Q( w) y <%  ; |9 X9 d! Y6 V: \: K
 Function AutoKey(strKey)  ; d+ T: I5 ]+ t8 a, o2 g$ U  U
 CONST lngSubKey=2  4 C# Q3 e' ?* N
 Dim lngLenKey, strNew1, strNew2, i, strSubKey  0 r% W% k0 y8 S6 |0 Y6 v2 s; t
 
 6 h) S0 H3 j2 ^; W" _9 k  f』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。
 & ]8 |2 Y7 X3 s* A1 E2 p2 K# z4 J# C) T# X2 v5 R/ T
 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
 ( K- r% `; l& Q2 f5 s) C, t, GResponse.Redirect "error.htm"
 & H1 ?, i/ D: Q: _! lEnd If  7 F" _" N5 I" W4 F# Y- M7 g
 lngLenKey=Len(strKey)  2 k* ?* M- U  @% h" a9 v9 W
 Select Case lngLenKey  + {1 K7 T8 X: u, V
 Case 0 若為空串,轉到出錯頁
 * q8 V  G) ?2 u; Z; }& a8 R7 uResponse.Redirect "error.htm"    V/ \- B/ j+ X5 C# J; H
 Case 1 若長度為1,則不設任何值  1 b) j* I" x$ A4 S) d% ]0 U
 strNew1=""
 1 {% G: V" c$ I- S! j4 Z0 I( J+ ~strNew2=""  + V' R! y$ p. Q9 O% y9 F! e
 』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件
 % k' P8 V1 H2 wFor i=1 To lngLenKey-(lngSubKey-1)
 ) Y$ v8 I  R4 q; f9 DstrSubKey=Mid(strKey,i,lngSubKey)
 6 l5 O$ L! D- q6 u! v4 L" `* WstrNew1=strNew1 & " or U_Name like %" & strSubKey & "%"  , Q  B7 ^8 `& l# A
 strNew2=strNew2 & " or U_Info like %" & strSubKey & "%"
 9 i: a( y8 n. r# F5 @( FNext  % q$ u2 m% U6 `# Z9 j" @) @5 h
 End Select
 - [2 N9 H0 _' r% z! g』得到完整的SQL語句  , D4 x* T, [! g
 7 v/ i( ^& B6 g! r( |% Q
 AutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2
 % E5 @# G7 K8 }2 q/ xEnd Function  $ p4 e  A5 z- f) x6 i
 %>
 | 
   要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。    最後,別忘了將數據連接關閉,以釋放資源。  
" i* }/ S' Q' s. z3 r& @| 以下是代碼片段: ! ]( _1 t; t+ V<%
 , `$ \* D' e8 P6 ZCNN.Close  . @6 q) z! q& w1 v( I( v
 Set CNN=Nothing  2 T! a  X6 ]( \
 %>
 | 
   至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。 |