用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。
0 ]3 q7 ?4 p% ?$ y( A8 |6 w第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段: ID 自動編號 ) M, W; U2 ]& }7 J% u/ S
U_Name 文本 , P, E- ^* C* j
U_Info 備註 第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:
- Q3 B2 S# P7 i3 H/ u以下是代碼片段:
1 a. d3 @9 o' _: b: C4 v- p<!-- Search.asp -->
9 i5 Z5 Q2 o, o! K9 ^- q<form name="frm_Search" method="get" action="Search.asp">
0 Z. p- J+ ^& O( {! j# [8 L請輸入關鍵字:
2 a- a9 o, a8 _<input type="text" name="key" size="10">
& L/ ]# k8 ?2 c N# B<input type="submit" value="搜索">
7 ?! @8 \; F9 l1 A5 A: k' a</form> |
下面,就進入了實現智能搜索的關鍵部分。 首先,建立數據庫連接。在Search.asp的開始處加入如下代碼: 0 O4 s) W- O) O$ \4 n3 B9 _8 l3 h8 V
以下是代碼片段:$ s9 q, t1 m1 r" o3 c: s% m3 a
<%
+ P5 W. l$ N3 f1 [; G7 Y Dim strProvider,CNN
8 o0 d6 D' K: b5 `. C7 x, O strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
- A2 v% f* w" I" w/ @6 M strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下 . A( P) U9 U8 e+ Q, N
Set CNN = Server.CreateObject("ADODB.connection")
" k3 l$ y1 j! \( L CNN.Open strProvider 打開數據庫連接 0 n2 w9 x: q, d+ D' F8 L& p
%> |
接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。 ( ?* P* P' H* t
7 m& }" |" D' R0 Y
以下是代碼片段:+ X" u9 W; N# Y# | V6 m" C% r
<font color="#FF0000">未找到任何結果!!!</font>
9 Z' x: J. q5 l$ u' g- e( A; H<% 2 S( r. y2 O4 l9 ] t5 D
Else 3 v- r8 a( H, z4 C0 i
%>
* @) K& C/ j# `: w/ t搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>
; }+ F) l4 }& e<% ) Z; {! V5 A8 z5 d- Q( Q( Y% n
While Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接
9 ~) M" q8 j. n" z7 ]%> & ?: o( F, q) Y/ H0 [
<!-- 此處可設為你所需要的鏈接目標 --> ' v( f) k# ~. j
<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>
- A6 T4 m. g4 t" O4 v: f<!-- 顯示部分詳細內容 --> * j: m. e3 b$ u1 c; k& t
<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p> Z) @. F$ e6 K" w" N5 @8 \3 n9 o o
<% ) t) A+ q: w" g
RST.MoveNext 7 i$ S8 I5 I0 p: C- j& h
Wend , ]& s3 n, Q! C
RST.Close 8 H8 s# ~- e2 s" r a! s$ a
Set RST=Nothing
5 q4 s! Q5 P$ c4 C End If $ }. |! d8 f* x: F+ @
End If ; I; i( o9 @: i a R/ |5 L. o1 K
%> |
7 C( f- x4 ?2 {) n 在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下: 8 w/ H; |1 B3 {* Y: Q2 ?
以下是代碼片段:
: Q- g; s9 B+ ?2 g/ p" k<% 4 Z: w5 q' M- \9 W2 T$ K
Function AutoKey(strKey) ; R1 {1 q H Y! p
CONST lngSubKey=2
) \! m/ c1 n5 S$ e1 {Dim lngLenKey, strNew1, strNew2, i, strSubKey , W3 z: T' s: P) C6 f( ^
0 u+ V8 g7 b$ }5 l/ d- J
』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。
2 W X& x7 e* G
b) a( t, M- Z" [' g8 m* e$ i6 {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 ) ]; I9 W# l9 w7 b! r6 _
Response.Redirect "error.htm" * `3 W2 ^+ O7 q& n
End If
; q6 H4 @7 k( Q0 | N$ qlngLenKey=Len(strKey)
' @# C/ h1 s0 |4 X9 f; u& Y/ GSelect Case lngLenKey 8 g0 V$ \- |* j8 R9 k& a
Case 0 若為空串,轉到出錯頁 0 ^; q" X3 J# Z- ^; l; A
Response.Redirect "error.htm" d# A8 V* b# b
Case 1 若長度為1,則不設任何值
, f4 C! J7 R7 z) |* M& I7 { JstrNew1=""
% V6 u$ Q& }, X! w7 F# h! P+ \& cstrNew2=""
/ h$ R+ _2 z4 ^. F』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件
: d2 n) u) M+ _5 F* Q" f3 |For i=1 To lngLenKey-(lngSubKey-1) 8 U& ?2 |8 {, h2 U7 I
strSubKey=Mid(strKey,i,lngSubKey)
# e' k( K; S2 s' AstrNew1=strNew1 & " or U_Name like %" & strSubKey & "%" + w9 s0 W2 l- R9 n# d( ]- C" K
strNew2=strNew2 & " or U_Info like %" & strSubKey & "%"
9 b" B6 b3 |" {3 X# C v+ F2 ~( cNext
) f( b3 a9 i9 OEnd Select
/ q" |% p; S: L' y; o$ r』得到完整的SQL語句 . m# |7 @4 R! Y6 D9 C
5 H; v: { b* S3 ?9 }AutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2
, q# b, q }; D8 f1 u6 I& YEnd Function
: G5 o- C0 K" N V9 [%> |
要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。 最後,別忘了將數據連接關閉,以釋放資源。
, e+ Q1 z: q) M) i" Y' _, R& U" p以下是代碼片段:5 j% J2 f. d, e0 o' O$ S C
<% 7 Z! ~- I$ k$ `: Z* a# f+ i
CNN.Close : C6 p% F* d6 h. z2 t( O
Set CNN=Nothing
# A' O* H9 z+ g. N3 ~2 e- X$ s9 N# g%> |
至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。 |