过期域名预定抢注

 找回密碼
 免费注册

ASP實現網站智能分詞搜索

[複製鏈接]
發表於 2008-2-26 22:36:24 | 顯示全部樓層 |閱讀模式
用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。
+ i0 w' k1 X7 {5 j9 K第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段:
  ID 自動編號 , E: n% @5 J3 W% W
   U_Name 文本 / P9 u8 C$ j' _; n6 q* a/ H/ a, e# m
   U_Info 備註
  第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:

- i% A1 q; k5 f7 p  u
以下是代碼片段:2 v3 }/ z" A1 |4 Q! S4 \  U
<!-- Search.asp -->  
0 [0 f1 L- ]" h  d' h2 }<form name="frm_Search" method="get" action="Search.asp">  
6 w! D( f' c- V# X7 J請輸入關鍵字:  
# H! V' R+ x, A6 m$ r2 o3 k<input type="text" name="key" size="10">  
/ |0 z/ C: C  F' t6 d<input type="submit" value="搜索">  ( l# ~9 n' \8 h! Y2 B8 T
</form>
  下面,就進入了實現智能搜索的關鍵部分。
  首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:

9 z+ \; \* W8 N5 ~9 P
以下是代碼片段:
! x# B) ^$ h6 R2 S/ e$ j<%  + r7 c3 G4 N# c8 M1 Y, o1 y, R
  Dim strProvider,CNN  4 _; y/ h* a  w
  strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="  ( f0 K( L& L( C  A) X  z- H) B  ?
  strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下  8 L/ F; h% ]  y1 k) }7 f% R$ C, |
  Set CNN = Server.CreateObject("ADODB.connection")  
4 M: p- H" B  n  F& g! l! s) r3 R  CNN.Open strProvider 打開數據庫連接  ! {- P3 [# P. _
%>
  接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。

& N% p8 o9 ?+ |1 d& u2 y- ?( d0 C' _$ O$ v. Q& ?
以下是代碼片段:+ r! O( x, I- M
<font color="#FF0000">未找到任何結果!!!</font>  8 K$ I5 O2 ~. S6 l* F
<%  
* V2 D3 e7 M1 a6 sElse  
+ U! E- e2 I' H7 o$ }4 R" v%>  * {1 F8 t/ `: l2 n- {
搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>  8 G+ v$ _6 {0 r
<%  : m( u9 V! @' ]7 J( p1 n0 E2 W/ Z
While Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接  
! w0 L- l* ?% l) d( F9 S%>  
3 R3 ~! m* S7 W, F" H" m<!-- 此處可設為你所需要的鏈接目標 -->  : {. q/ S# i; u. v" g! C! }
<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>  . K' |" `$ h& h7 w/ N& c/ q3 @1 N
<!-- 顯示部分詳細內容 -->  
* H( s: b  q& Q<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>  ( Q, x2 u2 d% k% ^+ }( u$ M4 J0 `
<%  
$ o8 w: \# J& Y, K  RST.MoveNext  
, v. A$ K; V& }3 r, X  Wend  7 [1 P! n9 ], F9 V
   RST.Close  
7 ^" S$ m0 B! Q8 h2 j+ a  T9 p9 H   Set RST=Nothing  
" ]5 L# ]6 E2 L1 J  End If  " D- p' b, p7 F6 A
End If  8 U# T9 ~2 A& d5 R  C
%>

) V/ [, n$ e1 b  在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:
: c# c$ J0 s$ g% w. d
以下是代碼片段:$ v* ~, ]  Q! O7 n- g& t$ N
<%    m3 D7 _' S. F+ x9 v
Function AutoKey(strKey)  
6 h& h- ~/ `! X. h- L5 f& o9 B( zCONST lngSubKey=2  . V. V. [* K0 @! R
Dim lngLenKey, strNew1, strNew2, i, strSubKey  
, E  V9 P2 ^& h  t$ U* {( t+ t  `! T/ M' C
』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。  4 _3 Q- ~" L+ E

& L3 A4 s8 \$ `9 M* q6 N- jif 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  # B9 }$ I1 D. c- Q
Response.Redirect "error.htm"  
, j% e, r0 q, I0 {3 y6 K4 mEnd If  
$ |( ^, F/ m+ L" G( E$ ]7 }lngLenKey=Len(strKey)  
: p( P6 R) `) [/ ESelect Case lngLenKey  
( b! m# J4 G% \6 t2 `  |; z! ^! S7 nCase 0 若為空串,轉到出錯頁  
+ T/ z/ v  }2 e$ C+ `1 {Response.Redirect "error.htm"  
$ g' Y  F  [4 u( B, z( hCase 1 若長度為1,則不設任何值    Y* A8 _( R9 p- Q
strNew1=""  
; t0 Q9 _4 r( b+ t! \4 ZstrNew2=""  3 r/ Y, W) V" i* @# k7 C
』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件  
; P, H$ _6 B" i- N+ GFor i=1 To lngLenKey-(lngSubKey-1)  
% @% i* y9 o. y; y! _' rstrSubKey=Mid(strKey,i,lngSubKey)  ! g# x4 c- J. S4 k% k. K8 X. f1 d
strNew1=strNew1 & " or U_Name like %" & strSubKey & "%"  # }& G* d! ]9 x4 V- x  X
strNew2=strNew2 & " or U_Info like %" & strSubKey & "%"  
5 ^( E% k' B# ?8 s1 Q* uNext  : F8 t2 r. X$ s, b
End Select  
2 z  w2 ^9 u5 Y0 ]' k5 @) g』得到完整的SQL語句  
! y" ~" E1 x& R& L2 O; |+ ^% U3 v; W! e* c8 {$ K8 N6 K7 n
AutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2  3 @! T3 n6 q% ]2 q8 V! n1 |
End Function  ( a3 s; v) {& r, p% H5 q
%>
  要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。
  最後,別忘了將數據連接關閉,以釋放資源。

9 h. X, p# j% `' z' B2 a2 f3 L
以下是代碼片段:
7 s- [/ S3 @/ |5 g; C  S* ^: u<%  / p( ^. N. d7 I5 q
CNN.Close  5 d! a) F3 l" A4 v# J
Set CNN=Nothing  ! [8 X0 u8 {/ O9 U, I
%>
  至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。
您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

點基跨境 數位編輯創業論壇

GMT+8, 2025-7-15 04:59

By DZ X3.5

小黑屋

快速回復 返回頂部 返回列表