实现本身的搜索引擎(一)

搜索引擎的原理其实很简单,写出来没两页纸,可是实现中的各类细节写成的论文能够堆满两个图书馆。算法

让咱们先从原理提及。api

首先须要用输入数据建立索引,对于互联网搜索引擎,输入数据是一个个由爬虫从网上抓回来的网页,通过清洗以后进行内容抽取,而后整理成统一的格式交给索引程序建立索引。
索引由如下几个基本的组成部分:
1. 倒排索引,这一部分存放"关键字"->文档的映射,通常来讲会把同一个关键字对应的全部文档按照统一方法整理成一个排好序的线性结构,以便遍历和各类AND/OR之类的操做。
2. 正排索引,这一部分存放每一个文档的各类属性
索引程序要干的事就是从源数据中拿出每一个关键字和各类属性,整理成索引文件。文本变成关键字的过程叫作关键字提取,对于英语等语言,这个过程相对容易,通常就是进行大小写、全角/半角转换,拼写检查,字根提取等工做,例如源文本中的“goes”,“going”,“went”统一转换为“go”等;对于中文来讲这个过程会比较麻烦,须要进行分词,经常使用的分词方法有单字切分、正/反向最大匹配、n元分词、隐马模型等。没有那一种单一的方法能知足全部需求,因此实际应用中通常会将多种方法结合使用。数据结构

索引建立好以后就能够搜索了,一个典型的搜索过程有这几个步骤:
1. 倒排索引的查询,通常称为“全文检索”,根据输入的关键字序列T1,T2..Tn,在倒排索引中找到对应的文档链,根据查询需求进行AND或者OR的组合,获得一个知足条件的结果集,对于典型的全文搜索引擎,这个阶段还须要计算每一个文档的文本相关性以便排序,经常使用的文本相关性算法有TF-IDFBM25VSMLM等。
2. 正排索引过滤,在获得知足全文检索的文档集后,对每一个文档检查其属性是否知足过滤条件,若是不知足则丢弃,剩下的就是最终的结果集。
3. 排序,全文搜索引擎通常的作法是:基于倒排索引查询获得的文本相关性,结合正排索引中的各类属性进行加权,例如给较新的文档加分等,最终获得一个分值,而后对结果集进行排序,保留前若干个结果返回给用户。网站

以上的过程就是全文搜索引擎的大体工做过程,其中复杂之处在于如何评估输入的查询条件和文档之间的匹配程度,文本相关性只能知足一部分需求,还须要其它一些因素来对文档得分进行调整,例如Google的PageRank就是经过进出的连接对文档重要性进行评估的一种方法。搜索引擎

垂直搜索引擎的基本工做原理和上述的同样,可是侧重点不一样,通常来讲垂直网站更重视文本以外的各类属性,例如电商网站会很关注商品的库存量和售价,若是排序结果将无库存或者过于昂贵的商品放在最前面会严重影响销售量;本地搜索网站会很关注POI和用户之间的距离,若是将一家距离用户很远的商户排在结果的前面一样也会形成很很差的体验。google

另外还有一个很重要的问题就是索引的更新,对于互联网搜索引擎来讲,通常会采用按期重建的策略,例如google就是每一个几个小时将一个索引块整个重建,可是这种策略对于电商网站显然不行,例如在淘宝上能够进行拍卖,用户出价会致使拍卖价格迅速变化,须要在很短期内迅速将这个价格的变化反映到搜索结果中,这就须要一些专门设计的索引结构来支持。spa

下一节咱们将看看搜索引擎中的一些基本数据结构设计