用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。 1 G3 A5 \% B- a" A! `
第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段: ID 自動編號 % P9 d0 Q% G) @! f
U_Name 文本
: r0 _! v1 K2 W$ w: H1 _, D0 U% B* l U_Info 備註 第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:
) h9 q- N3 C X; C以下是代碼片段:
/ b( f0 F* M7 {<!-- Search.asp -->
! K: G+ I* G$ N+ u i% o: ]9 Z4 @. |4 S<form name="frm_Search" method="get" action="Search.asp">
$ U4 w1 M$ h( r0 }' o請輸入關鍵字:
) o+ O& [; ]3 M% Z1 F0 m2 R. o<input type="text" name="key" size="10"> . I! p2 O8 n) ?. n4 H8 E/ i
<input type="submit" value="搜索">
$ Z: `; E5 Q+ \- K7 R- i</form> |
下面,就進入了實現智能搜索的關鍵部分。 首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:
, I% F9 m% p% Y' t/ b) }& i! |) ~- h以下是代碼片段:
' T; Z) T6 z+ ?; e, i<% 3 Z5 y& g% K; x
Dim strProvider,CNN 6 |( ]: j6 G$ ?# ]6 o# B% c& ~7 N
strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" : r# U' m) s, q9 z
strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下 2 z7 m3 n5 h& V6 {
Set CNN = Server.CreateObject("ADODB.connection") 8 {" G: z) i3 y
CNN.Open strProvider 打開數據庫連接 % y* Q0 i* K3 {3 v
%> |
接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。
. a5 ]% ^( d/ I% u
$ d1 y3 [# \ @6 E; b以下是代碼片段:
- [( x a# S! u. Z8 d& }, ~8 Z<font color="#FF0000">未找到任何結果!!!</font> : _5 P5 d Y5 N9 H: v
<%
4 _. y8 m8 ~ ?, }& s2 XElse
+ r6 r, ~5 f' l1 O' S( u4 B) P%>
( z% ]. H2 Z$ u( V/ o9 Q搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p> & b2 e4 J+ V( @3 Q3 l# h
<% V1 Z( |+ p4 ]/ K, n3 Y# i N
While Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接 7 i0 A. s5 \7 |# {. H
%> $ q' [7 O) d0 H7 H
<!-- 此處可設為你所需要的鏈接目標 --> ) p5 y( O* o& h- B
<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>
x; ~% A- F. g/ n8 w<!-- 顯示部分詳細內容 --> 4 l1 U% {8 Z/ `7 I5 S( [9 p
<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p> + T; ?5 J9 D3 p
<% * ]: G4 F7 R s9 ]: a
RST.MoveNext
+ x+ z# c4 d. K0 @ M8 B1 U5 g Wend
0 r7 b* V/ F+ B @! ?- ` RST.Close
$ X: Q) c( z1 D+ ]# O Set RST=Nothing
% B& M4 L( y$ a0 t% O D* W End If
* |: l+ J- n' l l. ~7 Q" JEnd If
" Q" c1 X* j/ i" @# |0 p: `%> | $ k; w7 d+ p; a4 w$ @) } o! ~+ z
在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:
9 J: f4 G/ i. }以下是代碼片段:: Q _1 Q$ V* Z0 s( V7 g4 v; q1 {
<%
# X. N2 z# n R) Z! dFunction AutoKey(strKey) ! d6 C6 w4 ?/ I7 [) r0 ]
CONST lngSubKey=2
4 a6 w8 i" `, {+ ~Dim lngLenKey, strNew1, strNew2, i, strSubKey 9 s9 R, A! @) ?8 U& `6 Z) B& ?/ _
( e: r3 Y2 m/ q/ V' w3 A』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。
: r5 }: N% E# [0 i6 ~: J4 |0 }4 R, _8 v) L. 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
2 ? D" w6 P, c, EResponse.Redirect "error.htm"
4 A0 O6 |1 q o" _ t/ k1 T9 k0 LEnd If
6 n: f5 X% K4 P/ y6 T) l9 ilngLenKey=Len(strKey) ) h9 o+ _ p. v2 t+ J5 M
Select Case lngLenKey
L. T( x y6 @2 u3 Y1 R4 ^Case 0 若為空串,轉到出錯頁
( [5 @9 h; C6 c& o" e8 VResponse.Redirect "error.htm" ; g! }" P0 H% L; J
Case 1 若長度為1,則不設任何值
8 X. S' s K! l ^strNew1="" 0 U( ]( z7 J- N3 m8 m d8 Q
strNew2="" 9 e" _7 Q% ?% o1 ]) |
』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件
6 R) q9 t0 l( T4 t* d8 JFor i=1 To lngLenKey-(lngSubKey-1) 4 R7 F. X7 ~/ Z: ~7 [5 e! c2 ~
strSubKey=Mid(strKey,i,lngSubKey) " X5 ^& L' z5 o1 W0 o" R0 j% m2 H& N
strNew1=strNew1 & " or U_Name like %" & strSubKey & "%" . I& T' n J ~
strNew2=strNew2 & " or U_Info like %" & strSubKey & "%" ' p1 F, }+ c0 r) G& @. j
Next " F; a( _* k% |6 u" h; G& Y
End Select 6 M; E% B. R# @5 c# q
』得到完整的SQL語句
! C( e0 I. [! l0 ~) E) F# l% }+ C0 a* h: @6 `) J4 ]
AutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2
3 T# Q: x9 x" K. X. s1 T( }End Function
, t, E' r6 `) o+ f& K |8 \%> |
要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。 最後,別忘了將數據連接關閉,以釋放資源。 ! X; z% ]9 B7 C. |
以下是代碼片段:
/ a9 R1 P5 r3 u- S! T<% , N3 h' i6 U# Y/ u; r
CNN.Close
+ S' k2 C! b; ]! G9 f' SSet CNN=Nothing
4 P1 `1 V u4 J9 u; |7 i%> |
至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。 |