请问各位IT大哥一个分词实现的问题!!做了这么久还没有用过,说来惭愧。

黑子大哥 2017-09-15 03:20:55
关于分词,比如我们搜索一个词语 “雷军是做手机的” 我们想要的效果是 将其分成 雷军 做手机 手机,这样吧词分出来,
然而问题来了,我们查询数据库的时候,如果要查询标题还好,如果还有内容检索呢?如果是文章表,就算我们吧表分表,一张表1W条数据,模糊(like %%)查询检索起来也会很慢很慢。

接触了一下分词组件,进行分词了,但是怎么检索呢?各位怎么实现的?


初步想的办法,在录入数据的时候讲每个标题内容进行分词,分词之后将数据对应的ID存储起来比如
key= 雷军;bindid=1
key= 做手机;bindid=1
key= 手机;bindid=1

在搜索的时候,我先查询 雷军 这个词,然后检索出对应的ID,然后在数据库搜索文章表对应的ID

感觉不是太好,那样ID会很多很多很多

请问各位大神怎么操作的!

...全文
600 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
丰云 2017-09-18
  • 打赏
  • 举报
回复
引用 7 楼 qhttl 的回复:
[quote=引用 4 楼 foren_whb 的回复:] 总之,现在都是写好的,不需要自己写,只要会用就行了
也就意味着下次我查询手机,先通过分词查询手机对应的绑定ID 是11,在通过11这个ID去数据库查询?是这样吗? 我有一个问题,如果文章特别托,手机是个热门词,可能关联的数据有上百万条数据,刚刚我查询的条件(比如时间,点赞,评论条数等还有一些条件)进行赛选,对应的ID有上百万条,那么这个sql就特长了 in(11,12,13,14,15,16,17)很多 主要是你说的 “”然后根据用词库匹配转换成序列码,存入索引表“” 这句话没有特别的明白,求指教,谢谢![/quote] 部分理解是对的,但有几个关键点还是理解错了 不要妄自推测,直接百度一下全文检索框架、工具及原理,然后好好读一读,不是那么难理解的。 我推荐你看看solr这个集成的框架及原理解释
闭包客 2017-09-15
  • 打赏
  • 举报
回复
数据结构是程序最重要的部分,如果使用 SQL,表设计就是最重要的工作,没有那么简单的。
闭包客 2017-09-15
  • 打赏
  • 举报
回复
引用 11 楼 qhttl 的回复:
[quote=引用 10 楼 closurer 的回复:] 查找靠的是索引,你的方法是轮询+缓存。
当然查询的时候也是有索引的,如果表数据上千万查询,索引我感觉也搞不到事的,还是慢 慢 慢!!! 比如 我们有5个以上的筛选条件,而且索引也会很大,插入很慢[/quote] 倒排索引表是不会有五个查询条件的。 你要看看你的索引是否命中,以及索引的效率。
黑子大哥 2017-09-15
  • 打赏
  • 举报
回复
引用 9 楼 liujian098 的回复:
你完全是理解误区 你后面所说的检索 都不需要你去操作
不需要我操作?什么意思呢?请问有demo么?能否指教一下,谢谢你了
黑子大哥 2017-09-15
  • 打赏
  • 举报
回复
引用 10 楼 closurer 的回复:
查找靠的是索引,你的方法是轮询+缓存。
当然查询的时候也是有索引的,如果表数据上千万查询,索引我感觉也搞不到事的,还是慢 慢 慢!!! 比如 我们有5个以上的筛选条件,而且索引也会很大,插入很慢
闭包客 2017-09-15
  • 打赏
  • 举报
回复
引用 8 楼 qhttl 的回复:
[quote=引用 6 楼 closurer 的回复:] 提醒你一下,在一台物理机上做分库分表是没有任何作用的。我知道【分库分表】很流行,其实这是荒谬的做法。
我是这样想的,比如一个文章表,一张秒存储10万条数据, 查询本来是按照分页来查询的,根据分页的的信息去查询最新的表,表中满足就返回,不满足就在查第二张表,同时将查询到第几张表信息和查询条件保存下来,第二页的时候就可以直接查询当前用户条件下对应的表,这样每张表的匹配数据就少了很多很多,个人理解哈。请指教 如果部分表,一张表有几千万条的时候,多条件匹配的情况会特别特别的慢,那么你是怎么解决的呢?[/quote] 查找靠的是索引,你的方法是轮询+缓存。
liujian098 2017-09-15
  • 打赏
  • 举报
回复
你完全是理解误区 你后面所说的检索 都不需要你去操作
黑子大哥 2017-09-15
  • 打赏
  • 举报
回复
引用 6 楼 closurer 的回复:
提醒你一下,在一台物理机上做分库分表是没有任何作用的。我知道【分库分表】很流行,其实这是荒谬的做法。
我是这样想的,比如一个文章表,一张秒存储10万条数据, 查询本来是按照分页来查询的,根据分页的的信息去查询最新的表,表中满足就返回,不满足就在查第二张表,同时将查询到第几张表信息和查询条件保存下来,第二页的时候就可以直接查询当前用户条件下对应的表,这样每张表的匹配数据就少了很多很多,个人理解哈。请指教 如果部分表,一张表有几千万条的时候,多条件匹配的情况会特别特别的慢,那么你是怎么解决的呢?
黑子大哥 2017-09-15
  • 打赏
  • 举报
