过期域名预定抢注

 找回密碼
 免费注册

ASP實現網站智能分詞搜索

[複製鏈接]
發表於 2008-2-26 22:36:24 | 顯示全部樓層 |閱讀模式
用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。
1 g, N: H6 d( X) a. @: O第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段:
  ID 自動編號
: N* D7 s, ]* J, R2 J  ]* z9 s   U_Name 文本 $ X/ q( {& [5 e9 X0 ^
   U_Info 備註
  第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:
6 x7 O# F4 }' N* z" m
以下是代碼片段:
% \. v7 H/ m# O; C<!-- Search.asp -->  
& L) F/ C. c0 k5 C# }% Y0 ?<form name="frm_Search" method="get" action="Search.asp">  
0 w8 C$ k" o( P7 |2 i請輸入關鍵字:  / B7 r# ^( p; @; ?, _
<input type="text" name="key" size="10">  # B! T( A9 H1 H& X! w8 }+ x. \
<input type="submit" value="搜索">  
% ?' {  c9 O# @* l7 B</form>
  下面,就進入了實現智能搜索的關鍵部分。
  首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:
: J, f# ~5 \' @) ]8 e1 W- t
以下是代碼片段:
* S2 I5 Q1 Q( e' H! _6 w0 F; S<%  - x: H% z# u! X. W: ~+ P
  Dim strProvider,CNN  
& v  J, S* l: z; k5 C  @0 O  strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="  
; T+ A* E: ]% G4 Y( Z3 C  strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下  
$ x. W' P  z* T5 p5 T  Set CNN = Server.CreateObject("ADODB.connection")  
; c6 C0 _" u2 W4 c9 {& U% }% I: R  CNN.Open strProvider 打開數據庫連接  7 D1 }) y9 V  r7 ^0 p+ ~  p
%>
  接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。

: g# R& a1 _: R9 l3 P. @0 U- J: d* h3 E2 U$ ]
以下是代碼片段:' n# K8 C. A& E
<font color="#FF0000">未找到任何結果!!!</font>  7 D9 w0 G% w7 w  m, u: s$ r
<%  4 M4 J5 C% H5 O9 t$ ^+ S
Else  
! I/ g. a2 O: D# I; k0 i' N' t" `, I%>  ) G' u9 Q& |0 }
搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>  
9 @1 W& l4 w+ ]5 ~% p8 I" i<%  - i7 `1 m! n, G- N1 _! Q2 D) Y9 `, D/ }, i
While Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接  9 i2 P+ I2 t  p% Q$ \: l6 M5 W
%>  
9 T0 Y% |% L  J& L. L3 q# A) g<!-- 此處可設為你所需要的鏈接目標 -->  2 b7 R; @8 P7 w4 V
<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>  8 A. o8 R" `8 }4 p" d* t) F
<!-- 顯示部分詳細內容 -->  1 P( K5 D0 p; B$ L
<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>  
" o5 ^* [; p" }$ k  Y3 H" y1 E3 T<%  & R2 z* z3 A" j, {0 p4 g
  RST.MoveNext  9 O! B/ h' \7 h" ^& k7 Z# x
  Wend  
$ i2 I, z/ h7 p* c/ {   RST.Close  . q0 \; G7 l, J) G, Z. i
   Set RST=Nothing  . q8 y, r" ~& e+ V( z* Q$ p+ ^4 k4 `
  End If  
; D- S0 i, l; k- Q9 MEnd If  1 S. T: C! k7 d; s6 m
%>
1 l. X" s" f; [) v' }) _) ]
  在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:

! ~5 T$ j' N% V
以下是代碼片段:
9 V. y9 k* Z0 G- g4 ]- t<%  ) M" a# A8 k' A' q0 B+ P. H
Function AutoKey(strKey)  ) }6 g/ o$ q* b9 x8 ~* c
CONST lngSubKey=2  
- Z, ]% `3 v: j1 j. u( b( Q* M2 iDim lngLenKey, strNew1, strNew2, i, strSubKey  
; e& l: _! J0 O* K$ w
% g4 R8 f3 Z8 T; Z9 F( N4 Q4 J』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。  
$ k% A$ Z' X7 r6 f6 ]$ q$ H* L& B$ H9 @7 |
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  6 O5 B/ b- S* b
Response.Redirect "error.htm"  " k% a3 u2 Z% l" i  `1 J+ z
End If  1 R* ]5 ~& w) s6 S
lngLenKey=Len(strKey)  
8 b/ C" b3 ?/ I  d. A8 YSelect Case lngLenKey  ! q; Q8 L9 s7 C9 O* u' n9 {
Case 0 若為空串,轉到出錯頁  
  o$ W# K: L  f4 X& x- I: v- PResponse.Redirect "error.htm"  ( M! d$ b: K) u* l+ t5 W  ~
Case 1 若長度為1,則不設任何值  $ D" l1 k  m2 @- Y" q
strNew1=""    D: d2 Q$ b3 {7 {* l  U. ]0 \
strNew2=""  9 H3 ~) W& K, w6 u
』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件  : z! M7 y5 e  Z5 C8 R% l! p; M
For i=1 To lngLenKey-(lngSubKey-1)  
. O/ I; T2 B6 n  v) N& U: a3 Z" [strSubKey=Mid(strKey,i,lngSubKey)  
2 s  L6 V/ j9 ?& f+ _+ K2 T3 MstrNew1=strNew1 & " or U_Name like %" & strSubKey & "%"  8 i4 |# Q0 V0 q; l
strNew2=strNew2 & " or U_Info like %" & strSubKey & "%"  4 f1 H1 R% i6 _% g- z
Next  
. I8 ]2 t5 ^, |, |  }( g3 PEnd Select  
9 A6 \" O1 O' x8 J, V』得到完整的SQL語句  2 f# m% N  k3 K# r% T4 \
$ n. s* \5 x  Q  Y
AutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2  
+ v( Q/ H' z! @5 H3 g% T/ WEnd Function  % r8 k9 Z* G1 a3 S# M& o( F
%>
  要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。
  最後,別忘了將數據連接關閉,以釋放資源。
: n: B) y9 g/ u
以下是代碼片段:
& L& R+ z+ i) A<%  1 p' Y. R5 u. E/ c" `
CNN.Close  
5 ]6 T, Y, b: @! o+ q1 B5 USet CNN=Nothing  
7 j, a* y; C% a& k% A3 g3 w, L%>
  至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。
您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

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

點基

GMT+8, 2025-10-31 16:58

By DZ X3.5

小黑屋

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