做个够用的搜索,其实也很简单

(一)搜索的原理

1. 信息和信息量

在介绍搜索之前,先介绍两个概念:信息和信息量。

(采用的均是自以为比较通俗易懂的解释,如果感兴趣可以读相关书籍)

1.1 信息是减少不确定性的东西,信息也是增加确定性的东西。

前半句是香农信息定义,后半句是逆香农信息定义。举个栗子,回想下,和一个异性交往的过程。在你遇到TA之前,你不知道这个世界上有这个人的存在,后来你看到了TA的样子,后来你了解了TA的性格、口头禅,往事。然后一步一步,你对TA从丝毫不了解,到逐渐熟识。这期间就是一个你不断获取TA信息的过程,正是这些信息,让你从完全不确定TA是怎样的人,到完全确定TA很适合你。

1.2 信息量是一个信息能减少不确定性的度量,信息量也是一个信息能增加确定性的度量。

关于信息量,有很多数学的描述,但是通俗来讲,可以这么简单理解。举个栗子,证人描述嫌疑犯。A证人的信息是“他是个男人”。B证人的信息是“TA是个高中男生”,C证人的信息是“TA是个长发170左右的高中生。”D证人的信息是“我认识他,他是学校的扛把子陈浩南”。我们直觉能感受到信息量的大小关系为:A<B<C<D。显然这是正确的。

翻译为计算机可以理解的数学逻辑:当地男人的比例是50%,当地高中男生的比例为8%,当地长发170左右的高中男生的比例是4%,当地叫陈浩南的扛把子的比例是0.0001%。因为P(A)>P(B)>P(C)>P(D),所以信息量的大小关系为:A<B<C<D。

2. 搜索的产品逻辑

搜索满足了用户迅速找到自己感兴趣内容的需求。用户输入一个query,搜索系统根据用户的输入的信息,筛选出系统认为用户感兴趣的内容,同时按照系统认定的重要性进行排序展示。请注意这个表述,简单而言,搜索可以分为三步。

  • Step1:对用户输入信息的解读
  • Step2:根据用户输入信息对内容进行筛选
  • Step3:对筛选后的结果进行排序

而要了解这三步怎么在搜索系统中完成,就需要先了解搜索的服务器怎么存储信息。

3. 搜索数据的存储原理

上一张图,假设我们做了一个新闻网站,那么它的结构就是下图。内容进行了简化,假设一个新闻,文本只有标题,导语,正文。数据只有阅读量,评论数,分享数。

————————【图1-1】————————

差不多就是上图右边的这种结构。右边标识的是新闻内容的存储:就像图书馆的书一样,整整齐齐按顺序排好,方便查找(这个存储结构的名字叫做索引,就是来自于图书馆的用语)。左边是词库:只要一次搜索的输入词能匹配到词库,就可以快速的查找词库到对应的内容。

每个搜索系统都有自己的词库,无法对应到分词的搜索行为就会没有结果。每个搜索系统都会根据目标用户的不同,有对应的一套词库,就像字典一样,《冶金专业词典》和《生物学大辞典》收录的词条是不同的,知乎的词库和淘宝的词库也不同。搜索的很多优化都是集中在词库的优化上。

简单总结下,搜索的存储原理就是:一个系统词库,一个排列整齐的内容索引库,同时系统词库和内容索引库之间可以快速关联。

在这个搜索系统的储存结构的基础上,我们提到的搜索三步骤将依次展开。

4. Step1:对用户输入信息的解读

前面提到,搜索的词库是有限的,但是用户的输入却是没有限制的。那么怎么把无限制的搜索转化为有限的词库,并且匹配到对应的结果呢?这里需要介绍一个新的概念:分词,简单来说就是对输入字符串进行分拆。

同样以【图1-1】中的新闻搜索系统为例。如果用户输入的query为“中国的转基因食物”,系统中其实没有这个词。如果没有分词功能,这个搜索就会立即结束,即使系统里确实有对应的内容。分词的工作原理是在无法精确匹配的情况下,会对用户的输入进行进一步的拆分。于是我们得到了下面的结果。

“中国的转基因食物”——“中国”、“的”、“转基因”、“食物”。

