用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。
& b- {- t$ a4 c) L% ~! P" W' }第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段: ID 自動編號 ' y! Z( P$ T5 a! c6 a* F' Y
U_Name 文本
" k7 o9 I# I5 ? \ N U_Info 備註 第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下: : E' X6 ^. F1 P4 S/ z
以下是代碼片段:
: Q. `! z) c: I: L<!-- Search.asp -->
* O6 K8 b/ ^2 p& I<form name="frm_Search" method="get" action="Search.asp"> ?1 c9 _5 l6 g9 a- N: |
請輸入關鍵字:
) ^1 k! P0 f, O. K8 [<input type="text" name="key" size="10"> $ J m8 ^; k+ m' G9 E
<input type="submit" value="搜索">
( S3 y; d- G& j+ E: \7 Z</form> |
下面,就進入了實現智能搜索的關鍵部分。 首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:
2 |$ l5 z2 J1 r/ Z3 W: q4 C以下是代碼片段: k/ ^& @' K' ? A( H# N, M
<% - H5 r& g; b5 t a$ O
Dim strProvider,CNN
! p1 K/ z2 O7 k* S( O9 c strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
: A: n" ?4 ^( B& I* w9 a strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下 9 z3 R& K1 M0 ~9 q6 U3 w
Set CNN = Server.CreateObject("ADODB.connection") : l$ ]5 [( p# }. V
CNN.Open strProvider 打開數據庫連接 $ o( |/ A0 }# d$ F
%> |
接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。 5 f) ?$ Y4 J' H: G0 Q5 t) u
4 J4 @2 q) ^9 F( X7 G
以下是代碼片段:
# M* r& E. M3 N* B; u4 G2 z<font color="#FF0000">未找到任何結果!!!</font>
, b9 [+ D( Y! B* }3 g8 g9 X+ H' }<% 1 x0 ?4 w+ R1 ]. a# d7 v0 m
Else
4 ^# R( |* Y& }; x%>
) y+ C* I, E% u1 {4 F- W9 M9 a- v搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>
# K9 _( z" Z5 `<%
& ~5 g& x' Y4 L5 UWhile Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接 ; c3 U) m/ r3 j) V
%> Z) o; ]5 C5 C+ Y
<!-- 此處可設為你所需要的鏈接目標 -->
, |% X" d* R' `$ A3 T$ c# J# \6 X<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>
( j! Y; _! [$ x+ E7 g<!-- 顯示部分詳細內容 --> . l; J' J& T% ]6 r/ i8 Y; O0 s
<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>
- Q( \- c, m6 ^% k: b5 k<%
1 U1 y1 N+ S4 q& K1 x ^1 s$ y3 V RST.MoveNext
- F0 q6 X/ @6 E Z8 a4 n2 t. C Wend
3 a. H/ `8 Q3 T! \+ r RST.Close ) f. p8 h0 Q \# O6 D
Set RST=Nothing
! |& E# b* }+ [6 D End If
+ Z7 B: R. O, I( @9 j& W! h0 ?! AEnd If
# {( ]* n# f' a0 E! n1 N1 ]%> |
: p6 n0 y5 Q$ h4 q7 M8 n- a% j. E! p 在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:
9 P0 ~ l! e" d# B+ Z3 [9 w7 }$ V以下是代碼片段:; D5 D9 ]) b S6 P* S& f4 Z
<% $ V7 Q2 i( R1 | y) Y/ A5 ~
Function AutoKey(strKey) ( v3 W" w5 X% p( d
CONST lngSubKey=2 . S7 `$ S5 G+ \" g, q' |- e
Dim lngLenKey, strNew1, strNew2, i, strSubKey
c8 X/ y6 w: z9 H R/ B$ u+ H3 L2 z5 x/ p# v( B
』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。 ; e* c7 k& ^4 _7 C
* d+ L: q2 A4 ^, V
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 , N1 W6 H' f0 k7 G
Response.Redirect "error.htm" % ]6 X& n" t9 t6 [9 \4 h, l
End If
) {# `& e- p0 R' L. R' olngLenKey=Len(strKey) " P3 o/ |. P9 w7 N
Select Case lngLenKey
1 g. G* | D- e$ y3 BCase 0 若為空串,轉到出錯頁
; l# y2 H/ Y3 k" QResponse.Redirect "error.htm" 9 B* S# T% y0 Y) g2 Q5 m$ I
Case 1 若長度為1,則不設任何值
1 Q' Q: l/ R9 Q: OstrNew1=""
7 j# g$ L+ k g* HstrNew2="" 6 j" r1 r6 C* J# C
』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件
# j. Y5 a3 A- M' wFor i=1 To lngLenKey-(lngSubKey-1) , X/ M' W1 ^/ W7 x, ]
strSubKey=Mid(strKey,i,lngSubKey)
}2 E, P, m% RstrNew1=strNew1 & " or U_Name like %" & strSubKey & "%"
. @2 A% n( N, b! D @" Q1 D2 E' t; ustrNew2=strNew2 & " or U_Info like %" & strSubKey & "%"
; x! E1 p/ Q, @4 SNext
8 g8 ?, Y: p. Q0 dEnd Select
" V% ~/ W$ Z# y; Z* n2 Z6 p』得到完整的SQL語句
/ i( W% }; p- b( v1 O2 }* x5 p4 P0 O$ I3 T
AutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2
* g. z1 n4 p7 u. _# b! DEnd Function
8 U) U" @% L, j1 A%> |
要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。 最後,別忘了將數據連接關閉,以釋放資源。
1 t; [) C# y4 {: r( ^) \* z以下是代碼片段:
: @8 E5 n1 r( a) y' ]<%
% k+ w) [ [$ Q G4 d/ G# W" {- j0 fCNN.Close
% Q' q& |" ]7 q' j5 s& @& oSet CNN=Nothing : g! [1 K' e2 a3 L/ d! o! R6 r: {
%> |
至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。 |