大概搜索引擎的原理都了解过,自己也写过小型化的玩具搜索。
有几个问题一直没法了解,搜索也不知道关键词 /搜不到结果,还请大家赐教(暂时拿百度举例子)
①关于新词搜索,热门词会提前做缓存结果我了解,但是比如一个很少有人搜的词汇,百度难道是在请求时遍历自己的整个抓取库吗?比如我现在搜索一个『 JEHWUWB 』这是一个从来没有出现过的乱码词汇,难道会在请求时对整个百度的抓取库进行搜索吗?感觉百度抓取的数据应该量也不小于 1T 吧,怎么响应大量的新词搜索呢?
②关于蜘蛛抓取量,百度之类是会抓历史页面的,比如一个网页 1 天更新一次,对于百度搜索引擎内部的数据库存,会每一次抓取都会留档吗?这样的话,是不是要远大于源站原页面(几十倍)的空间来储存呢?
③关于权重,每个搜索结果都有数万个站点,对于不同结果不同的站点权重还是不一样的(比如搜血管的时候,医学网站的权重肯定要比新浪高,搜其他的时候可能反过来)这种权重表对于新词搜索的时候,是重新维护一次吗?如何去确认一个新词的时候,下面结果列表的排序呢
1
jetyang 2019-01-24 10:31:15 +08:00 1
1. 搜索引擎里网站是有等级的,不同页面也是分级的,类似 pagerank,网页会按优先级分进高优先级库和全集库(剩下的网页),高优先级库通常占比非常小,一个 query 发过去,先在高优先级网页库里检索,如果结果不够再去全集里补全。
2. 应该是要存储的,压缩。 3. 不管什么 query,先按步骤 1 拿出初步结果,取前 n 个( n 在 1000 左右),在这 n 个里做 rerank,这时可以考虑如你说的 query 和 每个网页的关系,还可以考虑用户以往的搜索历史和点击记录,这时的结果集很小,可以做一些精细化性能消耗大的排序工作。 网页搜索是一个非常复杂的系统工程,要考虑的东西还有很多。。。 声明:本人从未在百度、搜狗、360、搜搜工作过 |
2
annoy1309 OP @jetyang 比如像我刚刚的那个自建词汇,绝大多数可能在高优先库内是没有的,那如何在可接受响应时间内做一个全量搜索呢?
在我对谷歌的测试中,能够搜到和我测试乱码词汇完全匹配的网页结果,延时也几乎没有区别,那是怎么做到在那么短的时间内对全量库进行检索呢?而且同时有大量请求。我觉得也不经济呢。 |
3
annoy1309 OP 拿最理想化来说,全量库 100G+,就算全在内存中,搜索需要的 cpu 时间数我觉得也是不经济的🐸我不知道我哪里的判断出了问题
|
4
jetyang 2019-01-24 11:37:02 +08:00
@annoy1309 倒排索引里,每个 term 都对应着 docid 链表,term 的查询是用 hash 的,不管冷门词还是热门词查询都是 O(1) 的,如果那个词非常生僻,它对应的 docid 链表是很短的,返回很快不是很正常吗?
反而,如果 query 分拆出多个热门 term,对多个长 docid 链表做交集、并集耗时会更长 |
5
yuikns 2019-01-24 11:41:02 +08:00
|
6
Cheez 2019-01-24 13:17:47 +08:00
我感觉不需要全量吧 ,只需要取 10 个结果
|
7
LukeChien 2019-01-24 16:07:16 +08:00 via Android
用倒排索引做粗召回,百度可能召回 750 个,搜狗可能是 1000 个。然后对这些候选项做精排序,主要参考候选项本身的质量度和与查询词的匹配度,再加上各种人工干预算法。
|