并不是所有的词都有信息量,如果召回“的‘’的结果,那么几乎所有的新闻内容里面都会有这个字,召回这么多结果显然是不对的。比如这个query里的“的”,这个词实际上在分词系统中会被直接忽略掉。正是因为出现在内容中的概率不同,一个词出现的新闻越多,这个词的信息量就越小,信息量太小的词会被忽略,也就是停用词。同时包含信息量越大的词的新闻内容,会更更要。那么去掉停用词之后,结果就进一步简化。

“中国的转基因食物”——“中国”、“转基因”、“食物”。

经过处理,用户非标准的query就被转化为标准的词库,就可以快速找到对应的内容了。如【图1-1】所示。

5. Step2: 根据用户输入信息对内容进行筛选

经过对用户的query解读之后,其实就得到了一些标准化的词,而这些词就会对应一些搜索目标内容,接下来就是对于内容的筛选。

用户进行了一次搜索,一部分结果被搜索了出来。那么所有的内容根据“内容是否相关”、“内容是否被召回”两个维度,就被分为了四部分。

A:召回的相关内容:搜索出来的内容中,和用户搜索相关的部分。

B:召回的不相关内容:搜索出来的内容中,和用户搜索不相关的部分。

C:未召回的相关内容:没有搜索出来的内容中,和用户搜索相关的部分。

D:未召回的不相关内容:没有搜索出来的内容中,和用户搜索不相关的部分。

搜索一般而言,决定是否筛选出来,会从两个角度衡量,准确率,和召回率。

准确率就是所有搜到的内容里面,相关的内容的比例。准确率 

召回率就是所有应该搜到的内容里面,真正被搜出来的比例。召回率 

准确率和召回率是一对存在矛盾的指标。需要权衡。最终衡量会取两个的调和平均数作为目标函数。即F值

这三个概念在搜索优化中是关键性指标,牵扯到人工打分和更高级的优化。这里不展开更多。我们只需要记住一点:并不是所有的包含用户query关键词的结果都应该被召回。

6. Step3:对筛选后的结果进行排序

排序影响着搜索的结果质量,越往前的结果约容易获得用户的点击。好的搜索不仅仅是把应该搜索的内容尽可能的搜索出来,同时还要考虑应该把最容易吸引用户的内容展示在前面。

搜索排序比较大的基础逻辑是通用的:

用户输入一个文本转化为标准词库中的词,搜索系统根据每个具体内容是否包含这些词决定是否展示这些内容,同时搜索系统根据文本相关性给这些要展示的内容一个分数。而最终排序则根据每个内容的分数排序。

这个Lucene的的核心排序公式的原理,网上有介绍。但是实际的情况其实更为复杂。还是以我们之前提到的新闻搜索系统为例(方便理解,再贴一遍图)

如果用户搜索“转基因”,那么这个转基因的文本出现在标题中,还是出现在导语中,还是出现在正文中,体现在分数上应该是不一样的。显然出现在标题中应该有更高的分数。同样也需要考虑业务数据,比如一个阅读量10万 的帖子和一个阅读量3的帖子相比,即使阅读量低的帖子文本相关性更强,但是显然10万 的帖子应该在前面。

其实所有的数据都可以分为两类,文本和数据。文本用于计算内容的相关性,这部分的打分交给Lucene成熟的算法解决,目前市面上也都有成型的开源解决方案。而怎么处理文本之间的关系,以及数据之间的关系,才是一个搜索系统设计最核心的部分。

基于Lucene的Solr系统为例,文本和数据配置代码其实很简单。

在<str name=”bf”>和<str name=”qf”>标签中只需要几行代码就能完成。

<str name=”bf”>中是对于业务数据赋予权重。

<str name=”qf”>中是对于文本数据赋予权重。

