一、小程序搜索背景
前端:微信官方提供SearchBar插件,主要功能为搜索框的前端实现后端:实现简单的搜索分小程序搜索和云开发两部分。
小程序搜索包含以下三个接口,无商品、文本搜索相关能力:
search.imageSearch:提供基于小程序的站内搜商品图片搜索能力search.siteSearch:提供针对页面的查询能力search.submitPages:提交小程序页面URL及参数信息,让微信可以更及时的收录到小程序的页面信息
云开发
开发者们可以使用云开发技术开发微信小程序、小游戏,无需搭建服务器,即可使用云端能力。云开发为开发者提供完整的原生云端支持和微信服务支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开发,即可实现快速上线和迭代,同时这一能力,同开发者已经使用的云服务相互兼容,并不互斥。提供云函数、云数据库、存储、云调用能力。其中搜索主要依赖云数据库实现。搜索相关能力主要是可开发基于正则的模糊匹配,支持基础聚合能力、GEO搜索能力、多字段模糊搜索最佳实践,但是搜索性能和搜索效果都有限,不支持分词、查询分析(QP)等能力。
二、问题与需求
电商、内容行业对于查询意图理解有一定依赖的场景,使用小程序原生搜索服务功能较为基础,不足以支撑业务需求,用户搜索体验较差,则直接影响业务的转化。
三、电商搜索场景分析
搜索框输入效率低;
需求提升购买转化率;
关键词堆砌;
例如:搜索“帮宝适男童大码拉拉裤包邮” 分词后:帮宝适、男童、大码、拉拉裤、包邮; 一个query包含好几个搜索关键词**,这些关键词的重要性也是分:高、中、低
词序对语义的影响不大;
类目预测问题;
例如:当用户查询“苹果”时,可能查询的是水果,也可能是手机品牌。
四、内容搜索场景分析
口语化描述的长尾词出现频率相对较高,关键词和内容多样性丰富、搜索用词规范程度参差不齐
聚合多个频道的内容
要求搜索引擎具备较强的语义理解能力
一部分场景垂直性专业性较强
例如:a. 搜索“有哪些适合男生看的科幻小说推荐”,Query涉及的关键词很多,聚合多个频道的内容,词序对语义影响不大b. 搜索“3岁以下宝宝咳痰怎么治疗”,专业性较强对搜索结果相关性要求更加精准
五、开放搜索解决方案
搭建需求 | 开放搜索 |
环境搭建 | 购买应用即可开始接入配置 |
数据接入 | 支持RDS、ODPS、POLARDB、API/SDK等多种数据接入方式 |
分词 | 内置阿里巴巴NLP分词,支持通用行业分词、电商行业分词、IT行业分词、中英文分词器等,查全率和查准率更高 |
查询语义理解 | - 拼写纠错——纠正错误查询词;- 同义词——对中英文/近义词进行同义扩展;- 词权重——查询中每一个词在文本中的重要程度,并将其量化成权重;- 实体识别——电商行业中主要识别品牌、品类、款式、风格等实体类型,提高召回率和准确性, |
排序 | - 类目预测——根据查询词预测用户想要查询哪个类目的结果,结合排序表达式,使得更符合搜索意图的结果排序更靠前。- 两轮相关性排序——第一轮为粗排,从命中的文档集合里海选出相关文档。第二轮为精排,对粗排的结果做更精细筛选- 人气模型——量化出每个商品的静态质量及受欢迎的程度的值,不断训练统计形成人气分,构建更精细化的排序模型,精准命中搜索需求 |
下拉提示 | 在用户输入查询词的过程中,智能推荐候选query,帮助用户尽快找到想要的内容 |
热词底纹 | - 热词——在搜索框下,根据搜索热度,获取最热的10条搜索词组/话题- 底纹——在用户不输入搜索词时,直接显示在搜索框的优质query |
算法功能 | 内置已成熟的多种高级算法功能 |
弹性扩展 | 简单操作,平滑扩缩容,即时生效 |
运维成本 | 0运维,免部署 |
开发部署成本 | 开箱即用,1位工程师0.5-1天即可完成基础服务搭建 |
六、小程序接入开放搜索仅需2步
6.1数据接入
数据源接入:首先数据源接入是直接在阿里云购买rds(或者polardb等),接入开放搜索。小程序和开放搜索的对接,仅仅需要查询的API接口或者sdk.
API/SDK接入:小程序的接入跟app或者Web的产品形态没有什么区别,只是微信小程序有自己的一套代码规范,但还是使用开放搜索的sdk/API来获取开放搜索的结果。
6.2搜索服务接入
通过在小程序JS里调用外部接口,获取搜索结果
普遍通过ES、Solr、第三方云服务等方式进行接入
示例如下:
wx.request({ url: '', data: {SercherValue:that.data.inputValue, SercherTypeNum:that.data.SercherTypeNum, typeItem:that.data.typeItem }, header: {}, method: '', dataType: '', success: function(res) {}, fail: function(res) {}, complete: function(res) {}, })