如何通过拼音检索数据库

owen1759 2011-01-19 04:32:29
我看到好多网站提供通过拼音来进行全文搜索的功能,但是不知道如何实现,各位高手是如何实现的,能否指点一下?

要实现的目标:假设数据库中存在Title、Author、Content三个字段,有用户需要搜索其中任何一个字段含有“软件开发”的条目,这时要允许用户通过输入“软件开发”或“ruanjiankaifa”或“rjkf”均能得到搜索结果。

低效率的实现方法一:我看到过有个网站源码是这样做的,它通过“Select * From……”把整个表取出,然后逐条循环tmp=rs("A")&getpy(rs("A"))&rs("B")&getpy(rs("B"))&rs("C")&getpy(rs("C")),然后对比tmp里是否含有request("key"),其中getpy()是它自定义的一个很长的函数。这样的做法虽然能实现,但是效率也太低了,不仅要把整个数据库全部搬下来,还要对每个字都进行getpy()才能得到结果。

低效率的实现方法二:对数据库每个字段都增加一个对应的拼音字段,也就是数据结构变成Title、TitlePy、Author、AuthorPy、Content、ContentPy,然后修改Select语句查询它们,但是这样在每次更新数据库时都要维护一次对应的拼音字段,效率仍然低下,并且还使数据库体积成倍增大,仅仅为了一个拼音搜索功能,不值。

各位高手有什么看法呢?
...全文
1006 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
howtodown 2013-04-25
  • 打赏
  • 举报
回复
楼主,问题解决了没有?
29dh 2013-02-26
  • 打赏
  • 举报
回复
www.cnblogs.com/zenglb/archive/2010/01/01/1637526.html 看下这个。
owen1759 2013-01-22
  • 打赏
  • 举报
回复
这只是伪码,能看称呼它就是运行在后台么?再说了,运行在前台和运行在后台又有何区别,一样存在性能问题。 我再次重申——不做语义层面的分析,也就是无论它是否高频,无论它是否关键,也无论它是否是词汇,检索的唯一标准就是该记录包含与该拼音相符的字符串,不多一个不漏参阅41# 至于你最后一句话,我是否可以理解为把我说的方案二又重提了一遍。
fzfei2 2013-01-21
  • 打赏
  • 举报
回复
一般对就关键词,标签做检索 如果你要对文章内容,最好有对文章分词分析,先提取取一些高频,关键的来分析 getpy(rs("A")) 你这样写不是在后台的? 生成拼音效率还行吧,要搞效率,就生成一次后记下
owen1759 2013-01-21
  • 打赏
  • 举报
回复
引用 42 楼 fzfei2 的回复:
你去看一下JS生成拼音 做成只检索首个字母的比较简单
我这里早就有由汉字生成拼音的js,不然你认为我主帖中的getpy()函数是个什么东东? 但是请明白,我既不是需要由汉字生成拼音,也不是需要由拼音生成汉字 而是以拼音检索数据库里的汉字字符串中的匹配部分。 不信你深入的想想到底要怎样实现我说的场景,看看你说的是否能起到改进的作用?
fzfei2 2013-01-20
  • 打赏
  • 举报
回复
唉,你还没明白的我意思 比如 输入:zjl ------输出列表---------- 周杰伦 粥街囵 先把要所所有的假设是 table{ id,name},注意这不用建name对应的拼音字段 要把 table里待选的预先都搬到前台了,有点像你说的(把整个数据库搬到客户端来),后面的拼音处理检索可以由JS来搞定
owen1759 2013-01-20
  • 打赏
  • 举报
回复
你说的“字典”是什么含义?如果是对“地区”“人员”这类编制字典,对这样的场景没有任何助益,因为我不需要对拼音串进行任何语义或词汇方面的分析,需要的是机械的比对,只要符合此拼音串的任何汉字串哪怕没有任何语义都应该被检索出来。 所以如果说要字典的话,每个字段每条记录(甚至包括memo型的content)全部都要建立对应的拼音字段,这就是方法二的来历,但是显然这不是个“优雅”的方案,性能也很差。
fzfei2 2013-01-20
  • 打赏
  • 举报
回复
你去看一下JS生成拼音 做成只检索首个字母的比较简单
owen1759 2013-01-20
  • 打赏
  • 举报
回复
但是用户的输入是不确定的,数据库里的内容也是不确定的,所以根本不可能存在你说的这样的字典。 我假设content中有一句话“周杰伦到台北来开演唱会” 那么无论输入是“zhoujielun”还是“lundaotai”(伦到台)还是“beilaikaiyan”(北来开演),都要求检索到这个字段,那么,请问这怎么建立字典?可能建立字典么?
fzfei2 2013-01-19
  • 打赏
  • 举报
