|
用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。 $ u- c; F+ H6 F' o* K* \
第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段: ID 自動編號 , @3 o! {! b; X: n. K. ?2 T% L* ~
U_Name 文本
7 b5 b6 I9 N) x& r: ~ U_Info 備註 第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下: , ~! e, f6 \8 y. P
以下是代碼片段:
& ~" _2 P" [8 m% V9 {4 j5 `! Z<!-- Search.asp --> & G" O" O! A- O
<form name="frm_Search" method="get" action="Search.asp">
7 ^6 o$ F v: C% S8 W! k請輸入關鍵字:
, `! {: ?9 Q& h# W; o" n0 g# n<input type="text" name="key" size="10"> 6 Y/ c e+ R! P% t* I
<input type="submit" value="搜索">
# c, ?9 R% ?6 g</form> |
下面,就進入了實現智能搜索的關鍵部分。 首先,建立數據庫連接。在Search.asp的開始處加入如下代碼: ; r" G4 q9 Q. ^/ x
以下是代碼片段:$ p) v: E& R) U) H! v) d+ L
<% 4 Q5 z. C, j8 e1 x3 G
Dim strProvider,CNN
* b& R( _' _4 O+ q+ {' s- L strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
/ H' H% g# x( C' {, d strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下 # T" ]9 q# J7 ~5 i: \1 S1 U8 O
Set CNN = Server.CreateObject("ADODB.connection") 2 b% {* e7 p2 r: n
CNN.Open strProvider 打開數據庫連接
' C3 V6 M, {7 j) O8 d. n%> |
接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。 + l6 P6 K L5 @/ A/ I
) _4 E3 e l+ y5 ~) m
以下是代碼片段:) S7 _8 b1 X' C* d. |4 z, w
<font color="#FF0000">未找到任何結果!!!</font>
0 a5 `$ F% q8 f: |3 X0 y- b) \<%
( r1 |& v0 V; ]6 C2 RElse 2 F9 y7 X4 R5 v/ }2 u0 h
%>
2 |- Z) u3 `9 ]; O) [3 @% o9 @搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p> * N n: ?$ y7 r( m# _
<%
- V4 K9 Y3 U& A. w( g2 b4 j) oWhile Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接
) I3 I6 d1 K/ j! _( t%> 4 t/ t0 Z/ h/ h6 t" l( p. j
<!-- 此處可設為你所需要的鏈接目標 --> 0 z1 l) z; v ^" U
<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>
! c" J# X$ T0 ~* C7 h- o<!-- 顯示部分詳細內容 -->
8 B$ @; F) L7 E* O<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>
. v. E$ A- O7 t) {3 O/ s: `& X<%
" N) e3 G( Q# t% t( `* j RST.MoveNext
& b2 i% O- A" G c& m* r Wend 9 {) P6 ]/ k" Q) b r
RST.Close . n& p; m& e% L* T+ C7 v
Set RST=Nothing
; S: {5 t4 Y! ]( ~# o/ ? End If 6 U3 O) g3 r( U) h9 M5 ^7 o) f
End If
) d/ K" {% @$ A" u%> |
3 c/ L$ @5 S/ I5 X9 y9 [! U 在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:
9 w2 _" g% w8 L. [2 i以下是代碼片段:
$ G* C5 m* {+ S9 h: Z<%
" U) F& @, d8 U+ ~' ^4 f. r o* JFunction AutoKey(strKey)
" ]' y- U6 @ \8 i. O. I$ LCONST lngSubKey=2
) r/ d0 a3 r* [( Y& B; kDim lngLenKey, strNew1, strNew2, i, strSubKey
# n" d# C9 {5 w( H! a
* m2 G y2 U+ I4 j2 Y』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。
" Z" t( q' I: h- x
$ D. j( ]4 u+ Hif 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 " m- s3 I3 |8 R
Response.Redirect "error.htm" & L! _; P9 N- f
End If
: f7 z: a3 |8 [) h: ylngLenKey=Len(strKey) ) n, d1 D( R, D4 A
Select Case lngLenKey
& f( H6 q$ W$ j: a9 m' [Case 0 若為空串,轉到出錯頁 * ]1 k. @ o, O7 C9 _3 |# b. R% n
Response.Redirect "error.htm" % q( N8 J" `% ?, h
Case 1 若長度為1,則不設任何值 ; U) O5 `+ B# R8 p7 z
strNew1="" 1 B" v6 N1 E; ^& a- D
strNew2="" 3 S% d2 S' d; o7 I
』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件
8 B; M0 N. I; \* `8 R. JFor i=1 To lngLenKey-(lngSubKey-1)
* |1 ?, s/ A4 y) S3 NstrSubKey=Mid(strKey,i,lngSubKey)
* x* m+ g2 K9 J! L2 sstrNew1=strNew1 & " or U_Name like %" & strSubKey & "%" ! L6 d+ |4 B5 _' j( A
strNew2=strNew2 & " or U_Info like %" & strSubKey & "%" 1 V$ G3 r/ }: Y7 r$ B! [- J
Next
* J9 v3 `% ?7 g; ?" JEnd Select : w8 X! P0 s+ E8 H6 W8 A- N9 R8 [
』得到完整的SQL語句 ; r* a2 y' U7 Y; C. @' b& p
/ Y9 t. |0 c8 l2 U4 bAutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2
8 J; k2 h$ e x/ BEnd Function
9 B4 e: H) h: Y! G: N% k%> |
要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。 最後,別忘了將數據連接關閉,以釋放資源。
. }$ o8 K5 W. Y' a( B% |+ Z8 n以下是代碼片段:8 n) L+ S3 m2 C2 w0 w5 r
<% 0 n" E" f$ }1 X' I' a, ~& f( s$ |
CNN.Close ) a2 {/ G2 t9 d
Set CNN=Nothing ! @7 ]+ l8 I! a% S
%> |
至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。 |