过期域名预定抢注

 找回密碼
 免费注册

ASP實現網站智能分詞搜索

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

) h9 q- N3 C  X; C
以下是代碼片段:
/ b( f0 F* M7 {<!-- Search.asp -->  
! K: G+ I* G$ N+ u  i% o: ]9 Z4 @. |4 S<form name="frm_Search" method="get" action="Search.asp">  
$ U4 w1 M$ h( r0 }' o請輸入關鍵字:  
) o+ O& [; ]3 M% Z1 F0 m2 R. o<input type="text" name="key" size="10">  . I! p2 O8 n) ?. n4 H8 E/ i
<input type="submit" value="搜索">  
$ Z: `; E5 Q+ \- K7 R- i</form>
  下面,就進入了實現智能搜索的關鍵部分。
  首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:

, I% F9 m% p% Y' t/ b) }& i! |) ~- h
以下是代碼片段:
' T; Z) T6 z+ ?; e, i<%  3 Z5 y& g% K; x
  Dim strProvider,CNN  6 |( ]: j6 G$ ?# ]6 o# B% c& ~7 N
  strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="  : r# U' m) s, q9 z
  strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下  2 z7 m3 n5 h& V6 {
  Set CNN = Server.CreateObject("ADODB.connection")  8 {" G: z) i3 y
  CNN.Open strProvider 打開數據庫連接  % y* Q0 i* K3 {3 v
%>
  接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。

. a5 ]% ^( d/ I% u
$ d1 y3 [# \  @6 E; b
以下是代碼片段:
- [( x  a# S! u. Z8 d& }, ~8 Z<font color="#FF0000">未找到任何結果!!!</font>  : _5 P5 d  Y5 N9 H: v
<%  
4 _. y8 m8 ~  ?, }& s2 XElse  
+ r6 r, ~5 f' l1 O' S( u4 B) P%>  
( z% ]. H2 Z$ u( V/ o9 Q搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>  & b2 e4 J+ V( @3 Q3 l# h
<%    V1 Z( |+ p4 ]/ K, n3 Y# i  N
While Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接  7 i0 A. s5 \7 |# {. H
%>  $ q' [7 O) d0 H7 H
<!-- 此處可設為你所需要的鏈接目標 -->  ) p5 y( O* o& h- B
<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>  
  x; ~% A- F. g/ n8 w<!-- 顯示部分詳細內容 -->  4 l1 U% {8 Z/ `7 I5 S( [9 p
<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>  + T; ?5 J9 D3 p
<%  * ]: G4 F7 R  s9 ]: a
  RST.MoveNext  
+ x+ z# c4 d. K0 @  M8 B1 U5 g  Wend  
0 r7 b* V/ F+ B  @! ?- `   RST.Close  
$ X: Q) c( z1 D+ ]# O   Set RST=Nothing  
% B& M4 L( y$ a0 t% O  D* W  End If  
* |: l+ J- n' l  l. ~7 Q" JEnd If  
" Q" c1 X* j/ i" @# |0 p: `%>
$ k; w7 d+ p; a4 w$ @) }  o! ~+ z
  在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:

9 J: f4 G/ i. }
以下是代碼片段:: Q  _1 Q$ V* Z0 s( V7 g4 v; q1 {
<%  
# X. N2 z# n  R) Z! dFunction AutoKey(strKey)  ! d6 C6 w4 ?/ I7 [) r0 ]
CONST lngSubKey=2  
4 a6 w8 i" `, {+ ~Dim lngLenKey, strNew1, strNew2, i, strSubKey  9 s9 R, A! @) ?8 U& `6 Z) B& ?/ _

( e: r3 Y2 m/ q/ V' w3 A』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。  
: r5 }: N% E# [0 i6 ~: J4 |0 }4 R, _8 v) L. T
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  
2 ?  D" w6 P, c, EResponse.Redirect "error.htm"  
4 A0 O6 |1 q  o" _  t/ k1 T9 k0 LEnd If  
6 n: f5 X% K4 P/ y6 T) l9 ilngLenKey=Len(strKey)  ) h9 o+ _  p. v2 t+ J5 M
Select Case lngLenKey  
  L. T( x  y6 @2 u3 Y1 R4 ^Case 0 若為空串,轉到出錯頁  
( [5 @9 h; C6 c& o" e8 VResponse.Redirect "error.htm"  ; g! }" P0 H% L; J
Case 1 若長度為1,則不設任何值  
8 X. S' s  K! l  ^strNew1=""  0 U( ]( z7 J- N3 m8 m  d8 Q
strNew2=""  9 e" _7 Q% ?% o1 ]) |
』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件  
6 R) q9 t0 l( T4 t* d8 JFor i=1 To lngLenKey-(lngSubKey-1)  4 R7 F. X7 ~/ Z: ~7 [5 e! c2 ~
strSubKey=Mid(strKey,i,lngSubKey)  " X5 ^& L' z5 o1 W0 o" R0 j% m2 H& N
strNew1=strNew1 & " or U_Name like %" & strSubKey & "%"  . I& T' n  J  ~
strNew2=strNew2 & " or U_Info like %" & strSubKey & "%"  ' p1 F, }+ c0 r) G& @. j
Next  " F; a( _* k% |6 u" h; G& Y
End Select  6 M; E% B. R# @5 c# q
』得到完整的SQL語句  
! C( e0 I. [! l0 ~) E) F# l% }+ C0 a* h: @6 `) J4 ]
AutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2  
3 T# Q: x9 x" K. X. s1 T( }End Function  
, t, E' r6 `) o+ f& K  |8 \%>
  要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。
  最後,別忘了將數據連接關閉,以釋放資源。
! X; z% ]9 B7 C. |
以下是代碼片段:
/ a9 R1 P5 r3 u- S! T<%  , N3 h' i6 U# Y/ u; r
CNN.Close  
+ S' k2 C! b; ]! G9 f' SSet CNN=Nothing  
4 P1 `1 V  u4 J9 u; |7 i%>
  至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。
您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

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

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

GMT+8, 2025-5-8 22:51

By DZ X3.5

小黑屋

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