如果老板扔一个需求:做个搜索的功能。作为一名产品经理,千万不要只画一个搜索框、一个“搜索”按钮,然后交给开发:一周内把这个功能做出来! 一头雾水的程序猿问:搜索的结果该怎么呈现?结果该怎么排序? 作为功能的设计者,如果你没深入的思考搜索功能的产品逻辑,被鄙视、被喷、被嘲讽在所难免!
那搜索功能的原理是怎样的呢?
对用户来说,在什么情况下需要搜索呢?根据实际使用场景,无非两种:1.用户明确知道自己要什么内容,直奔主题快速搜索自己想要的内容;2.不清楚或者大致知道自己想要什么内容,通过搜索筛选出自己目标内容。不管何种场景,搜索满足了用户快速寻找自己感兴趣内容的需求。用户输入一个query,一般系统会做出如下的处理流程:
第一步:系统对用户输入的信息进行解读
第二步:根据用户输入信息对内容进行筛选
第三步:对筛选的结果进行排序
这是三个步骤是搜索机制的核心,可以通过服务端和系统的角度对搜索的原理进行解读。我们先看一下数据的存储逻辑:以一个电商平台的搜索功能举例来说,平台内会有多种分类或品牌,如下:
数据库的存储结构就是类似于这个样子的,左边就是所谓的“词库”:只要一次搜索的输入词能匹配到词库,就可以快速的查找词库到对应的内容;右边就是具体的内容索引库。这种搜索模式就像图书馆的索引结构,一步一步的引导,找出用户想要的内容。所以用一句话归纳:一个系统词库,一个内容索引库,而且词库和索引库是相互关联的。
根据这个原理,我们对上面的搜索核心步骤一步步进行解读。
第一步:系统对用户输入的信息进行解读
通过词库找与之对应的内容,再把内容呈现给用户,这当然是一个比较理想的状态。但现实问题来了,我们系统不可能限制用户的输入行为,而我们系统的词库是有限的。比如,用户输入“我的滑板鞋子”,系统里不可能有这个词,直接的结果就是搜索结束,用户搜不到自己想要的结果。对于这种特殊情况,怎么才能展现结果呢?那就是分词! 何为分词,就是把用户输入的关键词(字符串)进行拆分,比如用户输入的“我的天啊鞋子”可以进行如下拆分:“我的” “滑板鞋”,经过这样的处理,用户非标准的query就变成了标准的词库,可以进行下一步的流程处理了。
第二步:根据用户输入信息对内容进行筛选
对用户的query进行解读之后,会得到一些标准化的词,这些词会对应一些内容,接下来就是对内容进行筛选了,对内容的筛选会涉及到两个概念:召回率和准确率,看如下矩阵:
准确率指的是搜到内容中相关内容的比例;召回率指的是搜索到内容中,真正被搜索出来的比例。这两个指标的比例越靠近1,效果越好,但是有些情况下,准确率和召回率是一组相互矛盾的指标,比如我们只搜索出一个搜索结果,且是正确的,那准确率就达到了100%,但是召回率却很低。这两个概念在搜索优化中是关键性指标,涉及到更高级的搜索机制,这里不做深入探讨。这里需提醒一点,不是所有包含用户query关键词的结果都应该被召回。
第三步:对搜索的结果进行排序
其实搜索的逻辑应该是通用的:用户输入一个文本(字符串),该文本会转化为标准词库中的词,搜索系统根据每个具体内容是否包含这些词来决定是否展示这些内容,同时搜索系统根据文本的相关性给这些展示的内容一个分数,分数的高低决定的排序的先后。
因此,对搜索结果进行排序十分关键,排序位置的高低决定了点击率、转化率等一系列关键性运营指标,很显然排序越靠前的结果更容易获得用户的点击。好的搜索不仅仅是把应该搜索的内容尽可能的搜索出来,同时还要考虑应该把容易吸引用户的内容展示在前面。但是如何对筛选出来的内容进行排序呢?这里涉及到了较复杂的算法规则。
下面这个Lucene的核心排序公式的原理,有专业文章详细介绍:
当然还有很多这种公式的变形式,所有的变形式都基于这个准则:赋予每个因子不同的权重,所赋予权重的值直接影响排序的先后。如搜索出来的商品,价格、销量等元素都可作为排序的因子,如果把“销量”这个因子赋予较高的权重,那么销量较大的商品搜索出来会靠前。当然,对某个因子赋权的大小视业务的需求而定。
搜索的原理基本是这样的,其中涉及到的一些复杂算法不在此篇文章的探讨范围之内,也无法进行深度探讨。了解了搜索的原理,下次我们设计搜索系统、碰到搜索相关的功能时,脑子里就会有一个清晰的逻辑。原理了解了,那设计搜索功能还会遇到一些搜索的交互以及界面细节问题,下回找时间写一篇文章介绍如何对搜索功能进行界面设计以及用户体验提升的细节。