用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。
+ z, ?6 p. s0 w* z% a: X1 s第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段: ID 自動編號
4 i. S% w2 r: Y# T7 q% U0 w U_Name 文本
4 }% [/ \9 T& f9 X* K U_Info 備註 第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下: 6 Y" E9 K/ C9 Y/ G& `% F5 ^
以下是代碼片段:. n& B* m q) e
<!-- Search.asp -->
% y/ {( \1 _% a7 d# w: n<form name="frm_Search" method="get" action="Search.asp">
3 J6 B+ r8 T# G" B" b請輸入關鍵字: 1 i! e& K, f" A4 D( @
<input type="text" name="key" size="10"> ! X& t, O6 K c; z: S `
<input type="submit" value="搜索"> 1 v" J+ \) v- Y f" _
</form> |
下面,就進入了實現智能搜索的關鍵部分。 首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:
; p9 Y9 f7 G: z& ^; v0 i( e以下是代碼片段:: P3 n9 e" q! B# H, ` m6 ^2 q# u
<%
* R4 W) `0 Z4 D0 D Dim strProvider,CNN
" \' l6 n% C' K) w strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
0 D$ L' @6 L5 k. W* c8 a- Y) r strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下 0 U8 d& |* @2 ^2 Z5 L/ s6 h! n
Set CNN = Server.CreateObject("ADODB.connection") ; u8 g/ G4 N5 G: X* _6 F% H( e& X
CNN.Open strProvider 打開數據庫連接 + n e$ Q. J% w9 ]/ M7 Q! o- D
%> |
接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。 ( q* h' o6 w/ m/ G; K6 n
- U, I3 ^: v7 ]1 B' T( M( _, ~以下是代碼片段:
/ }% x5 S n8 d- Y( f' l' u<font color="#FF0000">未找到任何結果!!!</font> ! k! L. n" r; e8 P+ G! @# `- ~ _
<% 3 \( ~* k# u/ V! n! U0 o
Else ( }. }& [+ h7 x3 Q1 ?1 C
%>
! s3 X/ e/ @ C# l9 f搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>
" l: P' R# u9 L& W<% 8 y8 d. i- C6 f% G9 W
While Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接 + T( c2 `% c7 e( M4 e- t
%> 1 n) L. E' i. {. c
<!-- 此處可設為你所需要的鏈接目標 --> " h3 L$ l0 `8 j/ q1 |
<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font> 9 s& F/ V- \ B/ F
<!-- 顯示部分詳細內容 --> 4 E7 D: O* v1 j' r8 P
<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p> ) g- a( n( K% ]' M
<%
7 r2 C8 R' @, x: V. t9 t RST.MoveNext
& r" R% e- B3 Z% U F: O Wend + ^1 G+ |" x, r
RST.Close
; W' \* H R* n7 J) H Set RST=Nothing ' c; F, S- S) c) m5 m u
End If . M4 H0 t5 ?+ O% F H' ^# s
End If
% ^( T1 V3 s/ w% b* c5 r%> |
1 x" ]" r; ]4 X) N+ `- _' P, G. k 在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下: ) q- |- G4 d3 Q0 Q+ V. e
以下是代碼片段:
: Y- e' [; }8 k* J8 z. @+ ]<% ' l9 A2 F E2 @ }& W* \" n
Function AutoKey(strKey)
! z- Z* [ r4 H/ u1 Q9 S* ^% SCONST lngSubKey=2 " m) l9 }! t% T) f8 \3 f
Dim lngLenKey, strNew1, strNew2, i, strSubKey
, a2 Q7 V' t8 O+ ]* n3 E" q' w5 L p, L. i- R1 Q7 w8 x ?
』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。 ( A' y9 G/ P3 ]6 ~8 g
# I6 Z W6 U# k
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
# j! D1 _* D: h6 F! c9 IResponse.Redirect "error.htm"
( H( ~9 t5 g0 B. V2 n# ^1 l# SEnd If
/ I0 o( i; H8 _& b2 u3 C# F C: i3 C0 wlngLenKey=Len(strKey)
, v J% o; _8 G3 R$ `* lSelect Case lngLenKey 8 t$ W0 q1 Y9 U4 k5 G
Case 0 若為空串,轉到出錯頁 [/ }( x1 r8 b
Response.Redirect "error.htm" 4 J. t3 X9 A! T" x* |
Case 1 若長度為1,則不設任何值 * [* K6 ]3 q- }2 G, L0 t
strNew1="" 5 N; S% \8 D/ H9 m. N# N9 P0 o
strNew2=""
: X; A# s( |& p& c』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件 0 m) [8 @# L1 A' Z/ i9 ^ y
For i=1 To lngLenKey-(lngSubKey-1) ^ \# @+ q, L( d- O: X
strSubKey=Mid(strKey,i,lngSubKey)
+ p& Q8 Y( T1 k9 a' wstrNew1=strNew1 & " or U_Name like %" & strSubKey & "%" + F. a5 f+ h% _/ H4 N
strNew2=strNew2 & " or U_Info like %" & strSubKey & "%"
3 z" Q; L: g$ S) r. NNext
( e) R( O, p5 r, E' KEnd Select
/ y5 E- `5 z6 q% P. q. } I5 t』得到完整的SQL語句
; w3 C9 Y. ^3 c
2 j9 ]) ]5 J# oAutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2 8 @) w" J. W! G3 H1 y
End Function
* @$ q; @) g8 M! n( M6 X%> |
要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。 最後,別忘了將數據連接關閉,以釋放資源。 + X( ` X0 q- G
以下是代碼片段:
" X( R3 G. d& B% G4 J' Z$ H( `& e# {<%
) Q0 }. [# ?$ S7 VCNN.Close 7 C" _6 ~& C8 v- R( P
Set CNN=Nothing
K. a2 y' G* n1 h%> |
至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。 |