过期域名预定抢注

 找回密碼
 免费注册

ASP實現網站智能分詞搜索

[複製鏈接]
發表於 2008-2-26 22:36:24 | 顯示全部樓層 |閱讀模式
用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。 1 D' L$ \- e. N5 T. P2 z, N
第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段:
  ID 自動編號
  \' _; ?1 x) ]   U_Name 文本 * e7 l) [( R6 B; T4 O/ o; I. ?2 S
   U_Info 備註
  第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:

+ h! Q$ g2 H8 @5 D
以下是代碼片段:
7 b- E+ r1 r- O6 c0 w# a<!-- Search.asp -->  * X, }  _- [5 U: L  k0 d& o, L
<form name="frm_Search" method="get" action="Search.asp">  
/ `% ^: i- I+ D. S/ v請輸入關鍵字:  
# Q& i* V+ w. l- T<input type="text" name="key" size="10">  0 N1 ]3 h+ a& p2 e! l0 f4 t0 ?
<input type="submit" value="搜索">  
) [1 {" ~% Q& D* t; a' i% a</form>
  下面,就進入了實現智能搜索的關鍵部分。
  首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:

; t7 L# Q4 Q% M1 Y
以下是代碼片段:* b. Z& r2 C! M, T* d1 W6 S
<%  
8 l8 D5 V# k6 l0 L# b3 C  Dim strProvider,CNN  % T0 Q! [) D, P
  strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="  
: E! N1 |6 g, ]+ \$ z  strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下  
3 H) d" O2 q* ~  Set CNN = Server.CreateObject("ADODB.connection")  - v4 A0 N0 d7 d0 I. ]  E! B" X
  CNN.Open strProvider 打開數據庫連接  
/ \- @' }. L8 d  h%>
  接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。
3 m+ w$ N" B9 Y4 r) h

' U: t. K! J8 z* F$ V+ M
以下是代碼片段:
& M# V% \: F% b& ^9 m( I* @<font color="#FF0000">未找到任何結果!!!</font>  0 j8 S+ }8 ?# D. m8 t/ M0 ]
<%  * U9 D0 }9 G4 }- y
Else  7 ^/ @/ j, ]% C- |: ^; Z+ K% n. m
%>  
8 C  E% C: P% r搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>  
0 T  H: D; s. ]/ D/ V<%  
/ r7 m' L: G. q* V9 j8 hWhile Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接  
+ z$ K$ ?8 B1 P9 Y1 B%>  
3 Q; B- ^* [2 p$ W, O$ t  {/ P<!-- 此處可設為你所需要的鏈接目標 -->  
: \4 {$ b# f6 o7 k9 D3 F9 o) L3 X<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>  3 n/ Z0 n2 r1 Y( o# U  C
<!-- 顯示部分詳細內容 -->  
  |) b. f% v/ F) l* r5 s<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>  
5 r, H: o1 A3 G" K<%  $ L' ^, Y8 e6 n) n2 o% l
  RST.MoveNext  ' ~5 A) }( p+ l4 G$ Q
  Wend  5 {8 U5 V, W0 Z; T0 D- S- H* Q+ E
   RST.Close  6 P; R9 `7 v  @0 I# b$ f
   Set RST=Nothing  # P; s" |0 e8 Z5 R
  End If  3 b: ]* m9 t5 q& f& L: q7 D+ J
End If  5 T) d: L) o2 R/ w" w- s2 j
%>
  z2 \9 q7 s& Z9 s4 Z  X7 g; \4 o
  在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:
, M2 b% C) L. K0 B
以下是代碼片段:
2 `" ^7 o* Z% G<%  6 H( A% ]* [. }* R# \
Function AutoKey(strKey)  
" w5 X$ o/ V3 ^9 {; M; A& FCONST lngSubKey=2  
6 I$ t- z4 n$ E8 Z# I. }Dim lngLenKey, strNew1, strNew2, i, strSubKey  
2 V0 G7 X& \! `" F$ Q2 B1 N
& ]+ j5 V; p4 W! F』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。  . j* s$ Y/ Z. P: ^
+ Y& u! E9 s1 k  w  ~. a( {- C
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  % m- \' u' o7 o0 Z, k
Response.Redirect "error.htm"  
( r, @9 r1 I: G9 Y8 R6 eEnd If  
" N+ p5 ]* `! B3 b* glngLenKey=Len(strKey)  $ p& @' T+ d% \
Select Case lngLenKey  2 s* \1 N) h# ]* k$ n4 T
Case 0 若為空串,轉到出錯頁  . T! M  T% L* ?5 T: c6 w; s
Response.Redirect "error.htm"  0 g- u, K' X9 N+ _6 P% v
Case 1 若長度為1,則不設任何值  / U& }: N( ]. x. g- w
strNew1=""  
! ~5 H: V0 A- g" d- v4 bstrNew2=""  
6 X( H6 R2 R- i6 I9 G0 a  v』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件  
7 B0 e: d( x& w! CFor i=1 To lngLenKey-(lngSubKey-1)  
+ Q4 f# ]3 @3 n5 ?, G% dstrSubKey=Mid(strKey,i,lngSubKey)  & D' S% P7 `$ Q4 C! E
strNew1=strNew1 & " or U_Name like %" & strSubKey & "%"  ! e9 X6 A' A3 ^# B* P
strNew2=strNew2 & " or U_Info like %" & strSubKey & "%"  8 E9 ]: n9 ?" x# ]9 X3 B) S
Next  4 g( Y) c8 [# t/ F+ g* w
End Select  2 ]; e+ C/ ^9 @
』得到完整的SQL語句  
6 D1 T0 p- ^: Q. B; m3 i7 K4 ]
, I0 J% Z3 R2 Y+ f5 FAutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2  
8 c# x' e# n# uEnd Function  
- `9 z, g( @' d. b  Q8 c%>
  要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。
  最後,別忘了將數據連接關閉,以釋放資源。
) Q  W3 d  v* X. `
以下是代碼片段:& K( h9 }9 f- T( G5 D% M0 \. D
<%  ) |& L: l0 ?0 E2 E/ r/ N
CNN.Close  
+ P, e* ]7 e. d  J) B: USet CNN=Nothing  
1 x9 k2 s/ H& x  \3 s+ y%>
  至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。
您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

过期高净值品牌域名预定抢注

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

GMT+8, 2025-4-5 11:56

By DZ X3.5

小黑屋

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