回复
我的意思和你说的第二差不多,所以不是所有的地方都修合适 比如,地区,人员,一些分类型字典
owen1759 2013-01-19
  • 打赏
  • 举报
回复
你说的“变化”一词不适用于此场景,这不是输入法,在输入的整个过程中是无任何交互的,所以“变化”一词没有任何意义。 比如用户输入“zhoujielun”,不是输入一个字母或者几个字母我响应一次,而是直接把这个字符串提交上去,然后,数据库里面无论是包含“周杰伦”还是包含“粥街囵”“昼姐论”统统出现在结果中,不做任何预判,不做任何语义、词汇方面的分析。 这样说能明白是什么场景么?
owen1759 2013-01-19
  • 打赏
  • 举报
回复
不明白,首先,我必须再次说明的是——没有交互,用户的整个关键字是一次性提交的,所以我完全不用考虑任何一个ajax解决方案。第二点,要做检索的数据是整个数据库,每个字段、每条记录,因为那条记录会命中,在关键字提交之前是完全未知的,难道你把整个数据库搬到客户端来么?
fzfei2 2013-01-19
  • 打赏
  • 举报
回复
引用 34 楼 owen1759 的回复:
To 32楼:你还是没有理解我的场景,从你说的“响应”二字即可看出,我反复声明一句话——“没有交互”,就是说当你输入任何字母的时候,页面上是不会有任何任何任何的提示,没有任何任何任何的选项的,你输入的是什么(拼音),传给服务器的就是什么,也不进行任何任何任何的把它反向转换成词语的尝试,而是从数据库中检索出包含任何与此拼音相符的连续汉字的记录。 To 33楼:正因为如……
第一次取数据库中,要做检索的数据,后面的检索操作就JS搞定了,输入拼音的变化不用去和数据库交互 这样说,你是不是明白
owen1759 2013-01-19
  • 打赏
  • 举报
回复
To 32楼:你还是没有理解我的场景,从你说的“响应”二字即可看出,我反复声明一句话——“没有交互”,就是说当你输入任何字母的时候,页面上是不会有任何任何任何的提示,没有任何任何任何的选项的,你输入的是什么(拼音),传给服务器的就是什么,也不进行任何任何任何的把它反向转换成词语的尝试,而是从数据库中检索出包含任何与此拼音相符的连续汉字的记录。 To 33楼:正因为如此,它并非需要任何“猜测”或者“词库”或者“智能”,它只是一种检索,只不过是一种特殊的检索,以拼音为检索条件来检索连续汉字串。若单论实现,我说的两种方法都是正确的实现,但是在性能上有缺陷。如果mysql支持,还望高手告知,无论什么数据库access、SqlServer、Mysql、SqlLite、Oracle等等任何数据库的实现都可以。
stanio 2013-01-09
  • 打赏
  • 举报
回复
如果数据库是mysql的话以前看到好像有这个功能 但是access就不行了 只能自己建一个字典 简单点的 能包含60%的可能性都足够了! 毕竟你又不是搜索引擎 更不是谷歌! 谷歌现在都研究人工智能了。
fzfei2 2013-01-08
  • 打赏
  • 举报
回复
第一次取数据库中,要做检索的数据,后面的检索操作就JS搞定了,我是说响应效果和本地操作输入法打字一样快
owen1759 2013-01-08
  • 打赏
  • 举报
回复
楼上的,你还是没明白我的意思,我不是要做个输入法,而是在没有任何交互的情况下,能搜索出任意包含拼音为该拼音的文字内容。注意,是没有任何交互
fzfei2 2013-01-07
  • 打赏
  • 举报
回复
完全可以用纯JS前台来实现,数据量不要太大,查找的算法用好点的算法(拆半法),效率是非常高 加上限制一次显示记录数不要太多,效果和打字输入联想,差不多速度
fzfei2 2013-01-07
  • 打赏
  • 举报
回复
如果字典表数据量,可以输出,id,name字段[{id:xx,name:},.....] JSON格式给前台JS来处理,JS可以处拼音, 后台也不用加拼音字段维护拼音字段了
hr_3773 2013-01-07
  • 打赏
  • 举报
回复
这个不简单么在数据库内价格字段用来存放拼音比如“裤子”就存KZ,类似的也这样存,反正这也是模糊的查询
加载更多回复(24)

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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