新足迹

 找回密码
 注册

精华好帖回顾

· 你是读什么书长大的 (2007-12-20) astina · 纪念逝去十年的知己良朋。 (2013-5-17) hr6970
· 2012越南游 (2012-8-11) haining · 父女联手上菜:香辣孜然羊肋排,胡椒花生猪肚汤,芦笋木耳炒肾球+蒜香四季豆 (2008-11-3) MaxJay
Advertisement
Advertisement
查看: 3711|回复: 46

请高人指教设计思路,加分啊! [复制链接]

发表于 2013-5-14 12:03 |显示全部楼层
此文章由 gooderic1977 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 gooderic1977 所有!转贴必须注明作者、出处和本声明,并保持内容完整
需求是这样的:

数据库有个这样一个表叫“Keyword”,就一个字段用来存储关键词。

现收到一段文字,要把这段文字在keyword表里match的关键词filter出来。

举个例子:

比如keyword里存了 “buy”,"sell","price","offer"四个关键词
收到的文字:I wish to buy your house. How much would your offer? 这样的话"buy"和"offer"被filter出来。


鉴于keyword表的纪录数量不固定,收到的文字数量也不固定。怎样设计才是最高效的?

请各路高人指点思路,加分啊。


知道足迹藏龙卧虎,小弟特来求教,望各位大虾不吝赐教,拜谢了(monkey31)
Advertisement
Advertisement

发表于 2013-5-14 12:25 |显示全部楼层
此文章由 很明显 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 很明显 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这没什么可设计的啊

就一个hashmap存关键字就得了呗

收到的文字数量再不固定也得一个个扫过去
头像被屏蔽

禁止发言

发表于 2013-5-14 12:26 |显示全部楼层
此文章由 lubber 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 lubber 所有!转贴必须注明作者、出处和本声明,并保持内容完整
is it in sql server?

发表于 2013-5-14 12:36 |显示全部楼层
此文章由 gooderic1977 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 gooderic1977 所有!转贴必须注明作者、出处和本声明,并保持内容完整
很明显 发表于 2013-5-14 11:25
这没什么可设计的啊

就一个hashmap存关键字就得了呗

如果收到的message有1千个词,数据库里1万条纪录,也要逐词query吗?

发表于 2013-5-14 12:37 |显示全部楼层
此文章由 gooderic1977 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 gooderic1977 所有!转贴必须注明作者、出处和本声明,并保持内容完整
lubber 发表于 2013-5-14 11:26
is it in sql server?

对,SQL2008

发表于 2013-5-14 12:45 |显示全部楼层
此文章由 yaol 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yaol 所有!转贴必须注明作者、出处和本声明,并保持内容完整
gooderic1977 发表于 2013-5-14 11:36
如果收到的message有1千个词,数据库里1万条纪录,也要逐词query吗?

这听着像做gfw的  这量级就hashmap呗 有啥扛不住的 另外肯定得逐词query吧 keyword完全是随机出现的

如果量级后面加个万 上bloomfilter  

评分

参与人数 1积分 +3 收起 理由
gooderic1977 + 3 感谢分享

查看全部评分

Advertisement
Advertisement

发表于 2013-5-14 12:53 |显示全部楼层
此文章由 很明显 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 很明显 所有!转贴必须注明作者、出处和本声明,并保持内容完整
gooderic1977 发表于 2013-5-14 11:36
如果收到的message有1千个词,数据库里1万条纪录,也要逐词query吗?

数据库不大懂,你要嫌多,可以分组吧,10000条分成 比如A开头的记录,B开头的记录

1000个词预处理下,去掉重复的,也分A开头的,B开头的

然后再比


都比一次是必须的,算法上省不了

评分

参与人数 1积分 +2 收起 理由
gooderic1977 + 2 感谢分享

查看全部评分

头像被屏蔽

禁止发言

发表于 2013-5-14 13:03 |显示全部楼层
此文章由 lubber 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 lubber 所有!转贴必须注明作者、出处和本声明,并保持内容完整
for fast search, a fulltext search will be better?

发表于 2013-5-14 13:20 |显示全部楼层
此文章由 Fernando 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Fernando 所有!转贴必须注明作者、出处和本声明,并保持内容完整
SQL Full Text Search

发表于 2013-5-14 13:27 |显示全部楼层
此文章由 gooderic1977 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 gooderic1977 所有!转贴必须注明作者、出处和本声明,并保持内容完整
yaol 发表于 2013-5-14 11:45
这听着像做gfw的  这量级就hashmap呗 有啥扛不住的 另外肯定得逐词query吧 keyword完全是随机出现的