在研究过Solr系统这个机制之后,对Solr核心公式进行变形,就得到了一个公式:

  • 代表针对文本  ,我们给出的文本分数权重。比如这个系统中有三种文本,标题,导语,正文。根据重要性,标题权重为10,导语权重为5,正文权重为1。
  •  代表针对文本 ,Lucene算法给出的文本相关性分数,这个会综合考虑文本的字数,这个搜索词在所有文本中出现的概率等等因素(想进一步了原理的同学,可以看下TF-IDF余弦相似性的介绍)。
  •  代表针对数据 ,我们给出的数据权重。比如这个系统中有三种数据,评论量,分享数,阅读量。根据重要性,标题评论数权重为100,分享数权重为200,阅读量权重为1。(一般而言会引入 时间衰减性,这里暂不讨论)
  •   代表针对数据,具体的值。比如这个系统得三种数据,评论量,分享数,阅读量。
  • 代表归一化系数,意味着权重可以给的非常大,最后总的分值也会在一个合理的范围内。
  • 是本次根据算法索引判断出的。代表本次打分,用户输入query提供信息的信息量大小。如果输入query提供了越多的信息,则S越大。
  • 增加,不变, 之前的系数不变,之前的系数增加。而代表文本数据的对整体分数的贡献,则越大,就说明文本数据相比于业务数据就占有更大的权重。比如:输入“北京国庆交通拥堵”,和输入“交通拥堵”相比,“北京国庆交通拥堵”提供给了系统更多的信息,S值更大,文本的打分在总分数汇总占比越大。

所以我们可以看到,其实最终影响排序的,是我们对于文本数据和业务数据的赋予的权重,即: 代表针对文本  的权重,和 代表针对数据的权重。

这两组数据,影响了搜索最终的排序,而这组数据的赋值,正是搜索系统的对业务的理解。

7. 小结:

本篇文章是对于搜索系统工作原理一个整体的介绍,对于原理的理解,是设计系统举重若轻的基础。

在这些基础原理之上,搜索系统还有很多标准功能。那么一个比较完备的搜索系统应该具备怎样的标准功能?这些功能又有着怎么的原理?移动时代,搜索前端设计应该如何规划?欢迎关注专栏,继续收看下期。(下期保证没有公式=。=)

 

(二)搜索功能大盘点

0.前言

搜索诞生于互联网早期时代,在漫长的迭代演化中,搜索诞生了很多业界标准功能。本篇文章会盘点搜索的标准功能,同时也会介绍这些功能背后的逻辑。

前情提要一下,上一期介绍了搜索的基本原理:

搜索有系统词库和内容索引两大部分,其中系统词库可以快速关联到内容索引中,这是搜索的基础。用户进行一次搜索查询,之后会经历三个步骤。第一步,对用户输入信息的解读:通过分词停用词等处理方法,搜索系统首先把用户的非标准的输入词关联到标准的词库。第二步,根据用户输入信息对内容进行筛选:并不是所有关联到的内容都会被筛选出来,搜索系统需要综合考虑准确率召回率,筛选出需要展示的内容。第三步,对筛选后的结果进行排序:搜索系统在考虑文本内容相关度和各个内容业务数据的表现之后,通过打分给出最终排序,呈现给用户。这个综合排序的原理,我们以基于Lucene的Solr系统进行了解释。

本期的搜索,PC端主要选取了Bing搜索作为案例,同时也兼顾了一些大用户量的移动端的产品进行了补充说明。

那么,搜索功能大盘点现在开始:

1. 自动补全

自动补全,就是用户在输入框敲字符时候,会弹出下拉列表提示候选词给用户,方便用户输入,提升用户体验。一方面帮助用户优化搜索条件,一方面也能够减少用户的输入错误。自动补全的本质是根据用户现有的输入词,去检索本地词库中的词,同时按照查询量高低进行排序。

当然,令人欣喜的是,之后也看到了一些自动补全的变种,不同的搜索根据自身业务,调整了自动补全的展示。比如下图某电商搜索,在自动补全的基础上,进一步扩展了筛选条件,减少用户操作。

2. 历史记录

使用Bing输入“知识就是力量”之后,浏览器本地会保存我的输入记录。下一次输入“”知”的时候,不同于之前,搜索系统会在自动补全的联想词之前,增加能够匹配我历史搜索的输入词。因为本质上,人在查找信息的时候,会存在多次查找相同内容的需求。历史记录也是减少用户输入成本的有效手段。

. 3.自动纠错

自动纠错,顾名思义,检测到用户输入词错误,搜索系统会自动纠正为正确的结果展示。这个是系统的容错性,减少了用户输入错误或者本身记忆错误(不知道某个字怎么写,不知道单词怎么拼)引起的问题。

