| 用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。 4 z& D. m. N: q/ S# d* e第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段:
   ID 自動編號 y4 ^+ ]: \$ F: G/ I   U_Name 文本 / t  U0 A% \/ {, [7 z
 U_Info 備註
   第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:  
' S: X% ]3 {, s- X0 p$ L8 P& B6 O| 以下是代碼片段:: v/ _# ~0 K; U <!-- Search.asp -->
 . v1 s% q# T3 V<form name="frm_Search" method="get" action="Search.asp">  $ Q3 C& K; }" H1 o) q, Y
 請輸入關鍵字:  $ y' Z. o3 |8 n4 T' V6 E
 <input type="text" name="key" size="10">
 0 [/ S% {* B7 R/ ^3 U<input type="submit" value="搜索">
 ) y0 g* q( {2 a% M9 t8 M: f</form>
 | 
   下面,就進入了實現智能搜索的關鍵部分。    首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:  
, i4 F2 a* M7 p5 L$ u5 `4 C2 B4 F| 以下是代碼片段: ! h* d# H, z; [) b<%  8 i9 \( G' ^& P6 X& L( U- M5 P( k
 Dim strProvider,CNN
 5 G9 O# X  J0 V& X0 x  strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
 # x4 ?' K9 R, n4 E& G" \3 W, H. h  strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下  2 C. K5 b5 n) n- E
 Set CNN = Server.CreateObject("ADODB.connection")  8 h6 _( q! y  Z  P% {
 CNN.Open strProvider 打開數據庫連接  " P/ V' q  e3 s" A" e
 %>
 | 
   接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。  
) s" w6 s' K6 ^5 ]
: q; i1 J' k  P+ s. J' Z; G! l/ A0 b
  在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:| 以下是代碼片段: J! D7 }* b- ]% }% b; x. g- d<font color="#FF0000">未找到任何結果!!!</font>  ! S2 H2 M' E8 k  P2 z3 G, I
 <%
 5 B8 `, H1 e$ O% n5 n6 u8 H- [5 cElse
 + ?6 O" p; C1 i" ?" I, C%>  : \; ^* d0 q; O1 Z7 k) K
 搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>
 3 w2 D9 |0 I; P2 \4 p9 ?<%
 0 F8 O) d& C5 LWhile Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接
 4 G, z( \! V6 W, E  g%>
 5 k* o3 N, @/ ^. J. J<!-- 此處可設為你所需要的鏈接目標 -->
 5 j' \( [6 e8 ~, j8 w! X* ?<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>
 ) E4 i( U; ]4 V$ [5 q: s& U' d<!-- 顯示部分詳細內容 -->
 & F" E8 [1 W& b: P, L& m<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>  2 E9 F, H) z8 A# X3 ^
 <%  " O7 b: z- r" u+ V7 F
 RST.MoveNext
 + K( g8 n" T1 l. Y  Wend
 ) X: ]( \1 k% g" ?4 ?   RST.Close  + I5 M; M2 d0 E1 u" r+ `
 Set RST=Nothing  6 ~2 a9 D7 Y4 Q
 End If
 # _' P/ ?* h$ E  FEnd If  7 v; m  J: }5 g- C. [3 ]! O
 %>
 | 
 
5 {% S' j' V3 y/ I2 J* r7 D| 以下是代碼片段:: ?0 t, W# e" s. H# L <%
 " G. P4 i* r; fFunction AutoKey(strKey)  1 O- Q: ?: d" w7 Q, W# |
 CONST lngSubKey=2
 ( N! r9 e* b2 E9 KDim lngLenKey, strNew1, strNew2, i, strSubKey
 5 n1 ~# c$ G/ u- \! H. u4 e7 p
 & |6 j4 s7 z/ w6 I1 Y( F- X+ x』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。
 T: r+ S! Z  Z. l! _: ?5 Q8 |: m* n) A2 }" X/ V6 O
 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
 & f0 D+ j2 A3 o$ f2 xResponse.Redirect "error.htm"
 9 K* B  P/ w2 [6 H' HEnd If
 ) X! ^2 Z$ A1 |lngLenKey=Len(strKey)  / s& t( H0 E  p! X; X
 Select Case lngLenKey  8 v1 Y, W8 P$ L! p7 v: T3 h0 R
 Case 0 若為空串,轉到出錯頁  , B% h* _9 ^/ P- M
 Response.Redirect "error.htm"
 & B* w+ U+ a6 ?+ y/ c! tCase 1 若長度為1,則不設任何值  ! x, O; }1 j3 ~5 `8 ^4 x' I
 strNew1=""  ' H8 H2 h, m7 C( ~" s) k" ~
 strNew2=""  % ~" C$ d% Y/ U7 ^# Q, w$ D1 x: Q
 』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件
 3 M/ y6 J) |! n* |! z+ T1 X  k& @( @; lFor i=1 To lngLenKey-(lngSubKey-1)  ( i& r: M8 H* V
 strSubKey=Mid(strKey,i,lngSubKey)  3 L, o& q! a7 V; I; q9 @6 p
 strNew1=strNew1 & " or U_Name like %" & strSubKey & "%"
 & N% U3 y5 a. k5 e5 `# qstrNew2=strNew2 & " or U_Info like %" & strSubKey & "%"  9 a" Y  ~) i& q. ]6 B1 J
 Next  & I7 E) a8 ^! u/ f% I1 D2 q
 End Select
 8 E$ C7 E: a: e; o2 L4 y! d』得到完整的SQL語句
 9 X0 ?) E  |" h4 V5 v  x
 ' A4 [9 E, u* h1 M4 |* L4 w7 HAutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2
 S0 X8 f% g2 \( P1 v! Z1 [End Function
 ; ^2 \* C. L/ X1 v8 @. R7 `* s%>
 | 
   要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。    最後,別忘了將數據連接關閉,以釋放資源。  
: r/ G" J0 u* B/ n2 [5 n. D" K. C| 以下是代碼片段: E8 Y; {+ |. C! S8 B9 t0 l<%
 ) D% s* p5 \% |2 i1 qCNN.Close
 8 k6 c; B8 o' l& J/ G& OSet CNN=Nothing  . Z2 \9 D8 B$ O' ?+ O3 b" h
 %>
 | 
   至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。 |