过期域名预定抢注

 找回密碼
 免费注册

ASP實現網站智能分詞搜索

[複製鏈接]
發表於 2008-2-26 22:36:24 | 顯示全部樓層 |閱讀模式
用ASP實現搜索引擎的功能是一件很方便的事,可是,如何實現類似3721的智能搜索呢?比如,當在搜索條件框內輸入「中國人民」時,自動從中提取「中國」、「人民」等關鍵字並在數據庫內進行搜索。看完本文後,你就可以發現,這個功能實現起來竟然是如此的簡單。
0 {: o7 V) M/ R第一步,我們要建立一個名為db_sample.mdb的數據庫(本文以Access2000數據庫為例),並在其中建立表T_Sample。表T_Sample包括如下字段:
  ID 自動編號
$ ?3 q, d, g; z! ?! m, Q. e1 b6 u" n& O   U_Name 文本 ; g# k4 }* D  g/ t* J
   U_Info 備註
  第二步,我們開始設計搜索頁面Search.asp。該頁面包括一個表單(Frm_Search),表單內包括一個文本框和一個提交按鈕。並將表單的method屬性設為「get」 ,action屬性設為「Search.asp",即提交給網頁自身。代碼如下:
' j- a7 ^& j, g! v& E4 W7 m
以下是代碼片段:
4 [. F- j" t5 H) Y" c* f5 n<!-- Search.asp -->  2 _. Y# d8 d' W( }. X
<form name="frm_Search" method="get" action="Search.asp">  5 q" Z, N; q: O4 G- @9 L( }; X
請輸入關鍵字:    @6 q6 W/ o+ `9 i; g: \4 c
<input type="text" name="key" size="10">  $ G+ f$ i  ^0 E) M. S
<input type="submit" value="搜索">  
: ~# b# d) u/ Y7 _: h6 T' ]</form>
  下面,就進入了實現智能搜索的關鍵部分。
  首先,建立數據庫連接。在Search.asp的開始處加入如下代碼:

8 H" D8 D5 P! @5 Z2 s' p
以下是代碼片段:
3 P8 h4 `: a8 |" g<%  8 o1 R: H" Y' c3 c3 R5 V' n
  Dim strProvider,CNN  
' M: e7 Y0 A# M: i1 g  strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="  
& q- K2 c8 Z! D  strProvider=strProvider & Server.MapPath("\") & "\data\db_Sample.mdb" 假設數據庫存放在主頁根目錄下的data目錄下  
) F  z, p* f, G2 t1 C  Set CNN = Server.CreateObject("ADODB.connection")  8 m) g8 D4 D5 D
  CNN.Open strProvider 打開數據庫連接  # e2 `- t+ H; }; b% ]2 w+ @5 ~2 J9 {
%>
  接下來,判斷 ASP頁所接收到的數據,並在數據庫中進行搜索。
! K9 f+ `0 I4 J3 T& r) B

% r( r9 H+ Q9 a8 t
以下是代碼片段:
) S3 T1 p) _5 S, ]* \" M<font color="#FF0000">未找到任何結果!!!</font>  & v1 a$ b. \7 H
<%  
; j  h2 }5 J6 J4 K, \Else  
; h# J+ E; w# \9 c& U%>  
, q0 D/ }4 L2 v3 E  y搜索名稱為「<font color="#FF0000"><%= S_Key %></font>」的項,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 項:<p>  
" v( `7 d# g5 b& W<%  
' I1 M) }2 M0 A9 c2 ?  j% x/ ?3 xWhile Not RST.EOF 遍歷整個記錄集,顯示搜索到的信息並設置鏈接  
; i0 ~4 ^- J$ n2 ?%>  
3 S' J; z3 @0 @# d' p& c) ~<!-- 此處可設為你所需要的鏈接目標 -->  * j) D  l0 a+ F$ d
<font style="font: 12pt 細明體"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("U_Name") %></a></font>  
# s' X7 A# `# @: t+ C<!-- 顯示部分詳細內容 -->  5 V6 g' _. M  ?! ]+ `
<font style="font: 9pt 細明體"><%= Left(RST("U_Info"),150) %></font><p>  # L1 D! |6 W7 ~. `' |* X# L
<%  
7 W% R3 c* ~4 G0 l$ S+ D- {  RST.MoveNext  
  C: u! |8 O' ~3 R  Wend  
" _$ e5 a6 b8 M8 q. s8 @   RST.Close  6 T1 e/ Y1 v$ {1 A: N# w3 X
   Set RST=Nothing  
2 M$ P. @4 Z: J- }! ^/ n+ @" [/ E  End If  2 l5 w3 p) C& `. t$ ]* O7 y
End If  # r) w* p6 ^: q9 W
%>