内部机制为同义词的判定。词库中存储的词不是孤立的,同时也有相互之间的关联,这其中有关联词和同义词展示。词库在不断的搜索查询中,对于低搜索量高跳出的词会不断归并为高搜索量低跳出的词的关联词甚至同义词。

自动纠错也分类两种类型:一种是直接展示系统判定正确的结果。一种是展示判定正确的结果,但是顶部展示系统判定错误入口。其实第二种更好一些,可以防止系统判定错误,而不是直接剥夺用户的选择(Bing就属于第二种)。

4. 高亮显示

对于搜索结果展示时候,需要对于用户的搜索词进行高亮处理,主要是为了表明搜索的依据,减少用户选择成本。内部原理是展示输入的原始文本和分词。

移动端如果搜索主体为文本内容的话,大部分产品也是保留了这种机制。但是内容主题非文本的搜索系统(商品,图片),高亮并没有太大意义。

 

5. 联想推荐

搜索的查询一般而言是多次查询的过程,在每次的查询过程中用户会不断的缩小范围或者搜索相关内容。实现机制是query的关联性,推荐的逻辑也分为两种:一种是关联推荐 ,推荐相关的搜索词;一种是扩展推荐,因为用户搜索的不够具体,会推荐该搜索词更细的分类。(比如下图右侧的人物和事件)

在移动时代手机屏幕资源比较紧张的情况下,一般不会直接列出来联想推荐。但也有其他解决方案,比如在用户有一定浏览深度的时候进行联想推荐。淘宝在15个商品之后会有搜索词的扩展推荐,如下图所示。

7. 命中词定制

命中词定制是在结果命中一些关键词之后,展示区别于一般的搜索结果陈列,尤其是对于顶部进行一些设计。比如命中了《爵迹》的Bing,展示样式和普通网页的陈列结果不同,而是展示了电影词定制的卡片。

在移动时代这部分依旧有发挥的空间,比如去年淘宝双十一的搜索口令,或者京东在命中品牌之后的展示样式。

8. 自主排序

一般而言,对于用户给出的结果,搜索系统会给出自己的默认排序。随着用户对互联网内容的熟悉,按照一些维度进行排序也是用户的标准功能。一般而言,网站会筛选出用户最关注的信息,并提供给用户进行自助排序。

自主排序,本质上是利用了内容索引里的相关字段直接进行排序,而代替query的打分结果进行排序。

 

9. 筛选器

最开始的时候筛选器还属于比较高端的产品功能,比较适合高端用户进行二次筛选。在互联网不断普及的背景下,筛选器的使用频率不断增加,成为了标配。在系统实现上,每次查询在传给搜索系统用户query的基础上,同时也传给筛选参数,系统会在返回给用户结果前,进行内容过滤。

以京东淘宝为例,属于传统的筛选器,可以打开收起,可以进行多个选择。可以完成或者重置之前的选项。

当然也有筛选器的变种,将筛选选项展开在外面的。这样的好处一方面是方便用户点选,另一方面在选择条件过后,原有的筛选项入口可以展示用户的选择,提高系统的可感知性。

10. AB test机制

最后写也是为了强调AB test的重要性。搜索的服务本身极大依赖文本权重和业务数据权重的配置。而这些参数的配置并没有通用的法则,同时也依赖各个平台自身具体的情况,只能在了解其原理的基础上,不断迭代摸索。在算法迭代的过程中,能够测试其效果是算法迭代的核心。只有能同时在线上部署多套搜索算法,并且监控其效果,搜索系统的迭代和改进才能展开。而这一切的基础,正是一个看不见的功能:AB test机制。

小结:

本篇文章基本总结了搜索设计的一些基础产品功能。结合之前的搜索原理介绍,已经介绍了搜索的基础知识。然而再多的描述,也是为了应用在真实的产品设计之中,本文更希望是一个框架,希望能够让大家在使用搜索产品的时候,有更多的思考——能够去想一个产品可以用这个框架去做哪些改进。

作者:潘一鸣

- Posted in: Columns

- Tags: ,

0 条评论 ,2,798 次阅读

发表评论

  1. 既然来了,说些什么?

Top