CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  应用实例

关于搜索,不知道单纯在数据库里能否完成……?欢迎高手参与讨论

楼主Kandy(济沧海)2004-12-03 09:50:46 在 MS-SQL Server / 应用实例 提问

命题如下:  
  有一表里面有几十万景点信息。例如:八仙洞,玉皇阁,香溪洞  
  今有一段文字如下:  
  --------------------------------  
  行程安排:    
  D1   中午乘火车从西安出发,下午抵达安康。                                                                                   住安康  
  D2   上午赴香溪洞风景区,游八仙洞、天梯、玉皇阁,下午赴瀛湖风景区、船有金罗岛、  
          翠屏岛、岚河漂流。                                                                                                                     住安康  
  D3   早上或中午安康火车站送团。  
  -------------------------------  
  希望得到的结果:凡是在景点信息表里有的景点的名字在上面那段文字里都加上<>,也就是在景点名称的两边加上<>,如:<八仙洞>  
   
  考虑:  
  1、如先读取表信息然后循环替换掉那段文字中的对应文字并加上<>是可以完成命题的,但是事实上每加一段文字就循环一遍如此多的记录显然效率极其低下。故此种解决方法不必跟贴。  
  2、排除1,则只能从那段文字入手,如果考虑景点名称最多为N个字,则须从那段文字的  
  第1个字到第N个字(查询一下景点表,如符合则加<>),2个字到第N个字(查询表)……一直循环到=N-1为止  
  第2个字到第N+1个字(查询表),第3个字到第N+1个(字查询表),……   一直循环到N为止  
  如果一段文字有X个字  
  ……  
  则需要循环(N-1)*(X-N+1)次,也就是完成这么多次对表的查询,如结果匹配则替换加<>  
   
  例如有这么一段话:  
   
  这个只是个测试啊  
  共8个字  
   
  替换“个只”为“<个只>”  
   
  替换最大字符为4个字符,这样在限度范围内我也可以替换“只是个”  
  需要完成的循环如下:  
  1-4,2-4,3-4  
  2-5,3-5,4-5  
  3-6,4-6,5-6  
  4-7,5-7,6-7  
  5-8,6-8,7-8  
   
   
  3*5=15次  
   
  X个字,最大N个字符  
   
  (N-1)*(X-N+1)  
   
  如此看来一段200字的10个最大替换字符需要完成对数据库的1719次查询。  
   
  --------------------------------------------------------------------  
  我其实是想实现这样的功能,假如有人发表一篇旅游日记,则在他旅游日记发表的同时,他日记里所写的景点自动加上联接以联结到该景点的介绍文字,他的日记可能会有2000字,按照10个字符,这样完成的查询就有17919次,也是近两万次的查询,开销依旧比较大。  
  --------------------------------------------------------------------  
   
  本来这样的命题我想应该配合其他语言来解决,但是,单纯的靠数据库真的无法解决了吗?有没有除了上述两种方法以外的算法或者类似的二叉树等算法更快更好得完成命题呢?  
   
  欢迎跟贴讨论,欢迎UP,欢迎大家学习,毕竟,我觉得这应该是个很实用的东西。  
   
   
   
   
  问题点数:50、回复次数:18Top

1 楼good2speed(Goodspeed)回复于 2004-12-03 09:54:50 得分 0

用正则表达式Top

2 楼Kandy(济沧海)回复于 2004-12-03 10:05:07 得分 0

倒,楼上混得连正则表达式都知道了Top

3 楼Kandy(济沧海)回复于 2004-12-03 10:13:38 得分 0

本人想了想,也可以不对表完成那么多次查询,但是仍然要对文字完成那么多次的截取,截取完毕用in或者like来组成查询,效率不知道如何,还没测试,只想找个更合适的方法。SQL   里支持正则表达式吗?混饭的不要乱说了……Top

4 楼tddw(承接各种项目)回复于 2004-12-03 13:05:01 得分 0

在asp页面中把数据拿出来用正则表达式完成Top

5 楼Kandy(济沧海)回复于 2004-12-03 13:28:06 得分 0

麻烦各位了!把命题看清楚再回答,叫着:正则表达式……很有用么?Top

6 楼tddw(承接各种项目)回复于 2004-12-03 13:46:34 得分 0

以上问题用正则表达式肯定能解决。  
  答:正则表达式非常有用。  
   
  你在asp里面把数据库里的数据拿出来,  
  然后在asp页面里对数据进行处理,用正则表达式进行替换,换好之后再放回去,就OK了。  
   
  关于正则表达式,就不多述,楼主可以找找相关资料Top

7 楼tddw(承接各种项目)回复于 2004-12-03 13:47:34 得分 0

另,这个把数据拿出来替换,不是一个个的查找一个个的替换的,所以,你不用担心效率,因为用正则表达式,可以不用循环,一条语句就可以把你所有要换的东西换掉。Top

8 楼Kandy(济沧海)回复于 2004-12-03 15:11:32 得分 0

我倒,把命题看清楚啊,老大,把数据拿出来,怎么拿出来,怎么替换?加一条数据就去拿几十万条记录?如果一个5000人在线的地方大家发布的日记或者游记象你这么拿数据估计拿都拿死了Top

9 楼Kandy(济沧海)回复于 2004-12-03 15:14:05 得分 0

我故意把这个问题发到SQL-SERVER的开发论坛里,希望找个适中的解决方法,别再提ASP了好不好……Top