/ U& W) }, ^: Q8 s  在上面的代碼中,有一個自定義函數 AutoKey ,該函數是實現智能搜索的核心所在。代碼如下:
. c+ R7 d/ A3 T5 G
以下是代碼片段:
/ C' c2 D0 a* J  s" Q$ L+ T<%  % S5 a4 J: t& {. q! O4 J0 @
Function AutoKey(strKey)  
  s; o) k# F( U# U' lCONST lngSubKey=2  
, c8 g2 j6 q7 \- r2 ?# gDim lngLenKey, strNew1, strNew2, i, strSubKey  
/ `3 i5 K( p! p6 o1 Q# C
' C' Y. y# o1 V$ a- }』檢測字符串的合法性,若不合法則轉到出錯頁。出錯頁你可以根據需要進行設定。  7 Z. A4 V$ t- {) d4 }- {  u

3 {- B/ i* Q' O7 Qif 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  ( h  d7 X% I( e4 A2 H* Y0 s
Response.Redirect "error.htm"  . ^  Z" \" F. \0 a6 u. V0 N9 L- w
End If  
  z/ ]8 v! ~" w% Z5 e2 glngLenKey=Len(strKey)  
: {# A$ l' p2 I% B7 J+ }Select Case lngLenKey  
  ~( `; u+ {  C4 ]Case 0 若為空串,轉到出錯頁  # Q  s/ ?/ X4 [5 Z
Response.Redirect "error.htm"  $ X  w" x9 H& \* F& z' A' }; m3 p
Case 1 若長度為1,則不設任何值  
3 f$ c9 }$ o) m; q( o6 g3 TstrNew1=""  % @+ S5 l8 h/ D% F2 _
strNew2=""  ! ?: _3 T' }4 {3 J
』Case Else 若長度大於1,則從字符串首字符開始,循環取長度為2的子字符串作為查詢條件  
$ h8 O7 _8 t3 V; x- ~For i=1 To lngLenKey-(lngSubKey-1)  
# Z0 [1 h9 e8 e0 z! F' f, MstrSubKey=Mid(strKey,i,lngSubKey)  
: r* |8 x7 s- C& rstrNew1=strNew1 & " or U_Name like %" & strSubKey & "%"  
- U: v+ _" ]% {2 E% \. ]( p7 ]strNew2=strNew2 & " or U_Info like %" & strSubKey & "%"  
8 F; [- u  _  FNext  . T5 K) w1 Q* {, X0 @4 S: C
End Select  
7 d. _4 c0 }$ J% F! G+ D+ u』得到完整的SQL語句  
% c" V+ U5 z2 |1 R, k/ K4 T+ n( O5 @( c6 c, W9 U+ q" r
AutoKey="Select * from T_Sample where U_Name like %" & strKey & "% or U_Info like %" & strKey & "%" & strNew1 & strNew2  * t! R' {3 D& m1 G& C$ ~3 d
End Function  
8 T( t  l0 M$ [" H; ~, U% ^%>
  要實現智能搜索,其核心就是將搜索關鍵字進行自動分組。在此處,我們使用了循環取長度為2的子串的方法。為什麼不將子串長度定為1、3、4或其他呢?這是因為若子串長度小於2即為1時,會失去將關鍵字分組的功能,而若子串長度大於2,則會丟失一些詞組。大家可以將 CONST lngSubKey=2改為其他數字試一試,孰優孰劣自見分曉。
  最後,別忘了將數據連接關閉,以釋放資源。
* _) @+ Z* M; L& x9 z
以下是代碼片段:0 N4 q) S, C# w5 Z4 P* a1 R
<%  
% t1 w4 U' a& V- MCNN.Close  
; p/ V$ ^4 M8 b! k# iSet CNN=Nothing  
  B1 @) n  N! V- S%>
  至此,這個智能搜索引擎已經完成了。你還可以將其繼續完善,比如添加分頁、突出顯示等功能。好了,不耽誤大家時間了,趕快去試一試吧。
您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

4um點基跨境網編創業社區

GMT+8, 2024-11-24 05:47

By DZ X3.5

小黑屋

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