过期域名预定抢注

 找回密碼
 免费注册

ASP實現網站智能分詞搜索

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

- Q3 B2 S# P7 i3 H/ u
以下是代碼片段:
1 a. d3 @9 o' _: b: C4 v- p<!-- Search.asp -->  
9 i5 Z5 Q2 o, o! K9 ^- q<form name="frm_Search" method="get" action="Search.asp">  
0 Z. p- J+ ^& O( {! j# [8 L請輸入關鍵字:  
2 a- a9 o, a8 _<input type="text" name="key" size="10">  
& L/ ]# k8 ?2 c  N# B<input type="submit" value="搜索">  
7 ?! @8 \; F9 l1 A5 A: k' a</form>
  下面,就進入了實現智能搜索的關鍵部分。
  首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:
0 O4 s) W- O) O$ \4 n3 B9 _8 l3 h8 V
以下是代碼片段:$ s9 q, t1 m1 r" o3 c: s% m3 a
<%  
+ P5 W. l$ N3 f1 [; G7 Y  Dim strProvider,CNN  
8 o0 d6 D' K: b5 `. C7 x, O  strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="  
- A2 v% f* w" I" w/ @6 M  strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下  . A( P) U9 U8 e+ Q, N
  Set CNN = Server.CreateObject("ADODB.connection")  
" k3 l$ y1 j! \( L  CNN.Open strProvider 打開數據庫連接  0 n2 w9 x: q, d+ D' F8 L& p
%>
  接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。
( ?* P* P' H* t
7 m& }" |" D' R0 Y
以下是代碼片段:+ X" u9 W; N# Y# |  V6 m" C% r
<font color="#FF0000">未找到任何結果!!!</font>  
9 Z' x: J. q5 l$ u' g- e( A; H<%  2 S( r. y2 O4 l9 ]  t5 D
Else  3 v- r8 a( H, z4 C0 i
%>  
* @) K& C/ j# `: w/ t搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>  
; }+ F) l4 }& e<%  ) Z; {! V5 A8 z5 d- Q( Q( Y% n
While Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接  
9 ~) M" q8 j. n" z7 ]%>  & ?: o( F, q) Y/ H0 [
<!-- 此處可設為你所需要的鏈接目標 -->  ' v( f) k# ~. j
<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>  
- A6 T4 m. g4 t" O4 v: f<!-- 顯示部分詳細內容 -->  * j: m. e3 b$ u1 c; k& t
<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>    Z) @. F$ e6 K" w" N5 @8 \3 n9 o  o
<%  ) t) A+ q: w" g
  RST.MoveNext  7 i$ S8 I5 I0 p: C- j& h
  Wend  , ]& s3 n, Q! C
   RST.Close  8 H8 s# ~- e2 s" r  a! s$ a
   Set RST=Nothing  
5 q4 s! Q5 P$ c4 C  End If  $ }. |! d8 f* x: F+ @
End If  ; I; i( o9 @: i  a  R/ |5 L. o1 K
%>

7 C( f- x4 ?2 {) n  在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:
8 w/ H; |1 B3 {* Y: Q2 ?
以下是代碼片段:
: Q- g; s9 B+ ?2 g/ p" k<%  4 Z: w5 q' M- \9 W2 T$ K
Function AutoKey(strKey)  ; R1 {1 q  H  Y! p
CONST lngSubKey=2  
) \! m/ c1 n5 S$ e1 {Dim lngLenKey, strNew1, strNew2, i, strSubKey  , W3 z: T' s: P) C6 f( ^
0 u+ V8 g7 b$ }5 l/ d- J
』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。  
2 W  X& x7 e* G
  b) a( t, M- Z" [' g8 m* e$ i6 {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  ) ]; I9 W# l9 w7 b! r6 _
Response.Redirect "error.htm"  * `3 W2 ^+ O7 q& n
End If  
; q6 H4 @7 k( Q0 |  N$ qlngLenKey=Len(strKey)  
' @# C/ h1 s0 |4 X9 f; u& Y/ GSelect Case lngLenKey  8 g0 V$ \- |* j8 R9 k& a
Case 0 若為空串,轉到出錯頁  0 ^; q" X3 J# Z- ^; l; A
Response.Redirect "error.htm"    d# A8 V* b# b
Case 1 若長度為1,則不設任何值  
, f4 C! J7 R7 z) |* M& I7 {  JstrNew1=""  
% V6 u$ Q& }, X! w7 F# h! P+ \& cstrNew2=""  
/ h$ R+ _2 z4 ^. F』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件  
: d2 n) u) M+ _5 F* Q" f3 |For i=1 To lngLenKey-(lngSubKey-1)  8 U& ?2 |8 {, h2 U7 I
strSubKey=Mid(strKey,i,lngSubKey)  
# e' k( K; S2 s' AstrNew1=strNew1 & " or U_Name like %" & strSubKey & "%"  + w9 s0 W2 l- R9 n# d( ]- C" K
strNew2=strNew2 & " or U_Info like %" & strSubKey & "%"  
9 b" B6 b3 |" {3 X# C  v+ F2 ~( cNext  
) f( b3 a9 i9 OEnd Select  
/ q" |% p; S: L' y; o$ r』得到完整的SQL語句  . m# |7 @4 R! Y6 D9 C

5 H; v: {  b* S3 ?9 }AutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2  
, q# b, q  }; D8 f1 u6 I& YEnd Function  
: G5 o- C0 K" N  V9 [%>
  要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。
  最後,別忘了將數據連接關閉,以釋放資源。

, e+ Q1 z: q) M) i" Y' _, R& U" p
以下是代碼片段:5 j% J2 f. d, e0 o' O$ S  C
<%  7 Z! ~- I$ k$ `: Z* a# f+ i
CNN.Close  : C6 p% F* d6 h. z2 t( O
Set CNN=Nothing  
# A' O* H9 z+ g. N3 ~2 e- X$ s9 N# g%>
  至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。
您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

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

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

GMT+8, 2025-7-19 06:51

By DZ X3.5

小黑屋

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