10 楼Kandy(济沧海)回复于 2004-12-03 15:20:17 得分 0

谢谢楼主教导正则,不过作为我个人经验来看一个普通的一次替换正则的开销比REPLACE要差得多,  
  况且一个2000字文章包括标点拆分成所有的可能的词你知道会拆分成多少个词吗?Top

11 楼t4423an(木精灵)回复于 2004-12-03 17:14:41 得分 0

改进数据结构设计 用查找表    
   
  正则是能在第二层发挥很大的作用.Top

12 楼Kandy(济沧海)回复于 2004-12-05 09:26:01 得分 0

查找表?查找什么表?请说具体点,别显得高深莫测一般,请问你的意思是把每个景点都放在一个表里,然后查找几十万个表?还是查找什么表?第二层是什么意思?正则能在第二层发挥很大作用???????  
   
   
  有能把命题看完整看明白再说方法的吗?Top

13 楼yyyjff(自己坚强的日子才精彩,坚强的心注定赢得幸福.)回复于 2004-12-07 17:50:15 得分 0

markTop

14 楼631799(杭州工人)回复于 2004-12-07 20:32:44 得分 0

SQL里支持正则表达式啊.Top

15 楼t4423an(木精灵)回复于 2004-12-08 09:53:01 得分 0

你有没有想过   "几十万景点信息"   之间还有关系可以推敲?      
   
  1.分区,分段.做成查找表.这样就不用每次读那么多信息了.  
   
  2.正则表达式提供了功能强大、灵活而又高效的方法来处理文本。正则表达式的全面模式匹配表示法使您可以快速地分析大量的文本以找到特定的字符模式;提取、编辑、替换或删除文本子字符串;或将提取的字符串添加到集合以生成报告。对于处理字符串(例如   HTML   处理、日志文件分析和   HTTP   标头分析)的许多应用程序而言,正则表达式是不可缺少的工具。(引自msdn)  
  Top

16 楼Kandy(济沧海)回复于 2004-12-11 11:02:36 得分 0

1.分区,分段.做成查找表.这样就不用每次读那么多信息了.  
  假如有人发表一篇游记如下:  
  我早上吃了早饭开始爬华山,一路走来,一会就到苍龙岭……  
   
  //假如华山和苍龙岭做为景点有介绍。  
  请问你是如何知道去直接找陕西表里的景点华山?还不是要先找华山才能知道哪个省?  
  2、正则虽然功能强大,但是!即使MSDN里再怎么说在我这里没用!如果觉得能用那就把具体的用法写出来,我倒想见识一下。Top

17 楼Kandy(济沧海)回复于 2004-12-11 11:18:48 得分 0

我的命题已经说的很清楚了,  
  1、读景点,将所有的景点取出来,取出来后替换掉文章中有的对应的词。  
  2、读文章,将文章所有可能出现的词组起来,查找景点表里有这些词的景点替换掉。  
   
   
  我并不是不知道该怎么替换,而是不管哪种方法都显得太浪费资源,方法1我就不说了,方法二中我写了一段:拆词最大为4个字符。实际很多景点已经超过5个字符了,所以会更多,我就用了20多个字的一句话,各位可以运行一下那段代码看看会被拆成多少个词?就让你用任何一种语言来拆词一个2000来字的文章会被拆成多少?我问的是如何,怎么来解决,不管是算法还是建议。不要再给我提正则了,头大了。  
   
  declare   @i   int,@all   varchar(8000),@ccount   int,@j   int  
  select   @i=1  
  select   @j=1  
  select   @all='请问就这么一点点的字符能拆成多少个单词,这些单词真的有用吗?'  
  select   @ccount=4  
   
  while   @j<len(@all)-1  
  begin  
   
  select   @i=1  
   
      while   @i<@ccount+1  
        begin  
        select   substring(@all,@j,@i)  
        select   @i=@i+1  
        end  
       
   
   
  select   @j=@j+1  
   
  endTop

18 楼likaiabc()回复于 2004-12-13 18:54:52 得分 50

各位看清楼主的问题,是在数据库里解决,  
  在数据库里实现起来的确有难度  
  但不一定非要在数据里实现啊,作成静态的???  
  可以参考新浪等的新闻正文里的一些关键字  
  Top

相关问题

  • 讨论:哪一种ado.net数据库查询方式比较好,参与有分
  • 数据库基础讨论!
  • 与过江项羽探讨数据库安全问题,欢迎其他人参与讨论。
  • 服务器端是否必须安装数据库管理系统,众说不一,请各位参与讨论!
  • 数据库问题,为什么会这样?请高手进来讨论。参与有分!!!
  • 讨论:关于ASP中如何加快数据库访问速度的方法,欢迎各位积极参与
  • 关于“Oracle数据库整机移植技术”的文章,请大家看看并参与讨论。
  • 连接SQL SERVER 数据库问题汇总,望大家积极参与讨论,万分感谢!!!!
  • 数据库问题.欢迎讨论!
  • 关于数据库的讨论

关键词

  • 正则表达式
  • 字符
  • 查询
  • 文字
  • 数据库
  • 数据
  • 算法
  • 解决
  • 替换
  • 景点

得分解答快速导航

  • 帖主:Kandy
  • likaiabc

相关链接

  • SQL Server类图书

广告也精彩

反馈

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