过期域名预定抢注

 找回密碼
 免费注册

ASP實現網站智能分詞搜索

[複製鏈接]
發表於 2008-2-26 22:36:24 | 顯示全部樓層 |閱讀模式
用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。 $ u- c; F+ H6 F' o* K* \
第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段:
  ID 自動編號 , @3 o! {! b; X: n. K. ?2 T% L* ~
   U_Name 文本
7 b5 b6 I9 N) x& r: ~   U_Info 備註
  第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:
, ~! e, f6 \8 y. P
以下是代碼片段:
& ~" _2 P" [8 m% V9 {4 j5 `! Z<!-- Search.asp -->  & G" O" O! A- O
<form name="frm_Search" method="get" action="Search.asp">  
7 ^6 o$ F  v: C% S8 W! k請輸入關鍵字:  
, `! {: ?9 Q& h# W; o" n0 g# n<input type="text" name="key" size="10">  6 Y/ c  e+ R! P% t* I
<input type="submit" value="搜索">  
# c, ?9 R% ?6 g</form>
  下面,就進入了實現智能搜索的關鍵部分。
  首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:
; r" G4 q9 Q. ^/ x
以下是代碼片段:$ p) v: E& R) U) H! v) d+ L
<%  4 Q5 z. C, j8 e1 x3 G
  Dim strProvider,CNN  
* b& R( _' _4 O+ q+ {' s- L  strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="  
/ H' H% g# x( C' {, d  strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下  # T" ]9 q# J7 ~5 i: \1 S1 U8 O
  Set CNN = Server.CreateObject("ADODB.connection")  2 b% {* e7 p2 r: n
  CNN.Open strProvider 打開數據庫連接  
' C3 V6 M, {7 j) O8 d. n%>
  接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。
+ l6 P6 K  L5 @/ A/ I
) _4 E3 e  l+ y5 ~) m
以下是代碼片段:) S7 _8 b1 X' C* d. |4 z, w
<font color="#FF0000">未找到任何結果!!!</font>  
0 a5 `$ F% q8 f: |3 X0 y- b) \<%  
( r1 |& v0 V; ]6 C2 RElse  2 F9 y7 X4 R5 v/ }2 u0 h
%>  
2 |- Z) u3 `9 ]; O) [3 @% o9 @搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>  * N  n: ?$ y7 r( m# _
<%  
- V4 K9 Y3 U& A. w( g2 b4 j) oWhile Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接  
) I3 I6 d1 K/ j! _( t%>  4 t/ t0 Z/ h/ h6 t" l( p. j
<!-- 此處可設為你所需要的鏈接目標 -->  0 z1 l) z; v  ^" U
<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>  
! c" J# X$ T0 ~* C7 h- o<!-- 顯示部分詳細內容 -->  
8 B$ @; F) L7 E* O<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>  
. v. E$ A- O7 t) {3 O/ s: `& X<%  
" N) e3 G( Q# t% t( `* j  RST.MoveNext  
& b2 i% O- A" G  c& m* r  Wend  9 {) P6 ]/ k" Q) b  r
   RST.Close  . n& p; m& e% L* T+ C7 v
   Set RST=Nothing  
; S: {5 t4 Y! ]( ~# o/ ?  End If  6 U3 O) g3 r( U) h9 M5 ^7 o) f
End If  
) d/ K" {% @$ A" u%>

3 c/ L$ @5 S/ I5 X9 y9 [! U  在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:

9 w2 _" g% w8 L. [2 i
以下是代碼片段:
$ G* C5 m* {+ S9 h: Z<%  
" U) F& @, d8 U+ ~' ^4 f. r  o* JFunction AutoKey(strKey)  
" ]' y- U6 @  \8 i. O. I$ LCONST lngSubKey=2  
) r/ d0 a3 r* [( Y& B; kDim lngLenKey, strNew1, strNew2, i, strSubKey  
# n" d# C9 {5 w( H! a
* m2 G  y2 U+ I4 j2 Y』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。  
" Z" t( q' I: h- x
$ D. j( ]4 u+ Hif 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  " m- s3 I3 |8 R
Response.Redirect "error.htm"  & L! _; P9 N- f
End If  
: f7 z: a3 |8 [) h: ylngLenKey=Len(strKey)  ) n, d1 D( R, D4 A
Select Case lngLenKey  
& f( H6 q$ W$ j: a9 m' [Case 0 若為空串,轉到出錯頁  * ]1 k. @  o, O7 C9 _3 |# b. R% n
Response.Redirect "error.htm"  % q( N8 J" `% ?, h
Case 1 若長度為1,則不設任何值  ; U) O5 `+ B# R8 p7 z
strNew1=""  1 B" v6 N1 E; ^& a- D
strNew2=""  3 S% d2 S' d; o7 I
』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件  
8 B; M0 N. I; \* `8 R. JFor i=1 To lngLenKey-(lngSubKey-1)  
* |1 ?, s/ A4 y) S3 NstrSubKey=Mid(strKey,i,lngSubKey)  
* x* m+ g2 K9 J! L2 sstrNew1=strNew1 & " or U_Name like %" & strSubKey & "%"  ! L6 d+ |4 B5 _' j( A
strNew2=strNew2 & " or U_Info like %" & strSubKey & "%"  1 V$ G3 r/ }: Y7 r$ B! [- J
Next  
* J9 v3 `% ?7 g; ?" JEnd Select  : w8 X! P0 s+ E8 H6 W8 A- N9 R8 [
』得到完整的SQL語句  ; r* a2 y' U7 Y; C. @' b& p

/ Y9 t. |0 c8 l2 U4 bAutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2  
8 J; k2 h$ e  x/ BEnd Function  
9 B4 e: H) h: Y! G: N% k%>
  要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。
  最後,別忘了將數據連接關閉,以釋放資源。

. }$ o8 K5 W. Y' a( B% |+ Z8 n
以下是代碼片段:8 n) L+ S3 m2 C2 w0 w5 r
<%  0 n" E" f$ }1 X' I' a, ~& f( s$ |
CNN.Close  ) a2 {/ G2 t9 d
Set CNN=Nothing  ! @7 ]+ l8 I! a% S
%>
  至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。
您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

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

點基

GMT+8, 2025-11-26 00:12

By DZ X3.5

小黑屋

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