用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。
; X1 C2 S8 o3 e4 F% v第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段: ID 自動編號 6 k' a1 f6 O; X( U H
U_Name 文本 $ W8 }% `& c0 m2 M, n1 R: [6 [1 I
U_Info 備註 第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:
4 p h3 q& G/ o' d以下是代碼片段:4 p+ Z- A4 \7 q
<!-- Search.asp --> % }( c4 J N B8 Y0 N$ {7 ]
<form name="frm_Search" method="get" action="Search.asp">
: |. o6 J; y0 `! W7 Y請輸入關鍵字: 9 w+ j8 H. \) \" F% P: u
<input type="text" name="key" size="10"> _1 p- B( n1 t; d. C0 V
<input type="submit" value="搜索"> 1 y) ~/ G/ h7 Z. t0 p) M8 ` n
</form> |
下面,就進入了實現智能搜索的關鍵部分。 首先,建立數據庫連接。在Search.asp的開始處加入如下代碼: 2 u3 d' d' v% e5 B
以下是代碼片段:) J. O3 W8 M1 ~! Z4 X
<%
& f5 B0 s2 X1 a: J2 e# S# W/ s* H/ w Dim strProvider,CNN 8 d6 D6 k- B6 A" X; Z9 D
strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" 9 T6 w; K" X9 n
strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下
1 O; B6 m: C( K) i! Q# y) u Set CNN = Server.CreateObject("ADODB.connection") 6 a; s" T0 e3 o+ C# }4 {3 m
CNN.Open strProvider 打開數據庫連接
/ _7 v! E& j' T+ X* M3 a1 K5 u%> |
接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。
: j# s% E" ^& K% w* i! E5 Z. \) M0 N8 ?
以下是代碼片段:% D q2 B% ^4 O( p8 \$ U+ E
<font color="#FF0000">未找到任何結果!!!</font> / ^2 W* V% F4 [5 }0 M9 @
<%
' d& ]0 O+ b" c0 c$ L' `Else 5 @- _5 i5 q. e8 t7 z
%>
4 W0 `/ S* q2 \+ ?" P搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>
$ E* I( Y* o( q3 G1 l9 Q/ p<%
5 e$ {8 u/ W3 l2 i$ @While Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接
& N* \7 {' N9 K%> + t6 q1 y+ W5 G
<!-- 此處可設為你所需要的鏈接目標 -->
9 H$ ]# T J+ b7 V/ M" N6 c<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font> % \0 @/ q* l4 f* D( y3 D
<!-- 顯示部分詳細內容 -->
" Q7 I1 T0 ~* R4 [* T2 g<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>
( G: I1 L, S4 ~4 d- v<% 1 n6 p% g+ a8 m8 l6 s5 N
RST.MoveNext . @( k- R: s) p0 d* T9 A4 [* I
Wend 3 X9 J; ~* F" `" ~
RST.Close - D6 `, e5 F# t
Set RST=Nothing ! D( h& O; T2 f: v! d5 h4 Z
End If
) p2 I- L/ c4 r, rEnd If 4 V+ e; h5 x3 t4 y
%> | 2 O2 ~$ g, {% n5 n6 T: i9 l
在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:
7 z( _! S2 w) G以下是代碼片段:
9 t- d: z8 Q+ e6 ?( k<%
: A/ f" y( ?* D, KFunction AutoKey(strKey)
?) j2 z4 E; ?3 ^( z% GCONST lngSubKey=2
. n5 m4 e+ |( K& E7 hDim lngLenKey, strNew1, strNew2, i, strSubKey + U, t* u; s( ?3 o. \
. X! h! r, ]0 e1 k# \5 I4 G』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。 - W7 x, i* W$ R. M7 i
: w2 B& ]: b$ E W H2 F8 tif 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 4 l/ I. q/ ~6 R4 i
Response.Redirect "error.htm" ) F2 B# g7 c# X: E7 d
End If / b: l: F. m$ B5 m5 s- l
lngLenKey=Len(strKey) 7 f7 Q$ v7 b5 a; |! c4 N
Select Case lngLenKey
0 t S; M; C9 s: b6 d& jCase 0 若為空串,轉到出錯頁
z1 S; _1 ]& [. l% P3 RResponse.Redirect "error.htm"
8 `. w. {' g# h1 b( JCase 1 若長度為1,則不設任何值 . u) }" U: c& c0 k% I" w9 {4 H
strNew1="" / L9 H. }- y" ?+ N- Z. G
strNew2=""
; n2 f5 G5 w" ~1 K$ @2 ]% x』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件 6 d3 E+ @) o! f4 y% K
For i=1 To lngLenKey-(lngSubKey-1) " v% E9 _4 z- k
strSubKey=Mid(strKey,i,lngSubKey) 1 D7 e) Q/ x: F0 B8 o. P+ e8 W
strNew1=strNew1 & " or U_Name like %" & strSubKey & "%" 5 T1 z3 D' S2 C! @9 {
strNew2=strNew2 & " or U_Info like %" & strSubKey & "%" # J( [7 U! r' |8 c% {+ B# F4 Q, j5 z
Next ( n, w U9 U6 i. N! B9 m& o
End Select . e3 S" |% Z+ ~4 w7 W
』得到完整的SQL語句 ' H6 x9 N2 x+ u2 u/ ?) h, ]7 x
" S0 {8 V" J" u* X+ p+ {4 v8 F1 W; FAutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2
# g. o4 F+ p! d5 _7 mEnd Function
' e, ^! A7 D; X: G. m%> |
要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。 最後,別忘了將數據連接關閉,以釋放資源。 * k0 i2 y" J0 R4 C. P
以下是代碼片段:
) A5 O$ ~2 X- a" J2 |<%
% T: w6 Y* j9 c5 X0 U- ]. D7 z( RCNN.Close
- K3 P8 m( q! S, ZSet CNN=Nothing ( O* n/ G9 O! b5 e( S2 X4 [1 m
%> |
至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。 |