| 用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。 1 g, N: H6 d( X) a. @: O第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段:
   ID 自動編號 : N* D7 s, ]* J, R2 J  ]* z9 s   U_Name 文本 $ X/ q( {& [5 e9 X0 ^
 U_Info 備註
   第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:  6 x7 O# F4 }' N* z" m
| 以下是代碼片段: % \. v7 H/ m# O; C<!-- Search.asp -->
 & L) F/ C. c0 k5 C# }% Y0 ?<form name="frm_Search" method="get" action="Search.asp">
 0 w8 C$ k" o( P7 |2 i請輸入關鍵字:  / B7 r# ^( p; @; ?, _
 <input type="text" name="key" size="10">  # B! T( A9 H1 H& X! w8 }+ x. \
 <input type="submit" value="搜索">
 % ?' {  c9 O# @* l7 B</form>
 | 
   下面,就進入了實現智能搜索的關鍵部分。    首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:  : J, f# ~5 \' @) ]8 e1 W- t
| 以下是代碼片段: * S2 I5 Q1 Q( e' H! _6 w0 F; S<%  - x: H% z# u! X. W: ~+ P
 Dim strProvider,CNN
 & v  J, S* l: z; k5 C  @0 O  strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
 ; T+ A* E: ]% G4 Y( Z3 C  strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下
 $ x. W' P  z* T5 p5 T  Set CNN = Server.CreateObject("ADODB.connection")
 ; c6 C0 _" u2 W4 c9 {& U% }% I: R  CNN.Open strProvider 打開數據庫連接  7 D1 }) y9 V  r7 ^0 p+ ~  p
 %>
 | 
   接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。  
: g# R& a1 _: R9 l3 P. @0 U- J: d* h3 E2 U$ ]
1 l. X" s" f; [) v' }) _) ]
  在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:| 以下是代碼片段:' n# K8 C. A& E <font color="#FF0000">未找到任何結果!!!</font>  7 D9 w0 G% w7 w  m, u: s$ r
 <%  4 M4 J5 C% H5 O9 t$ ^+ S
 Else
 ! I/ g. a2 O: D# I; k0 i' N' t" `, I%>  ) G' u9 Q& |0 }
 搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>
 9 @1 W& l4 w+ ]5 ~% p8 I" i<%  - i7 `1 m! n, G- N1 _! Q2 D) Y9 `, D/ }, i
 While Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接  9 i2 P+ I2 t  p% Q$ \: l6 M5 W
 %>
 9 T0 Y% |% L  J& L. L3 q# A) g<!-- 此處可設為你所需要的鏈接目標 -->  2 b7 R; @8 P7 w4 V
 <font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>  8 A. o8 R" `8 }4 p" d* t) F
 <!-- 顯示部分詳細內容 -->  1 P( K5 D0 p; B$ L
 <font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>
 " o5 ^* [; p" }$ k  Y3 H" y1 E3 T<%  & R2 z* z3 A" j, {0 p4 g
 RST.MoveNext  9 O! B/ h' \7 h" ^& k7 Z# x
 Wend
 $ i2 I, z/ h7 p* c/ {   RST.Close  . q0 \; G7 l, J) G, Z. i
 Set RST=Nothing  . q8 y, r" ~& e+ V( z* Q$ p+ ^4 k4 `
 End If
 ; D- S0 i, l; k- Q9 MEnd If  1 S. T: C! k7 d; s6 m
 %>
 | 
 
! ~5 T$ j' N% V| 以下是代碼片段: 9 V. y9 k* Z0 G- g4 ]- t<%  ) M" a# A8 k' A' q0 B+ P. H
 Function AutoKey(strKey)  ) }6 g/ o$ q* b9 x8 ~* c
 CONST lngSubKey=2
 - Z, ]% `3 v: j1 j. u( b( Q* M2 iDim lngLenKey, strNew1, strNew2, i, strSubKey
 ; e& l: _! J0 O* K$ w
 % g4 R8 f3 Z8 T; Z9 F( N4 Q4 J』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。
 $ k% A$ Z' X7 r6 f6 ]$ q$ H* L& B$ H9 @7 |
 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  6 O5 B/ b- S* b
 Response.Redirect "error.htm"  " k% a3 u2 Z% l" i  `1 J+ z
 End If  1 R* ]5 ~& w) s6 S
 lngLenKey=Len(strKey)
 8 b/ C" b3 ?/ I  d. A8 YSelect Case lngLenKey  ! q; Q8 L9 s7 C9 O* u' n9 {
 Case 0 若為空串,轉到出錯頁
 o$ W# K: L  f4 X& x- I: v- PResponse.Redirect "error.htm"  ( M! d$ b: K) u* l+ t5 W  ~
 Case 1 若長度為1,則不設任何值  $ D" l1 k  m2 @- Y" q
 strNew1=""    D: d2 Q$ b3 {7 {* l  U. ]0 \
 strNew2=""  9 H3 ~) W& K, w6 u
 』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件  : z! M7 y5 e  Z5 C8 R% l! p; M
 For i=1 To lngLenKey-(lngSubKey-1)
 . O/ I; T2 B6 n  v) N& U: a3 Z" [strSubKey=Mid(strKey,i,lngSubKey)
 2 s  L6 V/ j9 ?& f+ _+ K2 T3 MstrNew1=strNew1 & " or U_Name like %" & strSubKey & "%"  8 i4 |# Q0 V0 q; l
 strNew2=strNew2 & " or U_Info like %" & strSubKey & "%"  4 f1 H1 R% i6 _% g- z
 Next
 . I8 ]2 t5 ^, |, |  }( g3 PEnd Select
 9 A6 \" O1 O' x8 J, V』得到完整的SQL語句  2 f# m% N  k3 K# r% T4 \
 $ n. s* \5 x  Q  Y
 AutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2
 + v( Q/ H' z! @5 H3 g% T/ WEnd Function  % r8 k9 Z* G1 a3 S# M& o( F
 %>
 | 
   要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。    最後,別忘了將數據連接關閉,以釋放資源。  : n: B) y9 g/ u
| 以下是代碼片段: & L& R+ z+ i) A<%  1 p' Y. R5 u. E/ c" `
 CNN.Close
 5 ]6 T, Y, b: @! o+ q1 B5 USet CNN=Nothing
 7 j, a* y; C% a& k% A3 g3 w, L%>
 | 
   至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。 |