用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。 1 D' L$ \- e. N5 T. P2 z, N
第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段: ID 自動編號
\' _; ?1 x) ] U_Name 文本 * e7 l) [( R6 B; T4 O/ o; I. ?2 S
U_Info 備註 第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:
+ h! Q$ g2 H8 @5 D以下是代碼片段:
7 b- E+ r1 r- O6 c0 w# a<!-- Search.asp --> * X, } _- [5 U: L k0 d& o, L
<form name="frm_Search" method="get" action="Search.asp">
/ `% ^: i- I+ D. S/ v請輸入關鍵字:
# Q& i* V+ w. l- T<input type="text" name="key" size="10"> 0 N1 ]3 h+ a& p2 e! l0 f4 t0 ?
<input type="submit" value="搜索">
) [1 {" ~% Q& D* t; a' i% a</form> |
下面,就進入了實現智能搜索的關鍵部分。 首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:
; t7 L# Q4 Q% M1 Y以下是代碼片段:* b. Z& r2 C! M, T* d1 W6 S
<%
8 l8 D5 V# k6 l0 L# b3 C Dim strProvider,CNN % T0 Q! [) D, P
strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
: E! N1 |6 g, ]+ \$ z strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下
3 H) d" O2 q* ~ Set CNN = Server.CreateObject("ADODB.connection") - v4 A0 N0 d7 d0 I. ] E! B" X
CNN.Open strProvider 打開數據庫連接
/ \- @' }. L8 d h%> |
接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。 3 m+ w$ N" B9 Y4 r) h
' U: t. K! J8 z* F$ V+ M以下是代碼片段:
& M# V% \: F% b& ^9 m( I* @<font color="#FF0000">未找到任何結果!!!</font> 0 j8 S+ }8 ?# D. m8 t/ M0 ]
<% * U9 D0 }9 G4 }- y
Else 7 ^/ @/ j, ]% C- |: ^; Z+ K% n. m
%>
8 C E% C: P% r搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>
0 T H: D; s. ]/ D/ V<%
/ r7 m' L: G. q* V9 j8 hWhile Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接
+ z$ K$ ?8 B1 P9 Y1 B%>
3 Q; B- ^* [2 p$ W, O$ t {/ P<!-- 此處可設為你所需要的鏈接目標 -->
: \4 {$ b# f6 o7 k9 D3 F9 o) L3 X<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font> 3 n/ Z0 n2 r1 Y( o# U C
<!-- 顯示部分詳細內容 -->
|) b. f% v/ F) l* r5 s<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>
5 r, H: o1 A3 G" K<% $ L' ^, Y8 e6 n) n2 o% l
RST.MoveNext ' ~5 A) }( p+ l4 G$ Q
Wend 5 {8 U5 V, W0 Z; T0 D- S- H* Q+ E
RST.Close 6 P; R9 `7 v @0 I# b$ f
Set RST=Nothing # P; s" |0 e8 Z5 R
End If 3 b: ]* m9 t5 q& f& L: q7 D+ J
End If 5 T) d: L) o2 R/ w" w- s2 j
%> | z2 \9 q7 s& Z9 s4 Z X7 g; \4 o
在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下: , M2 b% C) L. K0 B
以下是代碼片段:
2 `" ^7 o* Z% G<% 6 H( A% ]* [. }* R# \
Function AutoKey(strKey)
" w5 X$ o/ V3 ^9 {; M; A& FCONST lngSubKey=2
6 I$ t- z4 n$ E8 Z# I. }Dim lngLenKey, strNew1, strNew2, i, strSubKey
2 V0 G7 X& \! `" F$ Q2 B1 N
& ]+ j5 V; p4 W! F』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。 . j* s$ Y/ Z. P: ^
+ Y& u! E9 s1 k w ~. a( {- C
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 % m- \' u' o7 o0 Z, k
Response.Redirect "error.htm"
( r, @9 r1 I: G9 Y8 R6 eEnd If
" N+ p5 ]* `! B3 b* glngLenKey=Len(strKey) $ p& @' T+ d% \
Select Case lngLenKey 2 s* \1 N) h# ]* k$ n4 T
Case 0 若為空串,轉到出錯頁 . T! M T% L* ?5 T: c6 w; s
Response.Redirect "error.htm" 0 g- u, K' X9 N+ _6 P% v
Case 1 若長度為1,則不設任何值 / U& }: N( ]. x. g- w
strNew1=""
! ~5 H: V0 A- g" d- v4 bstrNew2=""
6 X( H6 R2 R- i6 I9 G0 a v』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件
7 B0 e: d( x& w! CFor i=1 To lngLenKey-(lngSubKey-1)
+ Q4 f# ]3 @3 n5 ?, G% dstrSubKey=Mid(strKey,i,lngSubKey) & D' S% P7 `$ Q4 C! E
strNew1=strNew1 & " or U_Name like %" & strSubKey & "%" ! e9 X6 A' A3 ^# B* P
strNew2=strNew2 & " or U_Info like %" & strSubKey & "%" 8 E9 ]: n9 ?" x# ]9 X3 B) S
Next 4 g( Y) c8 [# t/ F+ g* w
End Select 2 ]; e+ C/ ^9 @
』得到完整的SQL語句
6 D1 T0 p- ^: Q. B; m3 i7 K4 ]
, I0 J% Z3 R2 Y+ f5 FAutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2
8 c# x' e# n# uEnd Function
- `9 z, g( @' d. b Q8 c%> |
要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。 最後,別忘了將數據連接關閉,以釋放資源。 ) Q W3 d v* X. `
以下是代碼片段:& K( h9 }9 f- T( G5 D% M0 \. D
<% ) |& L: l0 ?0 E2 E/ r/ N
CNN.Close
+ P, e* ]7 e. d J) B: USet CNN=Nothing
1 x9 k2 s/ H& x \3 s+ y%> |
至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。 |