Q1:不到1秒的时间怎么在网上检索到那么多的东东?1
Q2:什么是倒排索引?2
Q3:像mp3、image这种非文本对象怎么建立倒排索引?2
Q4:为什么要进行切词?怎么进行切词?2
Q5:ns的检索系统是怎么实现Q1中所说的检索过程的?2
Q6:前端检索服务程序之间是怎么分工合作的?3
Q7:as、bs、di的检索架构有什么好处?3
Q8:建索引模块如何获取上游模块数据?5
Q9:大规模的数据如何高效的建立倒排索引?5
Q10:对实时更新的数据如何快速的建立倒排索引?5
Q11:如何为标题检索、站点搜索这样一些特殊的检索考虑倒排索引?5
Q12:bs如何高效的处理索引拉链?6
Q13:相关性需要考虑哪些因素?6
Q14:实时信息的检索是如何实现的?6
Q15:什么是offset索引,有什么用?6
Q16:有哪些用于提高性能的索引技术?7
Q17:对于可修改的信息如何建立实时索引?7
Q1:不到1秒的时间怎么在网上检索到那么多的东东?
A:检索所需的信息,需要完成收集信息、分析信息和查询信息三个工作,我们的检索系统也不例外。
收集信息的全部工作和分析信息的绝大部分工作已经被检索系统预先做好了,我们平时的检索主要进行的是最后一步工作,速度自然很快。这是目前百度所采用的搜索引擎模型,也被人称为全文搜索引擎(FullText Search Engine)。
Q2:什么是倒排索引?
A:顾名思义,倒排就是将对象到描述的这种“正排”关系“倒”过来成为描述到对象的“倒排”关系,这样利用这种关系我们就可以通过描述信息检索到对象了,倒排索引就记录了这种关系。例如,网页1、网页2的描述信息如下:
网页1:中国人民的大学
网页2:中国人民大学
对描述信息进行切词:
网页1:中国人民的大学
网页2:中国人民大学
可以得到描述信息到两个网页对象的倒排关系:
中国à1,2
人民à1,2
的à1
大学à1,2
倒排关系的记录方式,即倒排索引,随应用环境的不同而各异。一般在建立倒排关系的过程中,为了方便动态追加,在内存中采用链式结构;存储到硬盘上时,为了高效读取,采用顺序存储。习惯上把倒排索引数据称之为倒排拉链或索引拉链。
Q3:像mp3、image这种非文本对象怎么建立倒排索引?
A:目前ns的产品线检索系统都是基于文本的,还没有基于内容的系统。Mp3、image这种非文本对象,在网页解析时,需要根据html页面的tag等解析与对象相关的文本(歌曲名、图像周围文字等),解析出文本之后,建立倒排索引的过程与文本对象一致。
Q4:为什么要进行切词?怎么进行切词?
A:中文词汇之间没有天然的分隔符,如果按照单字建立倒排索引,将会带来两方面的问题:(1)单字的平均索引拉链过长,每次查询需要进行合并的拉链数过多;(2)tf-idf、人名书名识别等与相关性有关的因素难以考虑。目前ns都是调用nlp组提供的切词接口。需要注意的是,后端建倒排索引时的切词要求保证召回率(recall),前端查询时的切词要求保证准确率(precise),因此需要对切词结果按不同策略进行处理或者调用不同的切词接口。通常把切词接口给出的一个基本单元叫做一个term。
Q5:ns的检索系统是怎么实现Q1中所说的检索过程的?
A:目前ns的检索系统架构上大同小异,如下图1所示,大体上分两大类程序来实现检索:
图1中的各个程序名称在具体应用中会有变化。
Q6:前端检索服务程序之间是怎么分工合作的?
A:图1中各前端检索服务程序的功能如下:
根据上述各个服务程序的功能,很清楚一个典型检索的流程为:用户检索请求à apacheà uià asà bsà asà dià asà uià apacheà检索结果。
关于apache和ui请参考相关的FAQ。
Q7:as、bs、di的检索架构有什么好处?
A:这种架构有如下一些优点:
Q8:建索引模块如何获取上游模块数据?
A:从获取数据的主动性角度,分为两种:
Q9:大规模的数据如何高效的建立倒排索引?
A:要做到这一点,需要考虑两个方面的因素:
Q10:对实时更新的数据如何快速的建立倒排索引?
A:对该问题,目前ns通用内存索引机制进行解决。该方案的核心思想就是,处理时时数据的建索引模块只负责少量数据,保证建索引过程能够在内存中完成而不需要到硬盘存取中间数据,这样就能快速的处理时时数据,并且根据时效性要求,将内存中的索引数据定期存到硬盘,以供相应的bs模块查询。一但数据量超过内存空间限制,则将相应数据合并到历史数据中并清空占用的内存。具体可参看实时数据处理FAQ
Q11:如何为标题检索、站点搜索这样一些特殊的检索考虑倒排索引?
A:把标题中的term、站点域名等这些特殊的词按照特殊的格式建到索引中,在检索的时候还按照这种特殊格式去检索,就能够完成检索。例如标题检索,某篇文章标题中有“百度”,建立倒排时,对来源于标题的term“百度”增加前缀“T_”,即对term“T_百度”建立倒排索引,检索时,如果查询标题中含有“百度”的文章,检索程序(一般是bs)会根据要求自动将检索term修改为“T_百度”,如此则可查到想要的结果。
但是这种解决方案取决于索引拉链的长度。比如想按图片类型进行检索,则term“jpg”的索引拉链会超长,即不适合通过在term前加前缀的方法来实现。类似这种情况可以将具体信息记录在brief表或直接记录在索引中。
Q12:bs如何高效的处理索引拉链?
A:在ns组的实践中,有一些经验能够保证这一点:
Q13:相关性需要考虑哪些因素?
A:只能具体应用具体分析,针对ns的产品,可以考虑如下一些角度:
Q14:实时信息的检索是如何实现的?
A:对于动态数据类检索(比如tieba,zhidao),用户实时提交的信息需要能够及时的检索到,这通常是通过使用两种类型的索引库来实现的:
Q15:什么是offset索引,有什么用?
A:offset索引就是在索引单元中记录了term在文本中出现位置信息的索引。某些term会大量在文本中出现,所以通常会控制记录的位置数(比如只记录出现的前16个位置),以控制索引数据的大小。
offset索引在长文本检索系统(比如zhidao)中对于调权的意义很重大,通过offset信息可以发现匹配“最好”的结果。比如query为“计算数学”,分为两个term:“计算”和“数学”,对于通常的索引,没有term在文本中的位置信息,因此不能知道这两个term在该文本中是否连在一起。通过offset索引则可以算出来。
Q16:有哪些用于提高性能的索引技术?
A:当一个检索系统的数据规模变大以后,利用普通索引来检索会导致性能下降。主要是由于索引拉链数据过长,导致IO负荷过大。为了提高检索效率,通常可以有如下的一些索引组织方式:
Q17:对于可修改的信息如何建立实时索引?
A:在某些类型的动态数据检索系统中,需要提供某个文档可修改的功能。如果对实时性要求很低,可以采用定期重建索引库的方法。但如果实时性要求较高,就必须采用其他方式。处理上的难点在于如何及时将文档中原来存在,修改以后不存在的term的对应的索引作废,使得检索该term不再能够取到该文档。
通常可以采用的方法有:
可修改内容的索引具体处理方式比较复杂,要了解详情可以咨询本FAQ作者。