• 搜索引擎(1)—— 概述与功能架构


    1 背景

    做搜索引擎有有2年时间了,算是有个基本的入门。决定写一个系列博客,记录下自己所认识的搜索引擎,也希望对新入行的朋友有些帮助。

    2 概述

    搜索与推荐

    互联网上有海量的信息,从互联网上获取信息或娱乐,最主要的2个途径就是搜索推荐

    • 搜索:是用户主动去查询与获取自己想要的信息,用户有明确的意图,知道自己想要什么。基本所有app的首页,都会有一个搜索框,提供搜索功能。

    • 推荐:web或app主动向用户推荐他可能感兴趣的内容,用户从被推荐的内容中,挑选自己感兴趣的内容观看,是一个偏被动的过程。新浪官网首页,淘宝首页等这些页面提供的大量信息,都是推荐,有些是非个性化的,有些是个性化的。今日头条的信息流,也是典型的个性化推荐产品。

    搜索与推荐的最大差异,就是主动被动

    搜索领域

    当前搜索推荐都涉及互联网的各个领域,可以简单的粗分成这2类

    • 综合领域:像百度、google、搜狗、360等,搜索全网内容,一般叫大搜。一般搜索的内容是互联网上的网页,多数是通过爬虫获取到,通过网页的标题和正文来搜索。
    • 垂直领域:像视频、音乐、电商、小说等,只搜索特定领域的内容,一般叫垂搜或小搜。垂域搜索的数据,往往是非常结构化的,比如淘宝里的商品,优酷里的影片信息等,与网页相比,文本偏短。

    除此之外,还有像地图、酒店、机票等各种垂直领域的搜索。每个领域都有自己的一些特殊业务诉求。

    搜索功能

    一般搜索产品都至少包括2个功能:

    • suggest(智能提示或联想):用户在搜索框输入过程中,下拉列表展现的补全结果,猜用户想搜索的内容,用户一旦点击,就可以立即发起搜索请求,减少用户输入动作,提高用户体验。
    • 搜索:用户在搜索框输入完内容,点击搜索按钮或回车,看到完整搜索结果。
    • 相关搜索(related searches):google和百度搜索结果页的底部,都有展示相关搜索,即搜索query_a的用户,也喜欢搜索query_b, query_c等。

    suggest和相关搜索技术相对简单些,可以算是搜索的一个子集,所以后面不再多介绍。

    几个基本概念

    首先介绍几个缩写基本概念:

    • 缩写

      • query:搜索关键字,也叫keyword

      • doc:被搜索的内容,比如一个网页,一部影响,一件商品,在索引里是一条记录,都叫一个doc

      • QU:query understanding,查询理解,即对query进行分析,得到一些用户意图相关的信息,辅助检索

      • index:索引

      • term:query分词后,每个词,称为一个term

    • 正排索引:以doc作为key,以这个doc包含的term或属性信息作为value,就是常规的数据库存储结构。便于通过docId,查询这个doc的属性信息。想像一下,如果要检索出所有包含“apple”的网页,需要将索引里所有doc遍历一遍。

    • 倒排索引:与正排相反,以term作为key,以包含这个term的所有doc的ID作为value,构建出的KV结构。如果要检索出包含“apple”的网页,只需要以apple作为key,一把就能取出所有包含apple这个词的网页。

    3. 流程和架构

    搜索引擎的在线检索架构如图1所示。主要包含以下几个模块:查询理解(QU),基础检索,精排(重排),摘要(高亮、飘红)。除此之外,可能还会有运营干预之类的模块。

    垂搜与大搜的架构基本一致。相比大搜,垂搜在某些模块上会简化。比如摘要,垂搜会比大搜简单很多。

    图1 搜索引擎在线检索架构
    • 倒排索引:

    下面简单介绍下每个模块的功能

    3.1 检索服务(编排)

    图1中的检索服务,实际上是个编排模块,接受端侧的搜索请求,负责整个在线检索的流程串通,本身没有实质性的功能。所以,也是其中最简单的一个模块。

    编排模型会依次调用查询理解、基础检索、精排、摘要这4个模块,每一个模块的输出,作为下一个模块的输入。

    3.2 查询理解(QU)

    QU的功能,是对用户输入的query进行分析,以支撑后续的搜索排序效果。

    QU的主要功能包括:

    • 分词:搜索|是|什么

    • 实体识别:人名、地名、影片名、机构名、歌曲名等等

    • 意图/需求识别:常见的意图类型包括:问答、新闻、软件下载、视频、小说等

    • 同义词识别:

    • 查询改写:

    • 纠错:搜索阴晴 -> 搜索引擎

    • 词权重计算:计算query分词后,每个term的权重是多少

    • 核心词选择:query分词后,哪些词是必须命中的,即核心词只要没命中这个内容就不会被搜索出来

    • 紧密度分析:query中,相邻两个词之间的紧密关系,是否需要连续命中

    QU中很多模块的效果,依赖于NLP能力,例如分词、实体识别、意图识别等。像纠错、改写等,也强依赖于用户的行为日志。

    3.3 基础检索

    基础检索(粗排)是做第一轮检索,从全量索引中召回网页候选集(例如top1000),并做一个排序。整个搜索的过程,就像是一个漏斗筛选的过程,基础检索是第一次筛选,如果没有被筛选出来,就不会成为本次的搜索结果。

    由于基础检索涉及的网页量非常大,对性能要求高,所以一般只用少量最重要的特征,相对简单的策略来做召回。不亦使用太多的特征和太复杂的模型。

    检索的过程主要分2步,

    • 根据query的核心词term,从倒排索引中取出倒排拉链。每个核心词对应一个倒排拉链,多个核心词的拉链取交,得到基础检索的一个候选集合。

    • 对候选集中的每个doc,计算它与query的匹配分数以及doc本身的质量得分,合并后得到一个总的分数并做降序排序。最终,再按一个阈值(例如1000)做截断,作为基础检索的结果。

    一个网页是否能被基础检索召回,主要取决于几个因素:1)doc是否满足term倒排求交条件;2)doc与query的相关性得分;3)doc本身的质量(静态特征,与query无关)

    3.4 精排

    精排是对基础检索召回的结果,做一个更精准的排序。由于基础检索召回的数量有限(1000条以内),相比粗排,精排需要处理的doc数量少了很多,就可以用更丰富的特征,更复杂的算法模型(LTR),以得到更精准的排序效果。

    除了使用排序模型,精排也可以使用一些人工策略来调权。

    在精排之后,也会根据运营干预的策略,对结果做进一步的调整干预。

    最终,根据翻页参数,只返回10或15条结果给上游。

    3.5 摘要

    精排返回的结果,还要补充些信息,才能在终端界面上展示。例如淘宝搜索结果,需要展示商品的图片、标题、销量等一系列信息。

    一般的垂直领域,只要把doc的几个属性展示出来即可。网页搜索比较特殊,一般网页正文很长,但是最终展示的只有简短的三两行文字片段。这个片段,就是网页的摘要信息。摘要模块的主要目标,主要就是从网页正文中,抽取出匹配最好的那一两个片段,并把与query匹配的那些词标红,让用户直观的看到这个网页与query的匹配关系。

    4 结束语

    上述是在线检索的一个基本流程,每一个模块展开,都有大量的内容。后续展开详解。

  • 相关阅读:
    iuplua test failure
    lua C++ wrapper
    lua
    Redux系列01:从一个简单例子了解action、store、reducer
    Meteor入门介绍
    Express入门介绍vs实例讲解
    React半科普文
    Express模版引擎hbs备忘
    Gulp:插件编写入门
    gulp.src()内部实现探究
  • 原文地址:https://www.cnblogs.com/grindge/p/11924843.html
Copyright © 2020-2023  润新知