过期域名预定抢注

 找回密碼
 免费注册

ASP實現網站智能分詞搜索

[複製鏈接]
發表於 2008-2-26 22:36:24 | 顯示全部樓層 |閱讀模式
用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。 ; b! I7 K: A$ Z3 }/ C
第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段:
  ID 自動編號 ) A6 ]! ~$ J* G8 H
   U_Name 文本
4 H! v7 n  T; i$ @+ c   U_Info 備註
  第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:
/ m7 u& s) l9 Q0 `& T  P& X
以下是代碼片段:% Y4 t; _2 S) l" t+ v" x
<!-- Search.asp -->  
$ a0 l6 V5 x3 R9 k; a7 L9 {; x<form name="frm_Search" method="get" action="Search.asp">  
& X7 j% g1 r  c3 x/ [" t; b請輸入關鍵字:  
/ g% [/ y) U1 Y1 `* m<input type="text" name="key" size="10">  ) W; @' N6 t# t5 o6 D( R
<input type="submit" value="搜索">  
% n! p6 F( _- T4 a7 `' ^) ]</form>
  下面,就進入了實現智能搜索的關鍵部分。
  首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:
2 D/ _( P  f  p
以下是代碼片段:
9 w8 N- i( `6 P# K; q1 F" C3 k2 p<%  
$ @" Z6 E0 }9 N6 J- ]1 V6 q0 r  Dim strProvider,CNN  6 y, {: a5 }9 `. B* k  R! I
  strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="  ( V" n# ]8 n9 U8 O% h; a
  strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下  , U6 {0 `8 ~* K
  Set CNN = Server.CreateObject("ADODB.connection")  2 |2 S7 T3 b5 Y* o: m0 k9 Q
  CNN.Open strProvider 打開數據庫連接  
8 l; d2 U4 `+ N" Z& l: P! t%>
  接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。

5 ]$ W" F7 t5 x. U
# [0 v3 W' l) V/ P- [  |
以下是代碼片段:7 F" W8 H. ~! x" N2 {, T$ K: @
<font color="#FF0000">未找到任何結果!!!</font>  7 ]7 I' B& O. Y8 O3 _% I, @. ^# ?
<%  
  K/ j! S+ _7 h; {2 B6 D# \& rElse  
$ \( N- j# q* P% N%>  
- V, N* b! c0 U- x: `  L" f/ U搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>  & r; H. m" v) J# [# A: }! X
<%  0 S: }0 a+ g: b: ^6 X( H
While Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接  / j1 x( d4 G2 g& J+ t; f
%>  
. h' b. e8 z7 N; A' s# {9 c. W$ e<!-- 此處可設為你所需要的鏈接目標 -->  
8 C/ P* `6 Y8 t1 t<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>  " W" o, _5 i5 v9 V) @+ D
<!-- 顯示部分詳細內容 -->  
! j6 n$ K$ R8 Z* }$ @6 A6 n9 O' d* J<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>  $ r3 j3 g+ u% B( r
<%  
  u8 T( m* g$ U1 p  RST.MoveNext  1 f: o9 L& ?* O* s
  Wend  
9 J% `0 I# I6 X  h8 g$ d7 j* `   RST.Close  - u6 L; T" J7 R
   Set RST=Nothing  
' [! @/ \% [  b! C5 N  End If  % b" U  v. J9 S) F8 {
End If  
/ s* }: D, P/ g: c1 r%>

! k( [  [' G% E8 _1 F8 e! I2 C  在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:
2 [! f& {6 _' r) z
以下是代碼片段:
9 D/ V3 u0 q1 {  K- a<%  
( V2 }) s  K: ?' R1 z% {& QFunction AutoKey(strKey)  
  F$ n0 `, X4 f( O8 d5 k; c, LCONST lngSubKey=2  5 ^, X( z; W  j8 [0 ^
Dim lngLenKey, strNew1, strNew2, i, strSubKey  # l1 m- j4 v- j) A
# \+ ^, T6 S' X+ Z1 x; e  J4 g
』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。  
8 W) ]9 G% G, `) \
" Y# L; C# |. U& e) X0 [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  : H5 }$ G  a$ `6 w/ |
Response.Redirect "error.htm"  
5 ]+ j+ f6 C3 W, `End If  5 {+ _, N! G, i1 b+ p$ K$ r
lngLenKey=Len(strKey)  
4 B* A1 d8 S; GSelect Case lngLenKey  / e9 C9 n  n3 b( F9 B
Case 0 若為空串,轉到出錯頁  
: l* f7 C/ N9 ~* S' D: C1 DResponse.Redirect "error.htm"  
* }7 \" {  N, e# k# e" Q8 sCase 1 若長度為1,則不設任何值  , [* G0 j. \) m. P; u" ^) w: p' n3 q
strNew1=""  . R1 a( y, U/ S; W
strNew2=""  , M5 v" [: b+ {0 u6 O
』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件  
5 X* W+ Q6 i. s$ [& W% w: _# tFor i=1 To lngLenKey-(lngSubKey-1)  7 ~' ^! ~3 |: E* x$ c: w( X* i
strSubKey=Mid(strKey,i,lngSubKey)  4 q3 T& L8 w( w+ I. ?
strNew1=strNew1 & " or U_Name like %" & strSubKey & "%"  
/ Z2 i7 n4 g' Z: a8 ystrNew2=strNew2 & " or U_Info like %" & strSubKey & "%"  
4 f4 Z. ?0 }& X9 Y# ~1 k7 O4 RNext  
, F/ e8 i# ^- n# ^End Select    }8 e/ Q- Y0 c' C2 o! w2 `
』得到完整的SQL語句  & K. B5 I4 S* B& _6 \
5 l: D; ~: l$ O6 o
AutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2  * F' E% S) D! {3 n3 x  o9 Z5 A& z
End Function  ; `9 W& i' \2 T( r' L; P1 a3 Q
%>
  要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。
  最後,別忘了將數據連接關閉,以釋放資源。
. p3 L8 k0 a, e) L# j
以下是代碼片段:! V! h) }5 u6 w, }8 ]. o, u
<%  9 _! C' m" q, N! S, g6 n- ~8 u4 j
CNN.Close  
3 A# x# h- b! d: p; S' k* U9 t( f' CSet CNN=Nothing  ; A" L0 z: n( Y; U* P, f" B
%>
  至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。
您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

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

點基

GMT+8, 2025-11-21 20:10

By DZ X3.5

小黑屋

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