过期域名预定抢注

 找回密碼
 免费注册

ASP實現網站智能分詞搜索

[複製鏈接]
發表於 2008-2-26 22:36:24 | 顯示全部樓層 |閱讀模式
用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。
+ z, ?6 p. s0 w* z% a: X1 s第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段:
  ID 自動編號
4 i. S% w2 r: Y# T7 q% U0 w   U_Name 文本
4 }% [/ \9 T& f9 X* K   U_Info 備註
  第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:
6 Y" E9 K/ C9 Y/ G& `% F5 ^
以下是代碼片段:. n& B* m  q) e
<!-- Search.asp -->  
% y/ {( \1 _% a7 d# w: n<form name="frm_Search" method="get" action="Search.asp">  
3 J6 B+ r8 T# G" B" b請輸入關鍵字:  1 i! e& K, f" A4 D( @
<input type="text" name="key" size="10">  ! X& t, O6 K  c; z: S  `
<input type="submit" value="搜索">  1 v" J+ \) v- Y  f" _
</form>
  下面,就進入了實現智能搜索的關鍵部分。
  首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:

; p9 Y9 f7 G: z& ^; v0 i( e
以下是代碼片段:: P3 n9 e" q! B# H, `  m6 ^2 q# u
<%  
* R4 W) `0 Z4 D0 D  Dim strProvider,CNN  
" \' l6 n% C' K) w  strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="  
0 D$ L' @6 L5 k. W* c8 a- Y) r  strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下  0 U8 d& |* @2 ^2 Z5 L/ s6 h! n
  Set CNN = Server.CreateObject("ADODB.connection")  ; u8 g/ G4 N5 G: X* _6 F% H( e& X
  CNN.Open strProvider 打開數據庫連接  + n  e$ Q. J% w9 ]/ M7 Q! o- D
%>
  接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。
( q* h' o6 w/ m/ G; K6 n

- U, I3 ^: v7 ]1 B' T( M( _, ~
以下是代碼片段:
/ }% x5 S  n8 d- Y( f' l' u<font color="#FF0000">未找到任何結果!!!</font>  ! k! L. n" r; e8 P+ G! @# `- ~  _
<%  3 \( ~* k# u/ V! n! U0 o
Else  ( }. }& [+ h7 x3 Q1 ?1 C
%>  
! s3 X/ e/ @  C# l9 f搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>  
" l: P' R# u9 L& W<%  8 y8 d. i- C6 f% G9 W
While Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接  + T( c2 `% c7 e( M4 e- t
%>  1 n) L. E' i. {. c
<!-- 此處可設為你所需要的鏈接目標 -->  " h3 L$ l0 `8 j/ q1 |
<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>  9 s& F/ V- \  B/ F
<!-- 顯示部分詳細內容 -->  4 E7 D: O* v1 j' r8 P
<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>  ) g- a( n( K% ]' M
<%  
7 r2 C8 R' @, x: V. t9 t  RST.MoveNext  
& r" R% e- B3 Z% U  F: O  Wend  + ^1 G+ |" x, r
   RST.Close  
; W' \* H  R* n7 J) H   Set RST=Nothing  ' c; F, S- S) c) m5 m  u
  End If  . M4 H0 t5 ?+ O% F  H' ^# s
End If  
% ^( T1 V3 s/ w% b* c5 r%>

1 x" ]" r; ]4 X) N+ `- _' P, G. k  在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:
) q- |- G4 d3 Q0 Q+ V. e
以下是代碼片段:
: Y- e' [; }8 k* J8 z. @+ ]<%  ' l9 A2 F  E2 @  }& W* \" n
Function AutoKey(strKey)  
! z- Z* [  r4 H/ u1 Q9 S* ^% SCONST lngSubKey=2  " m) l9 }! t% T) f8 \3 f
Dim lngLenKey, strNew1, strNew2, i, strSubKey  
, a2 Q7 V' t8 O+ ]* n3 E" q' w5 L  p, L. i- R1 Q7 w8 x  ?
』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。  ( A' y9 G/ P3 ]6 ~8 g
# I6 Z  W6 U# k
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  
# j! D1 _* D: h6 F! c9 IResponse.Redirect "error.htm"  
( H( ~9 t5 g0 B. V2 n# ^1 l# SEnd If  
/ I0 o( i; H8 _& b2 u3 C# F  C: i3 C0 wlngLenKey=Len(strKey)  
, v  J% o; _8 G3 R$ `* lSelect Case lngLenKey  8 t$ W0 q1 Y9 U4 k5 G
Case 0 若為空串,轉到出錯頁    [/ }( x1 r8 b
Response.Redirect "error.htm"  4 J. t3 X9 A! T" x* |
Case 1 若長度為1,則不設任何值  * [* K6 ]3 q- }2 G, L0 t
strNew1=""  5 N; S% \8 D/ H9 m. N# N9 P0 o
strNew2=""  
: X; A# s( |& p& c』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件  0 m) [8 @# L1 A' Z/ i9 ^  y
For i=1 To lngLenKey-(lngSubKey-1)    ^  \# @+ q, L( d- O: X
strSubKey=Mid(strKey,i,lngSubKey)  
+ p& Q8 Y( T1 k9 a' wstrNew1=strNew1 & " or U_Name like %" & strSubKey & "%"  + F. a5 f+ h% _/ H4 N
strNew2=strNew2 & " or U_Info like %" & strSubKey & "%"  
3 z" Q; L: g$ S) r. NNext  
( e) R( O, p5 r, E' KEnd Select  
/ y5 E- `5 z6 q% P. q. }  I5 t』得到完整的SQL語句  
; w3 C9 Y. ^3 c
2 j9 ]) ]5 J# oAutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2  8 @) w" J. W! G3 H1 y
End Function  
* @$ q; @) g8 M! n( M6 X%>
  要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。
  最後,別忘了將數據連接關閉,以釋放資源。
+ X( `  X0 q- G
以下是代碼片段:
" X( R3 G. d& B% G4 J' Z$ H( `& e# {<%  
) Q0 }. [# ?$ S7 VCNN.Close  7 C" _6 ~& C8 v- R( P
Set CNN=Nothing  
  K. a2 y' G* n1 h%>
  至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。
您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

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

GMT+8, 2024-10-31 01:21

By DZ X3.5

小黑屋

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