160602、如何快速实现高并发短文检索

一、需求缘起

某并发量很大,数据量适中的业务线需要实现一个“标题检索”的功能:

(1)并发量较大,每秒20w次

(2)数据量适中,大概200w数据

(3)是否需要分词:是

(4)数据是否实时更新:否

二、常见潜在解决方案及优劣

(1)数据库搜索法

具体方法:将标题数据存放在数据库中,使用like来检索

优点:方案简单

缺点:不能实现分词,并发量扛不住

(2)数据库全文检索法

具体方法:将标题数据存放在数据库中,建立全文索引来检索

优点:方案简单

缺点:并发量扛不住

(3)使用开源方案将索引外置

具体方法:搭建lucene,solr,ES等开源外置索引方案

优点:性能比上面两种好

缺点:并发量可能有风险,系统比较重,为一个简单的业务搭建一套这样的系统成本较高

三、58龙哥的建议

问1:龙哥,58同城第一届编程大赛的题目好像是“黄反词过滤”,你是冠军,当时是用DAT来实现的么?

龙哥:是的

画外音:什么是DAT?

普及:DAT是double array trie的缩写,是trie树的一个变体优化数据结构,它在保证trie树检索效率的前提下,能大大减少内存的使用,经常用来解决检索,信息过滤等问题。(具体大伙百度一下“DAT”)

问2:上面的业务场景可以使用DAT来实现么?

龙哥:DAT更新数据比较麻烦,不能增量

问3:那直接使用trie树可以么?

龙哥:trie树比较占内存

画外音:什么是trie树?

普及:trie树,又称单词查找树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。(来源:百度百科)


例如:上面的trie树就能够表示{and, as, at, cn, com}这样5个标题的集合。

问4:如果要支持分词,多个分词遍历trie树,还需要合并对吧?

龙哥:没错,每个分词遍历一次trie树,可以得到doc_id的list,多个分词得到的list合并,就是最终的结果。

问5:龙哥,还有什么更好,更轻量级的方案么?

龙哥:用trie树,数据会膨胀文档数*标题长度这么多,标题越长,文档数越多,内存占用越大。有个一个方案,内存量很小,和标题长度无关,非常帅气。

问6:有相关文章么,推荐一篇?

龙哥:可能网上没有,我简单说一下吧,核心思想就是“内存hash + ID list”

索引初始化步骤为:对所有标题进行分词,以词的hash为key,doc_id的集合为value

查询的步骤为:对查询词进行分词,对分词进行hash,直接查询hash表格,获取doc_id的list,然后多个词进行合并

=====例子=====

例如:

doc1 : 我爱北京

doc2 : 我爱到家

doc3 : 到家美好

先标题进行分词

doc1 : 我爱北京 -> 我,爱,北京

doc2 : 我爱到家 -> 我,爱,到家

doc3 : 到家美好 -> 到家,美好

对分词进行hash,建立hash + ID list

hash(我) -> {doc1, doc2}

hash(爱) -> {doc1, doc2}

hash(北京) -> {doc1}

hash(到家) -> {doc2, doc3}

hash(美好) -> {doc3}

这样,所有标题的初始化就完毕了,你会发现,数据量和标题的长度没有关系。

用户输入“我爱”,分词后变为{我,爱},对各个分词的hash进行内存检索

hash(我)->{doc1, doc2}

hash(爱)->{doc1, doc2}

然后进行合并,得到最后的查找结果是doc1+doc2。

=====例子END=====

问7:这个方法有什么优点呢?

龙哥:存内存操作,能满足很大的并发,时延也很低,占用内存也不大,实现非常简单快速

问8:有什么不足呢?和传统搜索有什么区别咧?

龙哥:这是一个快速过度方案,因为索引本身没有落地,还是需要在数据库中存储固化的标题数据,如果不做高可用,数据恢复起来会比较慢。当然做高可用也是很容易的,建立两份一样的hash索引即可。另外,没有做水平切分,但数据量非常非常非常大时,还是要做水平切分改进的。

时间: 2024-10-07 05:53:01

160602、如何快速实现高并发短文检索的相关文章

PHP项目:如何用PHP高并发检索数据库?

对于抢票.秒杀这种业务,我说说自己对这种高并发的理解吧,这里提出个人认为比较可行的几个方案: 方案一:使用队列来实现可以基于例如MemcacheQ等这样的消息队列,具体的实现方案这么表述吧比如有100张票可供用户抢,那么就可以把这100张票放到缓存中,读写时不要加锁. 当并发量大的时候,可能有500人左右抢票成功,这样对于500后面的请求可以直接转到活动结束的静态页面.进去的500个人中有400个人是不可能获得商品的.所以可以根据进入队列的先后顺序只能前100个人购买成功.后面400个人就直接转

