搜索与匹配规则
本文最后更新于:2022年12月20日 下午
对于搜索功能以及搜索想要的结果(匹配规则)一直都不是那么清晰,和开发交流的时候也不好讲清楚到底是怎样的需求。特此整理本篇搜索相关的笔记,供自己与读者学习。当然本篇重点在于搜索行为和用户想要的搜索结果之间的逻辑,而非界面/交互层面的元素整理。
什么是搜索
简单来说,搜索就是在一个集合里找到想要的元素。
这个集合可能是明确的,比如我桌上堆了一堆书,我知道里面有一本书 A,搜索就是在这堆「明确」的书里找到书 A。这里的「明确」可能还含有数量较少的特点,由于人类一次性能够快速处理的信息数量十分有限,数量一大这个集合本身就算能在数学上清晰定义,对于用户也是抽象的。
所以更多情况下,这个集合可能不那么「明确」。用户可能不明白这个集合里究竟有什么,也不清楚自己要找的元素究竟在不在集合里。还是拿上面书的例子,还是要找书 A,只是我不确定在不在我桌上这堆里,可能在我的书柜里,也可能带出去了(借给了别人、带到了别处),甚至可能丢了。我所知的信息仅有——我确实买过这本书,这里的集合就是我所有买过的书。
搜索的基本方法
以我浅薄的理解,搜索的最基本方法就是一个一个比对集合中的元素,是否与自己的预期一致(复杂度 O(n))。比如上面书的例子,搜索的方法就是一本一本翻过来,直至翻到自己想要的那本书。
计算机天然对搜索、比对数据具备优势。所以当搜索集合比较大的时候,计算机能够提供非常大的帮助,搜索/查找也是非常基本的算法。至于具体的算法,优化搜索的速度(二分、索引、哈希表之类的),就不具体探讨了。
搜索的使用场景
前文大都提到的是比较广泛的搜索概念与方法。在实际的应用中,搜索及相关的业务流程也涵盖诸多方面:从最基础的文字/字符串搜索,到图像、声音、视频,再到以图搜图、听音识曲等功能强大的搜索引擎。复杂一点的搜索引擎,都会有专门的团队负责。由于我没有做搜索产品的经验,也就不在这方面多讲,主要还是聊聊最基础的文字搜索与匹配规则。
所谓文字搜索的场景,指的就是用户的输入是一个「字符串」,系统返回和此「字符串」相关的内容。至于什么叫做「相关」,就由「匹配规则」来决定了。
逻辑上,相关性包含三种形式:
- 完全一致,即返回结果和用户输入完全一致。对应的使用场景是用户清楚地知道自己输入的准确性,并希望获取准确的结果,比如各类文档内的搜索定位关键字就是这种逻辑(但是从整篇文档角度却是包含逻辑)。
- 包含,即搜索结果完全包含用户输入。一般情况下,用户输入较短,而搜索集合中的多个元素都可能包含输入内容。常见的文件搜索(如 Everything)就使用了此逻辑,当然某些高级功能可能在此基础上进行拓展(比如正则表达式)。
- 语义相符,即搜索结果包含部份输入或与输入语义上相近。由于用户的输入不受限制,加上用户可能并不能清晰描述自己想要搜索的内容,以上两种逻辑可能并不满足用户的实际需求,产生大量搜索结果为空的情况。所以,此逻辑对用户输入进行分词、同义词替换(语义替换),搜索结果包含全部或部份分词、同义词内容。大多数搜索引擎都采用了此逻辑,当然搜索引擎的相关性逻辑远比这里描述得复杂多。
匹配规则
至于匹配规则,一般而言有两种:精确匹配和模糊匹配。虽然没有与三种相关性一一对应,但精确匹配包含了「完全一致」和「包含」两种逻辑,而模糊匹配则与「语义相符」对应。
精确匹配
首先来说精确匹配,「完全一致」和「包含」在算法上非常接近,都是找到一模一样的字符串。不过「完全一致」往往仅返回一个结果或者无结果(搜索集合元素重复的情况在业务上需要谨慎处理),很多情况下不会仅仅采用「完全一致」的匹配规则。而是把「包含」的结果也都列入结果中,并按照一定的规则排序。
「包含」的匹配规则可以包括向前匹配、向后匹配、前后匹配,代表补充的内容在前、在后,或是在两端。实际的业务并没有那么高的细致需求,「包含」概念已经比较符合人们的记忆习惯了,无论前后补充,有就可以了。
模糊匹配
模糊匹配就与「语义相符」的相关性一样在定义上就显得「模糊」一些,指的是输入的字符串拆分后分布在搜索结果元素中。这就涉及到输入该怎么拆分(分词,特别是中文分词),拆分后是否可以打乱分词顺序,是否可以重复分词,是否可以忽略部份分词,分词之间间隔长度等等因素。
由于涉及复杂的底层的算法,在业务上又没有那么讲究(除非专门的搜索团队,有一套完善的搜索结果评估体系),大多数是情况下提一下支持模糊匹配也就足够了。
搜索结果排序
前面提到了相关性的三种逻辑和两种匹配规则,但在实际的搜索业务中很少单独使用其中的一种,尤其是在使用模糊匹配的时候,精确匹配也同样会用上。所以对于搜索结果,除了需要对同样匹配规则下的结果进行排序,也需要对不同匹配规则下出来的结果进行排序。
不过搜索结果排序本就是搜索业务的核心之一,如果有商业目标的话还需要考虑用户体验与广告推荐/竞价的平衡,这些就不在本文讨论范围之内了。
回到常规的排序,最基本的顺序就和提出的三种相关性顺序一致:
- 完全一致。
- 包含。组内排序可以优先选择向后匹配的内容,因为人们的思维习惯就是记住一句话的前面部份。
- 语义相关。组内排序可以综合考虑结果包含分词的数量,是否在权重高的位置(标题、标签),分词间隔长度等等进行排序。
此外,同一分类下如果还有多个结果,可按照业务需求按照字母/拼音顺序、其他数值指标(相关性、评分等)进行排序,或者允许用户切换排序规则与升序/降序。
总结
再次重申,本文仅对搜索这一需求和最简单的文本匹配规则进行思考和整理,不包含任何界面相关的元素(如搜索框、按钮、输入候选提示、结果列表等),而且在匹配算法上也未进行深入探讨。
不过这些搜索概念的整理,应该已经足够应对非搜索团队内的绝大多数业务了,具体的还可以结合实际的业务给出更加具体的 PRD。
回到搜索这一需求,虽说在移动互联网大背景下,搜索已完败于智能推荐,搜索自身的算法也并没有太大的升级。用户层无太大的搜索体验升级的感知,反而是被信息爆炸影响大大增加了搜索到想要信息的难度。
最近比较火热的 ChatGPT,可能是搜索引擎发展方向之一。一来可以帮助过滤信息垃圾,使得用户更快获取搜索结果与问题答案(准确度是未来优化方向);二来自然对话的方式与上下文记忆使得用户输入与反馈都更加符合情感需求,比起知识图谱这种字典/百科式模式有更广泛的应用场景(但专业性和规范性可能有所缺失)。
无论如何,我都非常看好 ChatGPT 的发展,至少让我看到了完美解决搜索领域痛点的可能性。至于商业目标,之后再考虑吧。