过期域名预定抢注

 找回密碼
 免费注册

ASP實現網站智能分詞搜索

[複製鏈接]
發表於 2008-2-26 22:36:24 | 顯示全部樓層 |閱讀模式
用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。
6 n1 o0 d( K' m5 q; ^第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段:
  ID 自動編號
$ z4 a& g0 Z/ t/ F# P   U_Name 文本
* }7 J2 `( ]: ~$ w, Z, |( G   U_Info 備註
  第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:
! _+ ~: t( s3 Q2 s+ d
以下是代碼片段:
+ x0 V; T1 l8 r& K* T9 d& k<!-- Search.asp -->  
0 V; o3 I6 ^( v/ r9 K<form name="frm_Search" method="get" action="Search.asp">  
4 j! C* e: A4 P% ]$ e請輸入關鍵字:  
9 t2 Z7 j- b( I. ^/ o<input type="text" name="key" size="10">  & `; g  m9 K6 _0 S0 K
<input type="submit" value="搜索">  7 w' I0 i- n+ M- d
</form>
  下面,就進入了實現智能搜索的關鍵部分。
  首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:

2 _& `/ T0 v; N2 f
以下是代碼片段:& |" h0 `! y# l" `- l
<%  : f) T9 U  Z0 z  E6 _5 N- R$ ^- P
  Dim strProvider,CNN  1 R' {" _7 K4 d0 N/ @4 Y0 q
  strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="  " g% j& k* |" K9 K7 t
  strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下  # }- F9 b* B- E$ e% e
  Set CNN = Server.CreateObject("ADODB.connection")  
; }- ~/ `' A- u1 [5 O  CNN.Open strProvider 打開數據庫連接  
: b& F* v# Y1 Y# ?# Z5 k%>
  接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。

/ A' I7 Q4 M* ~, c$ O& o# b3 _; o# Z& \" f: a- O2 v
以下是代碼片段:
  P* L& i0 k" d! \/ U+ v* F<font color="#FF0000">未找到任何結果!!!</font>  
; a- t  Z2 H3 _8 O- H<%  
4 |( P* @" p  z7 {4 n: X' V* hElse  
* b9 D% F& o' p. o# C4 g%>  
) \) N1 A1 O3 }1 T  H% z; m: [0 x搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>  
0 ?, O* Y$ v8 ?9 q! ~8 w( ]<%  8 _5 `4 Y% p% y5 H# q
While Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接    k% [" S! x% f/ U% [8 K& E/ w7 b
%>  " P- O  Y$ B% }6 _' t
<!-- 此處可設為你所需要的鏈接目標 -->  
( e9 I7 j" D: ]2 i% v* A<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>  
8 [4 }7 h1 c4 s8 b<!-- 顯示部分詳細內容 -->  
  o1 Z" w: {" N; t, ?7 |<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>  
" F0 \/ g9 X- v9 w# l% a- w<%  $ B! k& S7 q# N2 e7 j7 P5 \
  RST.MoveNext  
. h. R: g  A+ m; @) T% @: j  Wend  
2 e) I, Q) B2 I' i, d   RST.Close  
! C% a! N* @8 h* [   Set RST=Nothing  
6 H8 o- K% M0 }5 x, b8 w; `  End If  
! f, a  O" d5 C4 b/ `9 b% Q9 dEnd If  8 v3 t. f$ G  ]3 q
%>

" ]4 }# h/ D+ C# m0 S$ H$ v  在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:
2 a* k0 V0 i7 u* {3 x
以下是代碼片段:+ Q7 ~: Q; B# W+ Q
<%  
/ K( t, ~. P5 W' w( A; k3 `Function AutoKey(strKey)  
: c$ {0 Q. u1 s% v2 g: l" p2 }CONST lngSubKey=2  
- H8 q9 h; g. d) uDim lngLenKey, strNew1, strNew2, i, strSubKey  
# {$ A. Y$ W9 v
/ o& Y# h7 ]+ q$ r* D& x3 U』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。  
" U! I" {9 f" U# _3 b; b) |7 c, X  i2 s" }( b/ ^' b" E
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  
7 m! Y, \3 E* C  \& Q. GResponse.Redirect "error.htm"  
; U6 C, r9 b7 X$ ~0 w9 ^End If  
/ F0 d% G* X1 C3 ^lngLenKey=Len(strKey)  ) l, U# i% S( D" V9 N  m" H; y5 }
Select Case lngLenKey  1 _$ ]3 d" F# c0 U% q
Case 0 若為空串,轉到出錯頁  
  h$ E$ ^# E( ]; wResponse.Redirect "error.htm"  3 Y' e% I" L0 A- o: C' b$ r
Case 1 若長度為1,則不設任何值  
9 S5 V* N& }% |& P' ?8 F, MstrNew1=""  + b/ I" J. T' Z  C
strNew2=""  . Y6 \5 G$ H* x4 ]0 ^
』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件  
/ ^( ]) I# [0 ~! cFor i=1 To lngLenKey-(lngSubKey-1)  " d6 c* |8 X2 _& I- [5 u3 l
strSubKey=Mid(strKey,i,lngSubKey)  $ w, K- ]( e6 |9 h9 e
strNew1=strNew1 & " or U_Name like %" & strSubKey & "%"  ( Q! e2 u6 p/ l# p
strNew2=strNew2 & " or U_Info like %" & strSubKey & "%"  
; p/ l' M! H; dNext  1 K) ]- o# b3 ?3 o& D. r( g
End Select  
0 y# W! t4 N, _. b) y( r』得到完整的SQL語句  
& R$ y( E3 [; F' d4 R4 x9 A% S5 V
( S  \& L: D7 |1 m7 DAutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2  
" }5 H6 q0 s" E/ q0 T! Y0 B& eEnd Function  
( R% f( M* S; [- V* @%>
  要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。
  最後,別忘了將數據連接關閉,以釋放資源。
! I7 m$ B! r. G7 y2 M3 \
以下是代碼片段:
5 P( J7 h4 i+ g; j  U) m) u) ~<%  / }- p" g* V4 Q) H0 P
CNN.Close  
  j# v& z) Q0 w+ I# C, \0 Z9 T) C9 vSet CNN=Nothing  
$ Z6 p) B4 d" j( F2 R$ l2 _%>
  至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。
您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

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

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

GMT+8, 2025-5-9 01:37

By DZ X3.5

小黑屋

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