如 ...

你的意思吧关键词一次性全部导入hashtable,然后在内存中搜索,对吗?

发表于 2013-5-14 13:28 |显示全部楼层
此文章由 gooderic1977 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 gooderic1977 所有!转贴必须注明作者、出处和本声明,并保持内容完整
lubber 发表于 2013-5-14 12:03
for fast search, a fulltext search will be better?

关键我觉得分析一个信息要逐词query 数据库n多次,会不会太低效?
Advertisement
Advertisement

发表于 2013-5-14 13:38 |显示全部楼层
此文章由 gooderic1977 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 gooderic1977 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Fernando 发表于 2013-5-14 12:20
SQL Full Text Search

个人认为full-text index帮助不大,普通的index就可以了。我这里要求的是词汇的严格match.

发表于 2013-5-14 13:41 |显示全部楼层
此文章由 yaol 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yaol 所有!转贴必须注明作者、出处和本声明,并保持内容完整
gooderic1977 发表于 2013-5-14 12:28
关键我觉得分析一个信息要逐词query 数据库n多次,会不会太低效?

先把原型做出来 有不爽的地方再改 数据库字段加上索引 那查询起来也是嗖嗖的啊 比自己实现快 没准原型出来了公司发现能用 在量级没上去的时候 用着就行了 人力资源可以转去干别的

特殊贡献奖章

发表于 2013-5-14 13:46 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
那段文字是数据库里的,还是外部的

如果是外部的,那只能一条一条的找,没什么好办法呀
你的keywords不分类吗?

发表于 2013-5-14 13:48 |显示全部楼层
此文章由 gooderic1977 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 gooderic1977 所有!转贴必须注明作者、出处和本声明,并保持内容完整
kr2000 发表于 2013-5-14 12:46
那段文字是数据库里的,还是外部的

如果是外部的,那只能一条一条的找,没什么好办法呀

文字外部的,可以是多种来源,比如email或者sms.

发表于 2013-5-14 13:51 |显示全部楼层
此文章由 happysee 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 happysee 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如果用数据库的话,要用一个查询语句完成。否则很低效,失去用数据库的优势。
Advertisement
Advertisement

特殊贡献奖章

发表于 2013-5-14 13:51 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
gooderic1977 发表于 2013-5-14 12:48
文字外部的,可以是多种来源,比如email或者sms.

我做过一个这样的系统,把收到的email根据关键字分类
不过我的这个关键字不多,关键字是用户输入的,我是每个类的关键字存一个field,用逗号分开
一般一个类就几十个关键字,速度没什么问题

发表于 2013-5-14 13:52 |显示全部楼层
此文章由 gooderic1977 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 gooderic1977 所有!转贴必须注明作者、出处和本声明,并保持内容完整
yaol 发表于 2013-5-14 12:41
先把原型做出来 有不爽的地方再改 数据库字段加上索引 那查询起来也是嗖嗖的啊 比自己实现快 没准原型出 ...

按照客户要求,这个filter必须是相当高效的,deploy完成后,可能是很多个同时在跑,然后每秒要处理的文字在数量和大小上要求都很高。

如果逐词query数据库,担心数据库抗不住。

发表于 2013-5-14 13:55 |显示全部楼层
此文章由 gooderic1977 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 gooderic1977 所有!转贴必须注明作者、出处和本声明,并保持内容完整
happysee 发表于 2013-5-14 12:51
如果用数据库的话,要用一个查询语句完成。否则很低效,失去用数据库的优势。 ...

你的意思,把整个message交给Sproc,然后一个query就能返回matched keyword list?

这样能行??!!!!请指教啊。我加分请吃饭!!!

发表于 2013-5-14 13:57 |显示全部楼层
此文章由 空山鸟语 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 空山鸟语 所有!转贴必须注明作者、出处和本声明,并保持内容完整
gooderic1977 发表于 2013-5-14 12:28
关键我觉得分析一个信息要逐词query 数据库n多次,会不会太低效?

这种静态数据肯定是需要加载到内存里的,不用频繁读数据库。
使用文本检索是必需的。可以用Lucene对进来的消息建索引,然后用关键字查询。Lucene号称可以每小时处理150G的数据,应该是足够快了。

评分

