微信,微博,知乎综合搜索的功能是如何实现的

lianw
  • 37

如题微信,微博利用关键词就能在用户,公众号,专栏等不同内容中查询数据,分页数据,我一开始想可能是将数据都放在一个表里吧,但是用户表肯定是独立的,那么多表联合查询数据量不是非常大而且慢吗,还有联合数据的分页,那这个功能是如何实现的?

回复
阅读 2.4k
5 个回答
ponponon
  • 1.3k
✓ 已被采纳

首先呢,这个功能叫做搜索,一定要形成一个思维定势:但凡是搜索就和数据库没有关系

搜索是怎么实现的?答案就是:Elasticsearch

那具体怎么操作,要不就一股脑丢到一个 index,或者一个 type 对应一个 index。搜索的时候搜索一下,在聚合结果,按照 score 降序排一下就好了。

至于分页,99.99999999% 的用户只会划到第一页。

要分页也很简单—— 搜索的时候搜索一下,在聚合结果,按照 score 降序排一下就好了。不够再聚合,直到凑够。

Hotlink
  • 327

几位回答ES都对,我补充一下,你的思路和一开始做搜索的人思路是一样的,用户输入的是关键词,但关键词散落在无数的文档里(不管是用户信息,文章信息,微博信息),遍历每篇文档匹配关键词太慢了。
因此设计出了:倒排索引
ES背后正是使用了倒排索引,在存储文档时会把所有词切割出来,然后另外维护一张索引表,里面写上了某个关键词出现在了哪些文档里。进一步地,还会对每个词做TF-IDF统计。这个有兴趣可以了解一下。
当用户搜索的时候,同样会把用户输入的语句做切割,根据切割出的关键词从倒排索引里找到文档,接着通过TF-IDF,PageRank等等算法给出文档的排序,并分页展示给用户。

Elasticsearch 了解一下

然后去远足
  • 33.3k

确实是 ES 没错,再补充一点,这种大流量的互联网产品肯定不是 ES 直接裸上的,前面还有 Flink + Kafka 一类的中间件和各种缓存一类的在支持,纯靠 ES 扛不住的。

比如微信初期在 ES 架构的基础上后又陆续引入了 Ceph、Chubby、HBase(当然了,都是内部魔改版)等等。

如果题主只是想要个全文索引,那 ES 对小项目来说确实足够了。

tiyee
  • 1.8k

看了一圈,没一个靠谱的答案!不是飚名词,就是背八股文。

elasticsearch不只是搜索,它是索引+文档存储。

实际上,对于数据量很大的系统来说,搜索引擎只存了索引,是不包含完整的document的,
搜出来的是目标文档的id和分类标识(有可能这个id本事就包含了来源标识)。
然后通过id或分类标识去其他地方把相关数据查出来,
然后人工排序,format,输出。
对于小公司,因为数据不大也不够复杂,es全套解决了。

ps:微博和微信不是es,实际上,es性能不够高,而且很资源,对于超大数据并不合适。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