过期域名预定抢注

 找回密碼
 免费注册

ASP實現網站智能分詞搜索

[複製鏈接]
發表於 2008-2-26 22:36:24 | 顯示全部樓層 |閱讀模式
用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。
; X1 C2 S8 o3 e4 F% v第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段:
  ID 自動編號 6 k' a1 f6 O; X( U  H
   U_Name 文本 $ W8 }% `& c0 m2 M, n1 R: [6 [1 I
   U_Info 備註
  第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:

4 p  h3 q& G/ o' d
以下是代碼片段:4 p+ Z- A4 \7 q
<!-- Search.asp -->  % }( c4 J  N  B8 Y0 N$ {7 ]
<form name="frm_Search" method="get" action="Search.asp">  
: |. o6 J; y0 `! W7 Y請輸入關鍵字:  9 w+ j8 H. \) \" F% P: u
<input type="text" name="key" size="10">    _1 p- B( n1 t; d. C0 V
<input type="submit" value="搜索">  1 y) ~/ G/ h7 Z. t0 p) M8 `  n
</form>
  下面,就進入了實現智能搜索的關鍵部分。
  首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:
2 u3 d' d' v% e5 B
以下是代碼片段:) J. O3 W8 M1 ~! Z4 X
<%  
& f5 B0 s2 X1 a: J2 e# S# W/ s* H/ w  Dim strProvider,CNN  8 d6 D6 k- B6 A" X; Z9 D
  strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="  9 T6 w; K" X9 n
  strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下  
1 O; B6 m: C( K) i! Q# y) u  Set CNN = Server.CreateObject("ADODB.connection")  6 a; s" T0 e3 o+ C# }4 {3 m
  CNN.Open strProvider 打開數據庫連接  
/ _7 v! E& j' T+ X* M3 a1 K5 u%>
  接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。

: j# s% E" ^& K% w* i! E5 Z. \) M0 N8 ?
以下是代碼片段:% D  q2 B% ^4 O( p8 \$ U+ E
<font color="#FF0000">未找到任何結果!!!</font>  / ^2 W* V% F4 [5 }0 M9 @
<%  
' d& ]0 O+ b" c0 c$ L' `Else  5 @- _5 i5 q. e8 t7 z
%>  
4 W0 `/ S* q2 \+ ?" P搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>  
$ E* I( Y* o( q3 G1 l9 Q/ p<%  
5 e$ {8 u/ W3 l2 i$ @While Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接  
& N* \7 {' N9 K%>  + t6 q1 y+ W5 G
<!-- 此處可設為你所需要的鏈接目標 -->  
9 H$ ]# T  J+ b7 V/ M" N6 c<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>  % \0 @/ q* l4 f* D( y3 D
<!-- 顯示部分詳細內容 -->  
" Q7 I1 T0 ~* R4 [* T2 g<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>  
( G: I1 L, S4 ~4 d- v<%  1 n6 p% g+ a8 m8 l6 s5 N
  RST.MoveNext  . @( k- R: s) p0 d* T9 A4 [* I
  Wend  3 X9 J; ~* F" `" ~
   RST.Close  - D6 `, e5 F# t
   Set RST=Nothing  ! D( h& O; T2 f: v! d5 h4 Z
  End If  
) p2 I- L/ c4 r, rEnd If  4 V+ e; h5 x3 t4 y
%>
2 O2 ~$ g, {% n5 n6 T: i9 l
  在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:

7 z( _! S2 w) G
以下是代碼片段:
9 t- d: z8 Q+ e6 ?( k<%  
: A/ f" y( ?* D, KFunction AutoKey(strKey)  
  ?) j2 z4 E; ?3 ^( z% GCONST lngSubKey=2  
. n5 m4 e+ |( K& E7 hDim lngLenKey, strNew1, strNew2, i, strSubKey  + U, t* u; s( ?3 o. \

. X! h! r, ]0 e1 k# \5 I4 G』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。  - W7 x, i* W$ R. M7 i

: w2 B& ]: b$ E  W  H2 F8 tif 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  4 l/ I. q/ ~6 R4 i
Response.Redirect "error.htm"  ) F2 B# g7 c# X: E7 d
End If  / b: l: F. m$ B5 m5 s- l
lngLenKey=Len(strKey)  7 f7 Q$ v7 b5 a; |! c4 N
Select Case lngLenKey  
0 t  S; M; C9 s: b6 d& jCase 0 若為空串,轉到出錯頁  
  z1 S; _1 ]& [. l% P3 RResponse.Redirect "error.htm"  
8 `. w. {' g# h1 b( JCase 1 若長度為1,則不設任何值  . u) }" U: c& c0 k% I" w9 {4 H
strNew1=""  / L9 H. }- y" ?+ N- Z. G
strNew2=""  
; n2 f5 G5 w" ~1 K$ @2 ]% x』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件  6 d3 E+ @) o! f4 y% K
For i=1 To lngLenKey-(lngSubKey-1)  " v% E9 _4 z- k
strSubKey=Mid(strKey,i,lngSubKey)  1 D7 e) Q/ x: F0 B8 o. P+ e8 W
strNew1=strNew1 & " or U_Name like %" & strSubKey & "%"  5 T1 z3 D' S2 C! @9 {
strNew2=strNew2 & " or U_Info like %" & strSubKey & "%"  # J( [7 U! r' |8 c% {+ B# F4 Q, j5 z
Next  ( n, w  U9 U6 i. N! B9 m& o
End Select  . e3 S" |% Z+ ~4 w7 W
』得到完整的SQL語句  ' H6 x9 N2 x+ u2 u/ ?) h, ]7 x

" S0 {8 V" J" u* X+ p+ {4 v8 F1 W; FAutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2  
# g. o4 F+ p! d5 _7 mEnd Function  
' e, ^! A7 D; X: G. m%>
  要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。
  最後,別忘了將數據連接關閉,以釋放資源。
* k0 i2 y" J0 R4 C. P
以下是代碼片段:
) A5 O$ ~2 X- a" J2 |<%  
% T: w6 Y* j9 c5 X0 U- ]. D7 z( RCNN.Close  
- K3 P8 m( q! S, ZSet CNN=Nothing  ( O* n/ G9 O! b5 e( S2 X4 [1 m
%>
  至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。
您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

4um點基跨境網編創業社區

GMT+8, 2024-11-27 19:13

By DZ X3.5

小黑屋

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