参与人数 1积分 +2 收起 理由
gooderic1977 + 2 你太有才了

查看全部评分

发表于 2013-5-14 14:02 |显示全部楼层
此文章由 空山鸟语 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 空山鸟语 所有!转贴必须注明作者、出处和本声明,并保持内容完整
建议楼主找一下Lucene in 5 minutes,超简单的。
Advertisement
Advertisement

发表于 2013-5-14 14:04 |显示全部楼层
此文章由 鱼羊鲜 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 鱼羊鲜 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如果需要性能,那只能提前就做处理存起来,关键字表 id, keyword (1, 'java'), 文章表 id,title, keywords(22,'java in 21th', '1,3,4')

每次存文章前,先遍历关键字,然后存到keywords字段,每次增减关键字表,重新更新下所有文章的keywords字段。

发表于 2013-5-14 14:05 |显示全部楼层
此文章由 garyyang 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 garyyang 所有!转贴必须注明作者、出处和本声明,并保持内容完整
google关键字Full-text search, 如果是在文档中找 查Semantic search

script example:
SELECT candidate_name,SSN FROM candidates WHERE CONTAINS(candidate_resume,”SQL Server”) AND candidate_division =DBA
88足迹, 一个无聊多于乐趣的地方。

发表于 2013-5-14 14:05 |显示全部楼层
此文章由 gooderic1977 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 gooderic1977 所有!转贴必须注明作者、出处和本声明,并保持内容完整
空山鸟语 发表于 2013-5-14 12:57
这种静态数据肯定是需要加载到内存里的,不用频繁读数据库。
使用文本检索是必需的。可以用Lucene对进来 ...

这位大侠,假设这个keyword表在不停的变化呢?新的keyword不断加入,旧的被删除或更改?


不过我也倾向一次性load到内存后处理,好过逐词访问数据库。

发表于 2013-5-14 14:08 |显示全部楼层
此文章由 gooderic1977 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 gooderic1977 所有!转贴必须注明作者、出处和本声明,并保持内容完整
garyyang 发表于 2013-5-14 13:05
google关键字Full-text search, 如果是在文档中找 查Semantic search

script example:

如果我没理解错的话sql 的full-text search用来搜索保存在数据库的文字,而且是semantic search。我这里完全是反向啊。

发表于 2013-5-14 14:13 |显示全部楼层
此文章由 Fernando 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Fernando 所有!转贴必须注明作者、出处和本声明,并保持内容完整
gooderic1977 发表于 2013-5-14 13:05
这位大侠,假设这个keyword表在不停的变化呢?新的keyword不断加入,旧的被删除或更改?

这是rdbms 的 cache 管理,不用你来干预的,一般不会有问题
like hell
Advertisement
Advertisement

发表于 2013-5-14 14:14 |显示全部楼层
此文章由 garyyang 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 garyyang 所有!转贴必须注明作者、出处和本声明,并保持内容完整
gooderic1977 发表于 2013-5-14 13:08
如果我没理解错的话sql 的full-text search用来搜索保存在数据库的文字,而且是semantic search。我这里 ...


为什么不可以把“收到的文字” 先储存在一个temp table里面, 然后再用那行呢?
88足迹, 一个无聊多于乐趣的地方。

发表于 2013-5-14 14:14 |显示全部楼层
此文章由 LifesoCool 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 LifesoCool 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Full Text Search

发表于 2013-5-14 14:20 |显示全部楼层
此文章由 happysee 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 happysee 所有!转贴必须注明作者、出处和本声明,并保持内容完整
gooderic1977 发表于 2013-5-14 12:55
你的意思,把整个message交给Sproc,然后一个query就能返回matched keyword list?

这样能行??!!!! ...

这里讲怎么用传table parameter到stored procedure
http://www.sqlteam.com/article/s ... e-valued-parameters

如果你是computer science出身的话,不需要利用数据库,这是个很简单的算法问题。数据库会帮你做很多算法的优化,所以正确的利用数据库可以得到不错的性能。

发表于 2013-5-14 14:21 |显示全部楼层
此文章由 gooderic1977 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 gooderic1977 所有!转贴必须注明作者、出处和本声明,并保持内容完整
garyyang 发表于 2013-5-14 13:14
为什么不可以把“收到的文字” 先储存在一个temp table里面, 然后再用那行呢? ...

然后呢?keyword可能有1000个啊,文字可能也很长啊。


要得到一个matched list, 谁来search谁???我这里懵了。。。

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部