用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。
0 {: o7 V) M/ R第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段: ID 自動編號
$ ?3 q, d, g; z! ?! m, Q. e1 b6 u" n& O U_Name 文本 ; g# k4 }* D g/ t* J
U_Info 備註 第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下: ' j- a7 ^& j, g! v& E4 W7 m
以下是代碼片段:
4 [. F- j" t5 H) Y" c* f5 n<!-- Search.asp --> 2 _. Y# d8 d' W( }. X
<form name="frm_Search" method="get" action="Search.asp"> 5 q" Z, N; q: O4 G- @9 L( }; X
請輸入關鍵字: @6 q6 W/ o+ `9 i; g: \4 c
<input type="text" name="key" size="10"> $ G+ f$ i ^0 E) M. S
<input type="submit" value="搜索">
: ~# b# d) u/ Y7 _: h6 T' ]</form> |
下面,就進入了實現智能搜索的關鍵部分。 首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:
8 H" D8 D5 P! @5 Z2 s' p以下是代碼片段:
3 P8 h4 `: a8 |" g<% 8 o1 R: H" Y' c3 c3 R5 V' n
Dim strProvider,CNN
' M: e7 Y0 A# M: i1 g strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
& q- K2 c8 Z! D strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下
) F z, p* f, G2 t1 C Set CNN = Server.CreateObject("ADODB.connection") 8 m) g8 D4 D5 D
CNN.Open strProvider 打開數據庫連接 # e2 `- t+ H; }; b% ]2 w+ @5 ~2 J9 {
%> |
接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。 ! K9 f+ `0 I4 J3 T& r) B
% r( r9 H+ Q9 a8 t以下是代碼片段:
) S3 T1 p) _5 S, ]* \" M<font color="#FF0000">未找到任何結果!!!</font> & v1 a$ b. \7 H
<%
; j h2 }5 J6 J4 K, \Else
; h# J+ E; w# \9 c& U%>
, q0 D/ }4 L2 v3 E y搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>
" v( `7 d# g5 b& W<%
' I1 M) }2 M0 A9 c2 ? j% x/ ?3 xWhile Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接
; i0 ~4 ^- J$ n2 ?%>
3 S' J; z3 @0 @# d' p& c) ~<!-- 此處可設為你所需要的鏈接目標 --> * j) D l0 a+ F$ d
<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>
# s' X7 A# `# @: t+ C<!-- 顯示部分詳細內容 --> 5 V6 g' _. M ?! ]+ `
<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p> # L1 D! |6 W7 ~. `' |* X# L
<%
7 W% R3 c* ~4 G0 l$ S+ D- { RST.MoveNext
C: u! |8 O' ~3 R Wend
" _$ e5 a6 b8 M8 q. s8 @ RST.Close 6 T1 e/ Y1 v$ {1 A: N# w3 X
Set RST=Nothing
2 M$ P. @4 Z: J- }! ^/ n+ @" [/ E End If 2 l5 w3 p) C& `. t$ ]* O7 y
End If # r) w* p6 ^: q9 W
%> |
/ U& W) }, ^: Q8 s 在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下: . c+ R7 d/ A3 T5 G
以下是代碼片段:
/ C' c2 D0 a* J s" Q$ L+ T<% % S5 a4 J: t& {. q! O4 J0 @
Function AutoKey(strKey)
s; o) k# F( U# U' lCONST lngSubKey=2
, c8 g2 j6 q7 \- r2 ?# gDim lngLenKey, strNew1, strNew2, i, strSubKey
/ `3 i5 K( p! p6 o1 Q# C
' C' Y. y# o1 V$ a- }』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。 7 Z. A4 V$ t- {) d4 }- { u
3 {- B/ i* Q' O7 Qif 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 ( h d7 X% I( e4 A2 H* Y0 s
Response.Redirect "error.htm" . ^ Z" \" F. \0 a6 u. V0 N9 L- w
End If
z/ ]8 v! ~" w% Z5 e2 glngLenKey=Len(strKey)
: {# A$ l' p2 I% B7 J+ }Select Case lngLenKey
~( `; u+ { C4 ]Case 0 若為空串,轉到出錯頁 # Q s/ ?/ X4 [5 Z
Response.Redirect "error.htm" $ X w" x9 H& \* F& z' A' }; m3 p
Case 1 若長度為1,則不設任何值
3 f$ c9 }$ o) m; q( o6 g3 TstrNew1="" % @+ S5 l8 h/ D% F2 _
strNew2="" ! ?: _3 T' }4 {3 J
』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件
$ h8 O7 _8 t3 V; x- ~For i=1 To lngLenKey-(lngSubKey-1)
# Z0 [1 h9 e8 e0 z! F' f, MstrSubKey=Mid(strKey,i,lngSubKey)
: r* |8 x7 s- C& rstrNew1=strNew1 & " or U_Name like %" & strSubKey & "%"
- U: v+ _" ]% {2 E% \. ]( p7 ]strNew2=strNew2 & " or U_Info like %" & strSubKey & "%"
8 F; [- u _ FNext . T5 K) w1 Q* {, X0 @4 S: C
End Select
7 d. _4 c0 }$ J% F! G+ D+ u』得到完整的SQL語句
% c" V+ U5 z2 |1 R, k/ K4 T+ n( O5 @( c6 c, W9 U+ q" r
AutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2 * t! R' {3 D& m1 G& C$ ~3 d
End Function
8 T( t l0 M$ [" H; ~, U% ^%> |
要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。 最後,別忘了將數據連接關閉,以釋放資源。 * _) @+ Z* M; L& x9 z
以下是代碼片段:0 N4 q) S, C# w5 Z4 P* a1 R
<%
% t1 w4 U' a& V- MCNN.Close
; p/ V$ ^4 M8 b! k# iSet CNN=Nothing
B1 @) n N! V- S%> |
至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。 |