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

Kandy 2004-12-03 09:50:46
命题如下:
有一表里面有几十万景点信息。例如:八仙洞,玉皇阁,香溪洞
今有一段文字如下:
--------------------------------
行程安排:
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,欢迎大家学习,毕竟,我觉得这应该是个很实用的东西。




...全文
202 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
likaiabc 2004-12-13
  • 打赏
  • 举报
回复
各位看清楼主的问题,是在数据库里解决,
在数据库里实现起来的确有难度
但不一定非要在数据里实现啊,作成静态的???
可以参考新浪等的新闻正文里的一些关键字
Kandy 2004-12-11
  • 打赏
  • 举报
回复
我的命题已经说的很清楚了,
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

end
Kandy 2004-12-11
  • 打赏
  • 举报
回复
1.分区,分段.做成查找表.这样就不用每次读那么多信息了.
假如有人发表一篇游记如下:
我早上吃了早饭开始爬华山,一路走来,一会就到苍龙岭……

//假如华山和苍龙岭做为景点有介绍。
请问你是如何知道去直接找陕西表里的景点华山?还不是要先找华山才能知道哪个省?
2、正则虽然功能强大,但是!即使MSDN里再怎么说在我这里没用!如果觉得能用那就把具体的用法写出来,我倒想见识一下。
t4423an 2004-12-08
  • 打赏
  • 举报
回复
你有没有想过 "几十万景点信息" 之间还有关系可以推敲?

1.分区,分段.做成查找表.这样就不用每次读那么多信息了.

2.正则表达式提供了功能强大、灵活而又高效的方法来处理文本。正则表达式的全面模式匹配表示法使您可以快速地分析大量的文本以找到特定的字符模式;提取、编辑、替换或删除文本子字符串;或将提取的字符串添加到集合以生成报告。对于处理字符串(例如 HTML 处理、日志文件分析和 HTTP 标头分析)的许多应用程序而言,正则表达式是不可缺少的工具。(引自msdn)
631799 2004-12-07
  • 打赏
  • 举报
回复
SQL里支持正则表达式啊.
yyyjff 2004-12-07
  • 打赏
  • 举报
回复
mark
Kandy 2004-12-05
  • 打赏
  • 举报
回复
查找表?查找什么表?请说具体点,别显得高深莫测一般,请问你的意思是把每个景点都放在一个表里,然后查找几十万个表?还是查找什么表?第二层是什么意思?正则能在第二层发挥很大作用???????


有能把命题看完整看明白再说方法的吗?
Kandy 2004-12-03
  • 打赏
  • 举报
回复
本人想了想,也可以不对表完成那么多次查询,但是仍然要对文字完成那么多次的截取,截取完毕用in或者like来组成查询,效率不知道如何,还没测试,只想找个更合适的方法。SQL 里支持正则表达式吗?混饭的不要乱说了……
Kandy 2004-12-03
  • 打赏
  • 举报
回复
倒,楼上混得连正则表达式都知道了
good2speed 2004-12-03
  • 打赏
  • 举报
回复
用正则表达式
t4423an 2004-12-03
  • 打赏
  • 举报
回复
改进数据结构设计 用查找表

正则是能在第二层发挥很大的作用.
Kandy 2004-12-03
  • 打赏
  • 举报
回复
谢谢楼主教导正则,不过作为我个人经验来看一个普通的一次替换正则的开销比REPLACE要差得多,
况且一个2000字文章包括标点拆分成所有的可能的词你知道会拆分成多少个词吗?
Kandy 2004-12-03
  • 打赏
  • 举报
回复
我故意把这个问题发到SQL-SERVER的开发论坛里,希望找个适中的解决方法,别再提ASP了好不好……
Kandy 2004-12-03
  • 打赏
  • 举报
回复
我倒,把命题看清楚啊,老大,把数据拿出来,怎么拿出来,怎么替换?加一条数据就去拿几十万条记录?如果一个5000人在线的地方大家发布的日记或者游记象你这么拿数据估计拿都拿死了
tddw 2004-12-03
  • 打赏
  • 举报
回复
另,这个把数据拿出来替换,不是一个个的查找一个个的替换的,所以,你不用担心效率,因为用正则表达式,可以不用循环,一条语句就可以把你所有要换的东西换掉。
tddw 2004-12-03
  • 打赏
  • 举报
回复
以上问题用正则表达式肯定能解决。
答:正则表达式非常有用。

你在asp里面把数据库里的数据拿出来,
然后在asp页面里对数据进行处理,用正则表达式进行替换,换好之后再放回去,就OK了。

关于正则表达式,就不多述,楼主可以找找相关资料
Kandy 2004-12-03
  • 打赏
  • 举报
回复
麻烦各位了!把命题看清楚再回答,叫着:正则表达式……很有用么?
tddw 2004-12-03
  • 打赏
  • 举报
回复
在asp页面中把数据拿出来用正则表达式完成

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