回复
引用 4 楼 foren_whb 的回复:
想多了。。。。 分词是建立在词库的基础上的, 现在网上有很多分词工具,根本不需要自己写 其次,lz你把分词跟全文检索这两个概念搞混淆了!!!! 分词是分词,检索是检索!!! 分词用分词器就行了,检索就需要一套框架来实现,这就是lucene。 当然,通常的全文检索框架,都自带了一个简单的分词器。 基本原理是这样的,数据库插入一篇文章时,先通过分词器把文章分解成连续的单词,然后根据用词库匹配转换成序列码,存入索引表 全文检索时,通过索引表匹配得到文章地址和热度相关的数据 总之,现在都是写好的,不需要自己写,只要会用就行了
基本上明白了,和我说的差不多吗?我之前想的是将数据存入库中 按照你说的,是不是应该这样操作呢,比如我录入一条新闻, 雷军是做手机的,存入库得到此信息的编号是11 然后我讲分词信息,雷军,做手机,手机 这几个分词都存入索引,每个分词绑定一个ID是11, 也就意味着下次我查询手机,先通过分词查询手机对应的绑定ID 是11,在通过11这个ID去数据库查询?是这样吗? 我有一个问题,如果文章特别托,手机是个热门词,可能关联的数据有上百万条数据,刚刚我查询的条件(比如时间,点赞,评论条数等还有一些条件)进行赛选,对应的ID有上百万条,那么这个sql就特长了 in(11,12,13,14,15,16,17)很多 主要是你说的 “”然后根据用词库匹配转换成序列码,存入索引表“” 这句话没有特别的明白,求指教,谢谢!
闭包客 2017-09-15
  • 打赏
  • 举报
回复
提醒你一下,在一台物理机上做分库分表是没有任何作用的。我知道【分库分表】很流行,其实这是荒谬的做法。
闭包客 2017-09-15
  • 打赏
  • 举报
回复
这个从词找文章的索引,一般叫【倒排索引】(Inverted index),也有译成【反向索引】的。 这个索引注定是十分巨大的。搜索引擎一般都是自己做的数据库,lucene.net 也是。我认为用 SQL 也未尝不可,我就在做这样的尝试。
丰云 2017-09-15
  • 打赏
  • 举报
回复
想多了。。。。 分词是建立在词库的基础上的, 现在网上有很多分词工具,根本不需要自己写 其次,lz你把分词跟全文检索这两个概念搞混淆了!!!! 分词是分词,检索是检索!!! 分词用分词器就行了,检索就需要一套框架来实现,这就是lucene。 当然,通常的全文检索框架,都自带了一个简单的分词器。 基本原理是这样的,数据库插入一篇文章时,先通过分词器把文章分解成连续的单词,然后根据用词库匹配转换成序列码,存入索引表 全文检索时,通过索引表匹配得到文章地址和热度相关的数据 总之,现在都是写好的,不需要自己写,只要会用就行了
liujian098 2017-09-15
  • 打赏
  • 举报
回复
引用 2 楼 qhttl 的回复:
[quote=引用 1 楼 liujian098 的回复:] .net 里面 我们用lucene.net实现建立索引和分词效果
我看了下 lucene工具,它建立索引也不是建立在库上的,你们的实现方法是怎么样的?能说说吗? 是将词语和对应的文章数据编号存储在索引里面,进行ID检索吗?[/quote] 本来就不是建立在库上的啊 只是为了加快搜索速度啊 你先学习 lucene.net 就明白了啊 这个简单
黑子大哥 2017-09-15
  • 打赏
  • 举报
回复
引用 1 楼 liujian098 的回复:
.net 里面 我们用lucene.net实现建立索引和分词效果
我看了下 lucene工具,它建立索引也不是建立在库上的,你们的实现方法是怎么样的?能说说吗? 是将词语和对应的文章数据编号存储在索引里面,进行ID检索吗?
liujian098 2017-09-15
  • 打赏
  • 举报
回复
引用 楼主 qhttl 的回复:
关于分词,比如我们搜索一个词语 “雷军是做手机的” 我们想要的效果是 将其分成 雷军 做手机 手机,这样吧词分出来, 然而问题来了,我们查询数据库的时候,如果要查询标题还好,如果还有内容检索呢?如果是文章表,就算我们吧表分表,一张表1W条数据,模糊(like %%)查询检索起来也会很慢很慢。 接触了一下分词组件,进行分词了,但是怎么检索呢?各位怎么实现的? 初步想的办法,在录入数据的时候讲每个标题内容进行分词,分词之后将数据对应的ID存储起来比如 key= 雷军;bindid=1 key= 做手机;bindid=1 key= 手机;bindid=1 在搜索的时候,我先查询 雷军 这个词,然后检索出对应的ID,然后在数据库搜索文章表对应的ID 感觉不是太好,那样ID会很多很多很多 请问各位大神怎么操作的!
.net 里面 我们用lucene.net实现建立索引和分词效果

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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