过期域名预定抢注

 找回密碼
 免费注册

ASP實現網站智能分詞搜索

[複製鏈接]
發表於 2008-2-26 22:36:24 | 顯示全部樓層 |閱讀模式
用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。   ^2 V. K2 j' E5 Q" z$ Y9 X
第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段:
  ID 自動編號
# X/ q4 N7 Q' v1 F/ d/ w# P. a0 P5 q   U_Name 文本 , n* M5 m) p0 T9 F
   U_Info 備註
  第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:
0 Z) L9 T4 g# M+ U: q% j( e
以下是代碼片段:% D) X, ]4 Y: R# J- X2 {/ I
<!-- Search.asp -->  
' j& ?6 O. P+ M# D% U# B; j<form name="frm_Search" method="get" action="Search.asp">  ) v1 {4 ]+ R8 L+ E3 U$ g  d* a
請輸入關鍵字:  
/ x  w2 o  y7 V5 [5 G6 N<input type="text" name="key" size="10">  
5 \1 d, B# R1 X- E+ v8 S! j, E<input type="submit" value="搜索">  
2 A. H! j$ b7 k# \</form>
  下面,就進入了實現智能搜索的關鍵部分。
  首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:
1 p  D/ e: I" C
以下是代碼片段:
6 q  \4 l$ p$ \8 [$ ?2 I% a<%  
$ q8 m- o( {4 W7 v  Dim strProvider,CNN  6 Z8 W7 b' @* Y3 |# n# ]
  strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="  
+ @; Q( b0 h3 \- e- b. w  strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下  
# z3 G% S3 \2 ?  Set CNN = Server.CreateObject("ADODB.connection")  6 j6 U3 `3 P3 Z- {. F/ Z
  CNN.Open strProvider 打開數據庫連接  ) A0 e5 @4 [. e6 |3 G! N( q. F- M
%>
  接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。

1 X1 T3 v; H+ u- B' b+ H' K" F0 X  G* N
以下是代碼片段:
( c- u0 ~" ?( E1 m* b<font color="#FF0000">未找到任何結果!!!</font>  5 z- P5 {2 e* f
<%  
1 s7 d) m8 w, r7 \Else  
& A" {' S6 P- v. b) D7 D* D%>  7 g* S( @. ?% B" E9 g. I
搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>  
3 D! c7 f" C( S( s7 W2 A<%  
& n& _, O/ u9 ]$ [9 o) I" |While Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接  
! `3 d$ b% \0 B) ~# K+ f* q4 I, {* }%>  8 O1 P8 ~/ h1 s9 W/ K6 B
<!-- 此處可設為你所需要的鏈接目標 -->  " |% {5 n/ ^8 t" R. e2 h0 A
<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>  : e6 x: ~  H* g& y  m
<!-- 顯示部分詳細內容 -->  3 y9 W: ~) R  b# ]
<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>  6 }6 N- n/ b4 P& @+ \9 H
<%  
! _, R5 |5 e/ ^  RST.MoveNext  * D+ t" H" H0 v: L. s: l4 L
  Wend  
# Z; ?9 k- K7 T1 l" l: Z   RST.Close  / i' |% P1 c/ z/ l: B& c
   Set RST=Nothing  0 n7 P; D* J$ \& H* W
  End If  $ ~; S8 \, \3 K; S; S  ?6 E
End If  9 s: Z( T6 y6 `( y" X1 e
%>
3 r, i4 v8 e( J: }3 F' M- W6 g
  在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:
; h) }4 k' W6 a. s* j9 l4 y& D: _
以下是代碼片段:' O/ w  d) `' P
<%  
0 K! r: x* b, K( f6 ~Function AutoKey(strKey)  9 Y9 N1 c! B% y; z. Y- I
CONST lngSubKey=2  
% S/ u5 e% |3 p, u; C9 ]Dim lngLenKey, strNew1, strNew2, i, strSubKey  7 G. d! N1 O- I+ ?* @/ P6 _- {
- F9 F/ n1 ~; A5 [7 B2 k
』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。  5 v) E( r9 W! E( _/ ^0 E4 o- i" u% r
% _) J  \: ^; X
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 L0 f. ^9 {/ D. q3 ^Response.Redirect "error.htm"  
. W/ X2 U9 _! {4 z2 H6 x: lEnd If  
) U$ s6 l+ _/ v3 D8 p8 OlngLenKey=Len(strKey)  * e5 M. M% Q' U7 t# h3 ^1 z
Select Case lngLenKey  : D& |7 g' y7 D; ~
Case 0 若為空串,轉到出錯頁  
& r5 r% l/ j! a6 nResponse.Redirect "error.htm"  
3 ?7 f9 F+ O' Z6 A+ FCase 1 若長度為1,則不設任何值  
* `/ W+ E: `: u1 J1 w9 UstrNew1=""  
& g8 A8 @3 O% M* \4 }strNew2=""  / P/ K% ~: o$ E8 }% e" @# X. ]
』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件  ) ]# @* H. G  u9 \" m% X3 J
For i=1 To lngLenKey-(lngSubKey-1)  
7 ^1 c' l' p3 ]2 R  u) M" ~  `9 NstrSubKey=Mid(strKey,i,lngSubKey)  % e3 |) Z- d' M& W% Z2 R* g% N
strNew1=strNew1 & " or U_Name like %" & strSubKey & "%"  
/ R/ a7 H7 m9 K2 DstrNew2=strNew2 & " or U_Info like %" & strSubKey & "%"  
- S% P8 T6 A. h2 PNext  
. v. K( Y! W* W6 E- \) G( {End Select  , ?$ }2 c5 Q; q
』得到完整的SQL語句  * v3 u  \6 r1 y1 P7 A9 q6 r( }
4 F3 m0 D' a4 P+ F
AutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2  
/ k2 U- z3 {7 DEnd Function  5 G, S  C  d5 e
%>
  要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。
  最後,別忘了將數據連接關閉,以釋放資源。
8 j$ b( @+ ]. c. q% {
以下是代碼片段:
2 n4 C* j( E, [0 v( B: |<%  $ ]# ]/ D0 |" X- v
CNN.Close  ' M- R& X; a. u# }, F4 H+ \
Set CNN=Nothing  
3 `7 ]( @% c% z' z6 U0 s: p/ l%>
  至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。
您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

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

點基

GMT+8, 2025-11-1 07:30

By DZ X3.5

小黑屋

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