| 用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。   ^2 V. K2 j' E5 Q" z$ Y9 X第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段:
   ID 自動編號 # X/ q4 N7 Q' v1 F/ d/ w# P. a0 P5 q   U_Name 文本 , n* M5 m) p0 T9 F
 U_Info 備註
   第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:  0 Z) L9 T4 g# M+ U: q% j( e
| 以下是代碼片段:% D) X, ]4 Y: R# J- X2 {/ I <!-- Search.asp -->
 ' j& ?6 O. P+ M# D% U# B; j<form name="frm_Search" method="get" action="Search.asp">  ) v1 {4 ]+ R8 L+ E3 U$ g  d* a
 請輸入關鍵字:
 / x  w2 o  y7 V5 [5 G6 N<input type="text" name="key" size="10">
 5 \1 d, B# R1 X- E+ v8 S! j, E<input type="submit" value="搜索">
 2 A. H! j$ b7 k# \</form>
 | 
   下面,就進入了實現智能搜索的關鍵部分。    首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:  1 p  D/ e: I" C
| 以下是代碼片段: 6 q  \4 l$ p$ \8 [$ ?2 I% a<%
 $ q8 m- o( {4 W7 v  Dim strProvider,CNN  6 Z8 W7 b' @* Y3 |# n# ]
 strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
 + @; Q( b0 h3 \- e- b. w  strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下
 # z3 G% S3 \2 ?  Set CNN = Server.CreateObject("ADODB.connection")  6 j6 U3 `3 P3 Z- {. F/ Z
 CNN.Open strProvider 打開數據庫連接  ) A0 e5 @4 [. e6 |3 G! N( q. F- M
 %>
 | 
   接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。  
1 X1 T3 v; H+ u- B' b+ H' K" F0 X  G* N
3 r, i4 v8 e( J: }3 F' M- W6 g
  在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:| 以下是代碼片段: ( c- u0 ~" ?( E1 m* b<font color="#FF0000">未找到任何結果!!!</font>  5 z- P5 {2 e* f
 <%
 1 s7 d) m8 w, r7 \Else
 & A" {' S6 P- v. b) D7 D* D%>  7 g* S( @. ?% B" E9 g. I
 搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>
 3 D! c7 f" C( S( s7 W2 A<%
 & n& _, O/ u9 ]$ [9 o) I" |While Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接
 ! `3 d$ b% \0 B) ~# K+ f* q4 I, {* }%>  8 O1 P8 ~/ h1 s9 W/ K6 B
 <!-- 此處可設為你所需要的鏈接目標 -->  " |% {5 n/ ^8 t" R. e2 h0 A
 <font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>  : e6 x: ~  H* g& y  m
 <!-- 顯示部分詳細內容 -->  3 y9 W: ~) R  b# ]
 <font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>  6 }6 N- n/ b4 P& @+ \9 H
 <%
 ! _, R5 |5 e/ ^  RST.MoveNext  * D+ t" H" H0 v: L. s: l4 L
 Wend
 # Z; ?9 k- K7 T1 l" l: Z   RST.Close  / i' |% P1 c/ z/ l: B& c
 Set RST=Nothing  0 n7 P; D* J$ \& H* W
 End If  $ ~; S8 \, \3 K; S; S  ?6 E
 End If  9 s: Z( T6 y6 `( y" X1 e
 %>
 | 
 ; h) }4 k' W6 a. s* j9 l4 y& D: _
| 以下是代碼片段:' O/ w  d) `' P <%
 0 K! r: x* b, K( f6 ~Function AutoKey(strKey)  9 Y9 N1 c! B% y; z. Y- I
 CONST lngSubKey=2
 % S/ u5 e% |3 p, u; C9 ]Dim lngLenKey, strNew1, strNew2, i, strSubKey  7 G. d! N1 O- I+ ?* @/ P6 _- {
 - F9 F/ n1 ~; A5 [7 B2 k
 』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。  5 v) E( r9 W! E( _/ ^0 E4 o- i" u% r
 % _) J  \: ^; X
 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
 & `2 L0 f. ^9 {/ D. q3 ^Response.Redirect "error.htm"
 . W/ X2 U9 _! {4 z2 H6 x: lEnd If
 ) U$ s6 l+ _/ v3 D8 p8 OlngLenKey=Len(strKey)  * e5 M. M% Q' U7 t# h3 ^1 z
 Select Case lngLenKey  : D& |7 g' y7 D; ~
 Case 0 若為空串,轉到出錯頁
 & r5 r% l/ j! a6 nResponse.Redirect "error.htm"
 3 ?7 f9 F+ O' Z6 A+ FCase 1 若長度為1,則不設任何值
 * `/ W+ E: `: u1 J1 w9 UstrNew1=""
 & g8 A8 @3 O% M* \4 }strNew2=""  / P/ K% ~: o$ E8 }% e" @# X. ]
 』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件  ) ]# @* H. G  u9 \" m% X3 J
 For i=1 To lngLenKey-(lngSubKey-1)
 7 ^1 c' l' p3 ]2 R  u) M" ~  `9 NstrSubKey=Mid(strKey,i,lngSubKey)  % e3 |) Z- d' M& W% Z2 R* g% N
 strNew1=strNew1 & " or U_Name like %" & strSubKey & "%"
 / R/ a7 H7 m9 K2 DstrNew2=strNew2 & " or U_Info like %" & strSubKey & "%"
 - S% P8 T6 A. h2 PNext
 . v. K( Y! W* W6 E- \) G( {End Select  , ?$ }2 c5 Q; q
 』得到完整的SQL語句  * v3 u  \6 r1 y1 P7 A9 q6 r( }
 4 F3 m0 D' a4 P+ F
 AutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2
 / k2 U- z3 {7 DEnd Function  5 G, S  C  d5 e
 %>
 | 
   要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。    最後,別忘了將數據連接關閉,以釋放資源。  8 j$ b( @+ ]. c. q% {
| 以下是代碼片段: 2 n4 C* j( E, [0 v( B: |<%  $ ]# ]/ D0 |" X- v
 CNN.Close  ' M- R& X; a. u# }, F4 H+ \
 Set CNN=Nothing
 3 `7 ]( @% c% z' z6 U0 s: p/ l%>
 | 
   至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。 |