CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Web 开发 >  ASP

请教搜索结果排序问题!

楼主bluecobra(我不抽烟)2003-09-02 17:41:53 在 Web 开发 / ASP 提问

请问哪位大虾做过新闻的多关键字搜索?  
  我现在是多关键字搜索结果是可以出来了,但我想像那些搜索引擎一样,按符合关键字的多少来进行排序.一下子搞不定!  
  谁有好的解决方法,恳请赐教! 问题点数:100、回复次数:10Top

1 楼wolf004(色胚)回复于 2003-09-02 17:47:48 得分 90

用ASP实现搜索引擎的功能是一件很方便的事,可是,如何实现类似3721的智能搜索呢?比如,当在搜索条件框内输入“中国人民”时,自动从中提取“中国”、“人民”等关键字并在数据库内进行搜索。看完本文后,你就可以发现,这个功能实现起来竟然是如此的简单。OK,Follow   Me!  
          第一步,我们要建立一个名为db_sample.mdb的数据库(本文以Access2000数据库为例),并在其中建立表T_Sample。表T_Sample包括如下字段:  
                  ID                         自动编号  
                  U_Name         文本  
                  U_Info             备注  
          第二步,我们开始设计搜索页面Search.asp。该页面包括一个表单(Frm_Search),表单内包括一个文本框和一个提交按钮。并将表单的method属性设为“get”   ,action属性设为“Search.asp",即提交给网页自身。代码如下:  
          <!--   Search.asp   -->  
          <form   name="frm_Search"   method="get"   action="Search.asp">  
                请输入关键字:    
                <input   type="text"   name="key"   size="10">  
                <input   type="submit"   value="搜索">  
          </form>  
          下面,就进入了实现智能搜索的关键部分。  
          首先,建立数据库连接。在Search.asp的开始处加入如下代码:  
          <%  
          Dim   strProvider,CNN  
                  strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data   Source="  
                  strProvider=strProvider   &   Server.MapPath("\")   &   "\data\db_Sample.mdb"     '假设数据库存放在主页根目录下的data目录下  
                  Set   CNN   =   Server.CreateObject("ADODB.connection")  
                  CNN.Open   strProvider     '打开数据库连接  
          %>  
          接下来,判断   ASP页所接收到的数据,并在数据库中进行搜索。  
          <%  
          Dim   S_Key,RST,StrSQL  
                  S_Key   =   Trim(Request("key"))       '得到搜索关键字的值  
                  If   S_Key   <>""   then    
                          Set   RST=Server.CreateObject("ADODB.RecordSet")  
                          StrSQL=AutoKey(S_Key)     '此处使用自定义函数   AutoKey(),该函数为实现智能搜索的核心  
                          RST.Open   StrSQL,CNN,3,2     '得到搜索后的记录  
       
                          If   RST.BOF   And   RST.EOF   Then  
          %>  
                                  <font   color="#FF0000">未找到任何结果!!!</font>    
          <%  
                                  Else  
          %>  
                                          搜索名称为“<font   color="#FF0000"><%=   S_Key   %></font>”的项,共找到   <font   color="#FF0000"><%=   RST.RecordCount   %></font>   项:<p>  
          <%  
                                          While   Not   RST.EOF       '遍历整个记录集,显示搜索到的信息并设置链接  
          %>  
                                                  <!--   此处可设为你所需要的链接目标   -->  
                                                  <font   style="font:   12pt   宋体"><a   href="info.asp?ID=<%=   RST("ID")   %>"   target="_blank"><%=   RST("U_Name")   %></a></font><br>      
                                                  <!--   显示部分详细内容   -->  
                                                  <font   style="font:   9pt   宋体"><%=   Left(RST("U_Info"),150)   %></font><p>      
          <%  
                                                  RST.MoveNext  
                                          Wend  
                                          RST.Close  
                                          Set   RST=Nothing  
                          End   If  
                  End   If  
          %>  
          在上面的代码中,有一个自定义函数   AutoKey   ,该函数是实现智能搜索的核心所在。代码如下:  
          <%  
          Function   AutoKey(strKey)  
                  CONST   lngSubKey=2  
                  Dim   lngLenKey,   strNew1,   strNew2,   i,   strSubKey  
     
                  '检测字符串的合法性,若不合法则转到出错页。出错页你可以根据需要进行设定。  
                  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  
                          Response.Redirect   "error.htm"  
                  End   If  
     
                  lngLenKey=Len(strKey)  
                  Select   Case   lngLenKey  
                          Case   0       '若为空串,转到出错页  
                                  Response.Redirect   "error.htm"      
                          Case   1       '若长度为1,则不设任何值  
                                  strNew1=""  
                                  strNew2=""  
                          Case   Else     '若长度大于1,则从字符串首字符开始,循环取长度为2的子字符串作为查询条件  
                                  For   i=1   To   lngLenKey-(lngSubKey-1)  
                                          strSubKey=Mid(strKey,i,lngSubKey)  
                                          strNew1=strNew1   &   "   or   U_Name   like   '%"   &   strSubKey   &   "%'"  
                                          strNew2=strNew2   &   "   or   U_Info   like   '%"   &   strSubKey   &   "%'"  
                                  Next  
                  End   Select  
     
                  '得到完整的SQL语句  
                  AutoKey="Select   *   from   T_Sample   where   U_Name   like   '%"   &   strKey   &   "%'   or   U_Info   like   '%"   &   strKey   &   "%'"   &   strNew1   &   strNew2  
     
          End   Function  
          %>  
          要实现智能搜索,其核心就是将搜索关键字进行自动分组。在此处,我们使用了循环取长度为2的子串的方法。为什么不将子串长度定为1、3、4或其他呢?这是因为若子串长度小于2即为1时,会失去将关键字分组的功能,而若子串长度大于2,则会丢失一些词组。大家可以将   CONST   lngSubKey=2改为其他数字试一试,孰优孰劣自见分晓。  
          最后,别忘了将数据连接关闭,以释放资源。  
          <%  
                  CNN.Close  
                  Set   CNN=Nothing  
          %>  
          至此,这个智能搜索引擎已经完成了。你还可以将其继续完善,比如添加分页、突出显示等功能。好了,不耽误大家时间了,赶快去试一试吧。Top

2 楼wolf004(色胚)回复于 2003-09-02 17:48:26 得分 0

根据   Split   结果生成   SQL   语句  
  <%attribs="商场名^^快餐店名^^报停名"  
  names=Split(attribs,"^^")  
  i=0  
  sql="select   top   10   *   from   TableName   where"  
  for   each   name   in   names  
      if   names(i)="商场名"   then  
          sql=sql+"   or   商场   like   '%"&names(i)&"%'"  
      end   if  
      if   names(i)="快餐店名"   then  
          sql=sql+"   or   快餐店   like   '%"&names(i)&"%'"  
      end   if  
      if   names(i)="报停名"   then  
          sql=sql+"   or   快餐店   like   '%"&names(i)&"%'"  
      end   if  
      i=i+1  
  next  
  sql=sql+"   Ordey   by   Id   DESC"  
  sql=Replace(sql,   "where   or",   "where")  
  response.write   sql%>  
   
  程序运行结果:  
  select   top   10   *   from   TableName   where   商场   like   '%商场名%'   or   快餐店   like   '%快餐店名%'   or   快餐店   like   '%报停名%'   Ordey   by   Id   DESC    
  Top

3 楼wolf004(色胚)回复于 2003-09-02 17:52:30 得分 0

<%   dim   sfzh,xm,xb,flag       //可按身份证号或姓名或性别  
        sfzh=trim(request.form("sfzh"))  
        xm=trim(request.form("xm"))  
      s1="select   xm   ,sfzh   ,xb   ,dwmc   ,zgbm     from   ryjbqk   where"  
        if   sfzh<>""   then  
        s1=s1&"sfzh='"&sfzh&"'"  
  flag=1  
  end   if  
            if   xm<>""   and   flag=1   then  
  s1=s1&"and   xm   like   '%"&xm&"%'"  
  flag=1  
  else   if   xm<>""   then  
  s1=s1&"xm   like   '%"&xm&"%'"  
  flag=1  
  end   if  
   
   
        rs.open   s1,conn,1,1  
        if   not   rs.eof   then%>Top

4 楼bluecobra(我不抽烟)回复于 2003-09-02 18:05:52 得分 0

我想你们都弄错我的意思了!  
   
  我是说多关键字搜索我是实现了,就是在排序的时候想把符合关键字最多的记录排在前面显示,少的排在后面,关键是这个问题!  
   
  还是要感谢楼上的几位!Top

5 楼csdntoll(伊人美食LadyFood.Com)回复于 2003-09-02 18:09:52 得分 0

我理解楼主的意思:  
   
  就是我输入:测试   系统   ASP,3个关键字,  
   
  含有这3个关键字的记录排在前面,  
   
  跟着是含有这2个关键字的记录  
   
  跟着是含有这1个的  
   
  是这个意思吧?Top

6 楼wolf004(色胚)回复于 2003-09-02 18:11:07 得分 0

楼上就我一位!  
  是按符合关键字的多少来排!  
  这个好像没有吧!  
  只有按什么id或时间这类东西来排的吧!  
  Top

7 楼wolf004(色胚)回复于 2003-09-02 18:12:26 得分 0

你理解意思,那知道怎么实现吗!  
  问题或许不是3个关键字呢~?一串呢!@Top

8 楼eyumumc(雨幕)回复于 2003-09-02 23:10:37 得分 0

我想应该是这样的……首先需要将搜索关键字保存到数组里……然后组合查询……最先查出包含全部n个关键字的结果……再查包含n-1个结果……再n-2……直到最后是包含一个关键字的结果……  
  这里的关键问题是如何从n个关键字中选出n-x个关键字……  
  Top

9 楼eyumumc(雨幕)回复于 2003-09-02 23:27:33 得分 10

我举个例子吧:  
  searchStr=split(txtSearch,"   ")  
  max   =   ubound(searchStr)  
  for   i   =   max   to   1   step   -1  
  for   j   =   i   to   1   step   -1  
  selectStr(j)=searchStr(k)  
  next  
  sql   =   "search   *   from   table   "  
  sql   =   sql   &   "where   fieldName   like   '%"   selectStr(i)   "%'"  
  for   k   =   1   to   i-1  
  sql   =   sql   &   "   and   fieldName   like   '%"   selectStr(k)   "%'"  
  next  
  conn.execute(sql)  
  next  
  关键就是数组selectStr的生产……也就是k的产生问题……Top

10 楼eyumumc(雨幕)回复于 2003-09-02 23:43:52 得分 0

比如……我现在有5(max)个关键字(searchStr)……在某一时刻我要查找包含3(k)个关键字(selectStr)的结果……关键问题就是要如何重找3(k)个关键字出来……而且要保证不重复……这就是个找组合的问题……Top

相关问题

  • 搜索引擎搜索结果的排序?
  • 搜索及排序问题....
  • 剩80分了。搜索结果相关性排序问题。多谢,进来看看~
  • 跪求sql语句 搜索排序
  • 关键字搜索排序问题
  • oracle中结果集的排序问题。
  • 如何给union 的结果排序?
  • 将联合查询的结果排序
  • 结果集排序问题。急...........................
  • 要帮老外做一个搜索数据库的功能。要求按相关性来排序搜索结果(类似于做搜索引擎),具体见内。请大家多多指教

关键词

  • 函数
  • 数据库
  • 智能
  • 代码
  • 搜索引擎
  • 关键字
  • strkey
  • strnew
  • autokey
  • 子串

得分解答快速导航

  • 帖主:bluecobra
  • wolf004
  • eyumumc

相关链接

  • Web开发类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo