小程序场景

一、小程序搜索背景

前端:微信官方提供SearchBar插件,主要功能为搜索框的前端实现后端:实现简单的搜索分小程序搜索云开发两部分

  • 小程序搜索包含以下三个接口,无商品、文本搜索相关能力:

search.imageSearch:提供基于小程序的站内搜商品图片搜索能力search.siteSearch:提供针对页面的查询能力search.submitPages:提交小程序页面URL及参数信息,让微信可以更及时的收录到小程序的页面信息

  • 云开发

开发者们可以使用云开发技术开发微信小程序、小游戏,无需搭建服务器,即可使用云端能力。云开发为开发者提供完整的原生云端支持和微信服务支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开发,即可实现快速上线和迭代,同时这一能力,同开发者已经使用的云服务相互兼容,并不互斥。提供云函数、云数据库、存储、云调用能力。其中搜索主要依赖云数据库实现。搜索相关能力主要是可开发基于正则的模糊匹配,支持基础聚合能力GEO搜索能力多字段模糊搜索最佳实践但是搜索性能和搜索效果都有限,不支持分词、查询分析(QP)等能力

二、问题与需求

电商、内容行业对于查询意图理解有一定依赖的场景,使用小程序原生搜索服务功能较为基础,不足以支撑业务需求,用户搜索体验较差,则直接影响业务的转化。

三、电商搜索场景分析

  • 搜索框输入效率低;

  • 需求提升购买转化率;

  • 关键词堆砌;

例如:搜索“帮宝适男童大码拉拉裤包邮” 分词后:帮宝适、男童、大码、拉拉裤、包邮; 一个query包含好几个搜索关键词**,这些关键词的重要性也是分:高、中、低

  • 词序对语义的影响不大

  • 类目预测问题;

    例如:当用户查询“苹果”时,可能查询的是水果,也可能是手机品牌。

四、内容搜索场景分析

  • 口语化描述的长尾词出现频率相对较高,关键词和内容多样性丰富、搜索用词规范程度参差不齐

  • 聚合多个频道的内容

  • 要求搜索引擎具备较强的语义理解能力

  • 一部分场景垂直性专业性较强

    例如:a. 搜索“有哪些适合男生看的科幻小说推荐”,Query涉及的关键词很多,聚合多个频道的内容,词序对语义影响不大b. 搜索“3岁以下宝宝咳痰怎么治疗”,专业性较强对搜索结果相关性要求更加精准

五、开放搜索解决方案

tu

搭建需求

开放搜索

环境搭建

购买应用即可开始接入配置

数据接入

支持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) {},
       })