用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。
6 n1 o0 d( K' m5 q; ^第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段: ID 自動編號
$ z4 a& g0 Z/ t/ F# P U_Name 文本
* }7 J2 `( ]: ~$ w, Z, |( G U_Info 備註 第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下: ! _+ ~: t( s3 Q2 s+ d
以下是代碼片段:
+ x0 V; T1 l8 r& K* T9 d& k<!-- Search.asp -->
0 V; o3 I6 ^( v/ r9 K<form name="frm_Search" method="get" action="Search.asp">
4 j! C* e: A4 P% ]$ e請輸入關鍵字:
9 t2 Z7 j- b( I. ^/ o<input type="text" name="key" size="10"> & `; g m9 K6 _0 S0 K
<input type="submit" value="搜索"> 7 w' I0 i- n+ M- d
</form> |
下面,就進入了實現智能搜索的關鍵部分。 首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:
2 _& `/ T0 v; N2 f以下是代碼片段:& |" h0 `! y# l" `- l
<% : f) T9 U Z0 z E6 _5 N- R$ ^- P
Dim strProvider,CNN 1 R' {" _7 K4 d0 N/ @4 Y0 q
strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" " g% j& k* |" K9 K7 t
strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下 # }- F9 b* B- E$ e% e
Set CNN = Server.CreateObject("ADODB.connection")
; }- ~/ `' A- u1 [5 O CNN.Open strProvider 打開數據庫連接
: b& F* v# Y1 Y# ?# Z5 k%> |
接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。
/ A' I7 Q4 M* ~, c$ O& o# b3 _; o# Z& \" f: a- O2 v
以下是代碼片段:
P* L& i0 k" d! \/ U+ v* F<font color="#FF0000">未找到任何結果!!!</font>
; a- t Z2 H3 _8 O- H<%
4 |( P* @" p z7 {4 n: X' V* hElse
* b9 D% F& o' p. o# C4 g%>
) \) N1 A1 O3 }1 T H% z; m: [0 x搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>
0 ?, O* Y$ v8 ?9 q! ~8 w( ]<% 8 _5 `4 Y% p% y5 H# q
While Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接 k% [" S! x% f/ U% [8 K& E/ w7 b
%> " P- O Y$ B% }6 _' t
<!-- 此處可設為你所需要的鏈接目標 -->
( e9 I7 j" D: ]2 i% v* A<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>
8 [4 }7 h1 c4 s8 b<!-- 顯示部分詳細內容 -->
o1 Z" w: {" N; t, ?7 |<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>
" F0 \/ g9 X- v9 w# l% a- w<% $ B! k& S7 q# N2 e7 j7 P5 \
RST.MoveNext
. h. R: g A+ m; @) T% @: j Wend
2 e) I, Q) B2 I' i, d RST.Close
! C% a! N* @8 h* [ Set RST=Nothing
6 H8 o- K% M0 }5 x, b8 w; ` End If
! f, a O" d5 C4 b/ `9 b% Q9 dEnd If 8 v3 t. f$ G ]3 q
%> |
" ]4 }# h/ D+ C# m0 S$ H$ v 在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下: 2 a* k0 V0 i7 u* {3 x
以下是代碼片段:+ Q7 ~: Q; B# W+ Q
<%
/ K( t, ~. P5 W' w( A; k3 `Function AutoKey(strKey)
: c$ {0 Q. u1 s% v2 g: l" p2 }CONST lngSubKey=2
- H8 q9 h; g. d) uDim lngLenKey, strNew1, strNew2, i, strSubKey
# {$ A. Y$ W9 v
/ o& Y# h7 ]+ q$ r* D& x3 U』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。
" U! I" {9 f" U# _3 b; b) |7 c, X i2 s" }( b/ ^' b" E
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
7 m! Y, \3 E* C \& Q. GResponse.Redirect "error.htm"
; U6 C, r9 b7 X$ ~0 w9 ^End If
/ F0 d% G* X1 C3 ^lngLenKey=Len(strKey) ) l, U# i% S( D" V9 N m" H; y5 }
Select Case lngLenKey 1 _$ ]3 d" F# c0 U% q
Case 0 若為空串,轉到出錯頁
h$ E$ ^# E( ]; wResponse.Redirect "error.htm" 3 Y' e% I" L0 A- o: C' b$ r
Case 1 若長度為1,則不設任何值
9 S5 V* N& }% |& P' ?8 F, MstrNew1="" + b/ I" J. T' Z C
strNew2="" . Y6 \5 G$ H* x4 ]0 ^
』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件
/ ^( ]) I# [0 ~! cFor i=1 To lngLenKey-(lngSubKey-1) " d6 c* |8 X2 _& I- [5 u3 l
strSubKey=Mid(strKey,i,lngSubKey) $ w, K- ]( e6 |9 h9 e
strNew1=strNew1 & " or U_Name like %" & strSubKey & "%" ( Q! e2 u6 p/ l# p
strNew2=strNew2 & " or U_Info like %" & strSubKey & "%"
; p/ l' M! H; dNext 1 K) ]- o# b3 ?3 o& D. r( g
End Select
0 y# W! t4 N, _. b) y( r』得到完整的SQL語句
& R$ y( E3 [; F' d4 R4 x9 A% S5 V
( S \& L: D7 |1 m7 DAutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2
" }5 H6 q0 s" E/ q0 T! Y0 B& eEnd Function
( R% f( M* S; [- V* @%> |
要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。 最後,別忘了將數據連接關閉,以釋放資源。 ! I7 m$ B! r. G7 y2 M3 \
以下是代碼片段:
5 P( J7 h4 i+ g; j U) m) u) ~<% / }- p" g* V4 Q) H0 P
CNN.Close
j# v& z) Q0 w+ I# C, \0 Z9 T) C9 vSet CNN=Nothing
$ Z6 p) B4 d" j( F2 R$ l2 _%> |
至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。 |