用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。
! i& y3 j" W) H* A* H1 q第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段: ID 自動編號
- {; b% m* v3 j* {9 w( | U_Name 文本
( S G; n. e W. N8 j U_Info 備註 第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:
6 k; f( B/ i n, }( r7 o& X: s以下是代碼片段:. o4 D4 S$ Q1 T' h3 }7 g
<!-- Search.asp --> 0 a9 H3 m$ ^( E5 ^+ m' l* [! y
<form name="frm_Search" method="get" action="Search.asp"> / d- l/ i/ l6 [
請輸入關鍵字: # p$ i6 M a7 O( j8 d4 E a3 R
<input type="text" name="key" size="10"> " {4 t- i+ u- X) B5 C% t/ B
<input type="submit" value="搜索"> # L+ p$ Y( | Y) G
</form> |
下面,就進入了實現智能搜索的關鍵部分。 首先,建立數據庫連接。在Search.asp的開始處加入如下代碼: : d1 o4 q' n0 H; S( J- [0 G
以下是代碼片段:
! {1 v1 e3 w* b, Y<% 9 f' I* m" ~' t$ ?; {1 v( j
Dim strProvider,CNN
+ `, W6 L# s9 w1 R c; K& c strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" ; z% W K0 h& t
strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下 1 u. M/ f4 p; A2 M: x: P0 U) u: X
Set CNN = Server.CreateObject("ADODB.connection")
/ t2 W, V0 ?5 ~% W4 ^& V/ K! p CNN.Open strProvider 打開數據庫連接
) q, K. c# X. z& L+ w%> |
接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。
3 j2 l8 y ^9 ]( `- b% Z
3 Q* r/ X6 O& M* {6 F8 ]; W" v以下是代碼片段:* E$ W, m# V) t5 @" ]
<font color="#FF0000">未找到任何結果!!!</font>
5 A# `, F8 I, e+ z6 p, J<%
, p& F' c0 r: k7 l6 pElse
# o# b4 g4 ^4 A) Z. }* I6 E%>
$ k4 a9 f) {- |+ c- a1 [' S& J) ^搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p> ! `) }: Y% i$ g3 J! b0 e
<% ( {9 m: Q0 c3 s& g- {7 a* {8 K
While Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接
; G/ I2 F8 X" Y" J% v- R%> 0 L0 [/ i$ U# }3 J) }' Y. ~
<!-- 此處可設為你所需要的鏈接目標 --> & U/ {) b, J! Q8 Z5 n) N, n; T
<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>
* s6 y) t& x) I0 \<!-- 顯示部分詳細內容 -->
5 W2 _5 N T5 N+ @6 p+ x, k$ ~<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>
$ m) @5 |7 V+ S0 J% o<%
# J7 k: k I) u- l RST.MoveNext 5 u; t& q9 i) x% v, E% R, t" w3 ^( l
Wend $ ^0 ^$ h y" P/ J0 e
RST.Close
" b/ c; {: R7 a: t& u, W. W+ N% c: | Set RST=Nothing
, c/ ^) R, y; u% d7 N% ~5 l8 e& d End If
7 X# V* z. _! L$ R7 ~2 gEnd If e% i$ n5 Q1 ]' I# |
%> |
' J' v5 Q# q( v 在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下: # G' J) s3 E. O b
以下是代碼片段:+ j. W& x9 G% O: T' }! n" E
<%
$ W, F* w, f; F. O0 F: M' E. b* AFunction AutoKey(strKey) 8 A3 ], M& F2 {, W3 t( j
CONST lngSubKey=2
+ m5 J1 w' j4 e9 d' u" P3 M; yDim lngLenKey, strNew1, strNew2, i, strSubKey
2 ?2 p* @/ i$ `7 ~( W
2 M# d8 J, ]6 Y9 U$ [9 f』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。 # c8 M, m4 ~2 p! H* Z
# {- {6 I$ V+ wif 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
# y9 A7 g% O' D$ z) MResponse.Redirect "error.htm" ( P3 G2 t0 s6 [4 w8 ~, c
End If . Y& X* a. \5 B; w6 Y2 F
lngLenKey=Len(strKey) ; g' T$ I9 r( T5 \3 f8 ^
Select Case lngLenKey
" H& Y5 M- `: Y1 C$ s. H6 l/ V% s8 rCase 0 若為空串,轉到出錯頁
# F q6 T5 `/ @7 }8 R; H9 oResponse.Redirect "error.htm" 5 q- _, c; @( C, o7 y3 S
Case 1 若長度為1,則不設任何值 9 C7 Z# o8 c/ O8 z* Z
strNew1=""
- P" w0 `( ? XstrNew2="" 1 I. e) b6 Q% P5 d& z3 r
』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件 ; L* P9 j- E( a" m) K
For i=1 To lngLenKey-(lngSubKey-1) ( s1 c: p0 [4 K$ b2 b' r9 P
strSubKey=Mid(strKey,i,lngSubKey) & e O9 S2 e: P! q* c, \
strNew1=strNew1 & " or U_Name like %" & strSubKey & "%"
$ C7 {- W+ S i3 astrNew2=strNew2 & " or U_Info like %" & strSubKey & "%"
7 ^6 b `1 t7 `) o* e. iNext
: B2 ~" e/ q9 E% X3 OEnd Select ) u, ]4 `7 _$ D# k+ D3 F0 J e
』得到完整的SQL語句
% V# b) u6 t* \7 d( ?4 g3 n0 T! d7 A. |5 ~, q6 g+ s' M
AutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2
- E v* n6 Q6 ^& h2 V! j* pEnd Function , f1 A. a9 e7 L0 }8 H, s) f) U+ ^
%> |
要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。 最後,別忘了將數據連接關閉,以釋放資源。
$ P9 j$ e, J* {2 N7 Z* M以下是代碼片段:. V% e$ ^: ?1 e, K* E7 u0 f
<%
/ F8 M2 a6 K/ D1 v: M% QCNN.Close
7 I5 ~( e3 w5 V q3 MSet CNN=Nothing 7 o0 ^8 P7 [+ C9 h# w
%> |
至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。 |