过期域名预定抢注

 找回密碼
 免费注册

ASP實現網站智能分詞搜索

[複製鏈接]
發表於 2008-2-26 22:36:24 | 顯示全部樓層 |閱讀模式
用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。 - l8 y" H( S7 n9 z6 q
第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段:
  ID 自動編號
9 |0 O* R- T* ~   U_Name 文本 ' r$ {3 W( a5 s4 ]7 h, D
   U_Info 備註
  第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:

/ e4 [' F0 z9 w# z& I
以下是代碼片段:8 Z3 j, ^, s! s" z% w* k0 |
<!-- Search.asp -->  
# M- S$ v6 }3 b<form name="frm_Search" method="get" action="Search.asp">  
1 D8 e4 V3 e% k7 w5 {4 ^請輸入關鍵字:  ! ]# X- V$ q5 @% q( u, v! d0 o8 I
<input type="text" name="key" size="10">  
  G7 M1 ]# \( @9 {% d! _<input type="submit" value="搜索">  
! b  o; I) ~+ d0 r' T1 k</form>
  下面,就進入了實現智能搜索的關鍵部分。
  首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:

; C; ?6 K0 A  g
以下是代碼片段:5 n: Y0 D" w( U
<%  
) C2 {: E9 g/ c/ U  Dim strProvider,CNN  ' H% `) _3 u& {0 G* g, c! B+ D
  strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="  
0 l( I% s  m9 \4 x  strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下  , D+ T  J, `9 Q6 |9 [
  Set CNN = Server.CreateObject("ADODB.connection")  
. c& G6 ^% G3 J% S- Y  CNN.Open strProvider 打開數據庫連接  
* M/ @4 h$ `3 j# T  j+ _; I%>
  接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。

0 u* k$ Y/ S! b# z  |" c9 B8 K( F$ P4 S0 d
以下是代碼片段:
8 K/ d& _& c( I: h4 k* z% U$ v<font color="#FF0000">未找到任何結果!!!</font>  
% P. F/ n, r# L+ K<%  
6 c- p" N2 K1 fElse  
" `' z$ c1 [5 J9 R* n* }% T%>  
" R; |0 y# t7 e- t: L# r* I$ m- u搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>  5 A. r# Q9 R9 \8 S' X% p
<%  
! Z; ]! l! p7 F2 b) yWhile Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接  
6 {) I" i' f5 g, _% ^& x%>  
9 Y0 U  ?# @" R' i7 j<!-- 此處可設為你所需要的鏈接目標 -->  
) R7 u. k; J  o# R% v4 x$ i<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>  # ]6 h" x1 e% D
<!-- 顯示部分詳細內容 -->  
# Z/ o1 B5 p+ V0 M# q<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>  . z9 q# g5 ?% d3 M& Y
<%  2 M2 ?  Q9 {8 ]( Y
  RST.MoveNext  
8 A2 c8 F3 I5 D* L: O  Wend  
" U( ?+ r; i& L1 P1 E2 I   RST.Close  ; F! m2 r* y  E8 n$ |) G6 O
   Set RST=Nothing  : p% e* a+ `# y' F$ y  Y; M) c$ a7 v: U
  End If  
7 H- L/ ]$ \6 H+ k# BEnd If  8 s' z0 q: j+ a$ o, P2 V$ M; i
%>
5 o$ D, h* I1 ?" l( v
  在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:
+ D2 L" u; [) e' c: ^; z' Q
以下是代碼片段:3 n' d2 K0 q# C$ r
<%  
; a: m: \# ^& D8 T- I% cFunction AutoKey(strKey)  , n! [- r7 s0 B8 V
CONST lngSubKey=2  ) t5 W% H) W" g$ a" o& [3 D! O% G
Dim lngLenKey, strNew1, strNew2, i, strSubKey  
  H- m* P9 d( K9 Z4 k$ u  U
" U( ?8 |# Y: W: V. s  e』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。  
- o( N9 {8 s5 @9 z2 T0 r
3 k2 L" h, E$ g. w( C2 uif 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  
$ F8 a5 b( k0 K: X6 `6 s  v4 F. ~3 GResponse.Redirect "error.htm"  2 I8 @" y: @/ L2 n0 W' \
End If  : n$ G& E  y+ B$ ^# F" R6 V" o
lngLenKey=Len(strKey)  ! E; J- R) H% c3 Y" F" K, R1 @; C
Select Case lngLenKey  
1 D$ @* r9 ]( b2 }Case 0 若為空串,轉到出錯頁  
: e& f; U, h- C/ _5 v! ]8 K9 o) }Response.Redirect "error.htm"  
% t& N& V8 \& f  q' a( L3 nCase 1 若長度為1,則不設任何值  
1 S! A+ P8 W. b$ WstrNew1=""  
- ^  c" o1 P2 i3 T" P) Y7 PstrNew2=""  : G+ X" \: f! }* v. x; E; e2 M
』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件  
, V$ U2 e  n7 \: \7 W6 @For i=1 To lngLenKey-(lngSubKey-1)  ) D7 t4 n+ ?4 B% {$ w1 ~& {6 W
strSubKey=Mid(strKey,i,lngSubKey)  
' N! x# K# c6 [8 @strNew1=strNew1 & " or U_Name like %" & strSubKey & "%"  
9 \6 j) F) r+ U, J: \: e9 xstrNew2=strNew2 & " or U_Info like %" & strSubKey & "%"  
9 S) t$ d* o$ ?' }$ n3 ^Next  # T/ I2 T0 r/ A& w6 n$ V0 W
End Select  
3 k1 f0 h. {  D0 E" l2 k3 H』得到完整的SQL語句  
1 Y" f  h. w9 R0 \
* y5 H# c' F* o+ Q: KAutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2  
; p6 f2 a8 ?" GEnd Function  
, W5 A# O" u" ^- M3 m. n; R" z%>
  要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。
  最後,別忘了將數據連接關閉,以釋放資源。

& X5 K4 i$ Y  x9 K. B' q
以下是代碼片段:$ M' @2 }( o7 L% V* S
<%  $ u3 D0 D, a+ ]2 M% x& j6 b8 v
CNN.Close  
/ q; @3 n; |- I5 |( i2 TSet CNN=Nothing  : G) P4 a( @& M3 J) t6 r, |9 z
%>
  至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。
您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

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

GMT+8, 2025-4-5 20:51

By DZ X3.5

小黑屋

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