构建高并发高可用的电商平台架构实践

从各个角度总结了电商平台中的架构实践,由于时间仓促,定了个初稿,待补充完善,欢迎大家一起交流. 转载请声明出处:http://blog.csdn.net/yangbutao/article/details/12242441 作者:杨步涛 关注分布式架构.大数据.搜索.开源技术 QQ:306591368 技术Blog:http://blog.csdn.net/yangbutao 一. 设计理念 1.      空间换时间 1)      多级缓存,静态化 客户端页面缓存(http header中包

高并发电子商务平台技术架构

原文出自:http://blog.csdn.net/yangbutao/article/details/12242441 http://stamen.iteye.com/blog/1525924 我自己的大型B2B和B2C站点原来也是用Hibernate,可是后来不得不换成mybatis, 第一是用Hibernate 因为它封装得太高了.非常多东西是隐式进行的.常常引起问题,非常难定位.毕竟凡事有利必有弊: 第二大型站点肯定不是一个数据库.这点Hibernate是非常麻烦的,用Jdbc或Myba

构建高并发高可用的电商平台架构实践(上)

构建高并发高可用的电商平台架构实践(上) 一. 设计理念 1.      空间换时间 1)      多级缓存,静态化 客户端页面缓存(http header中包含Expires/Cache of Control,last modified(304,server不返回body,客户端可以继续用cache,减少流量),ETag) 反向代理缓存 应用端的缓存(memcache) 内存数据库 Buffer.cache机制(数据库,中间件等) 2)      索引 哈希.B树.倒排.bitmap 哈希索

大数据量高并发的数据库优化

一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. 在一个系统分析.设计阶段,因为数据量较小,负荷较低.我们往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性能则要花费更多的人力物力,而整个系统也不可避免的形成了一个打补丁工程. 所以在考虑整个系统的流程的时候,我们必须

构建高并发高可用的架构

从各个角度总结了电商平台中的架构实践,由于时间仓促,定了个初稿,待补充完善,欢迎大家一起交流. 转载请声明出处:http://blog.csdn.net/yangbutao/article/details/12242441 作者:杨步涛 关注分布式架构.大数据.搜索.开源技术 QQ:306591368 技术Blog:http://blog.csdn.net/yangbutao 一. 设计理念 1.      空间换时间 1)      多级缓存,静态化 客户端页面缓存(http header中包

每天近百亿条用户数据,携程大数据高并发应用架构涅槃

互联网二次革命的移动互联网时代,如何吸引用户.留住用户并深入挖掘用户价值,在激烈的竞争中脱颖而出,是各大电商的重要课题.通过各类大数据对用户进行研究,以数据驱动产品是解决这个课题的主要手段,携程的大数据团队也由此应运而生;经过几年的努力,大数据的相关技术为业务带来了惊人的提升与帮助. 以基础大数据的用户意图服务为例,通过将广告和栏位的"千人一面"变为"千人千面",在提升用户便捷性,可用性,降低费力度的同时,其转化率也得到了数倍的提升,体现了大数据服务的真正价值. 在

高并发系统设计与时间和空间的平衡

高可用上文我们已经讲过了,可当前互联网时代,怎么少的了高并发呢?高并发和高可用一样, 已经变成各个系统的标配了,如果你的系统QPS没有个大几千上万,都不好意思跟人打招呼,虽然可能每天的调用量不超过100. 高并发这个词,我个人感觉是从电商领域开始往外流传的,特别是电商领域双11那种藐视全球的流量,再把技术架构出来分享一把,现在搞得全互联网都在说高并发,而且你注意回忆一下所有你看到的高并发系统,往往都逃不开一个核心概念,那就是缓存+哈希,一切都是以这个概念和基础的,仿佛这就是高并发的核心技术了.

构建高并发高可用的电商平台架构实践 转自网络

从各个角度总结了电商平台中的架构实践,由于时间仓促,定了个初稿,待补充完善,欢迎大家一起交流. 转载请声明出处: 作者:杨步涛 关注分布式架构.大数据.搜索.开源技术 QQ:306591368 技术Blog:http://blog.csdn.net/yangbutao 一. 设计理念 1.      空间换时间 1)      多级缓存,静态化 客户端页面缓存(http header中包含Expires/Cache of Control,last modified(304,server不返回bo