全部产品
云市场

基于OpenSearch实现电商场景商品搜索原型

更新时间:2018-12-21 09:45:18

本文将介绍如何使用阿里云OpenSearch基于电商场景构建出一个简单的商品搜索原型,从而满足业务对商品搜索的需求。
在构建类似电商平台建设中,有一块重要的业务要求是可通过关键字搜索的方式对商品信息中不同属性进行搜索,同时可对搜索出的商品列表进行分类的过滤,采用阿里云OpenSearch产品实现一个商品搜索的原型,能很好的满足项目的需求。

环境准备

第一次开通阿里云账号并登录控制台时,会提示先创建access key才能继续使用。

  • 创建及使用应用依赖access key参数,主账号下access key参数不能为空。
  • 在为主账号创建access key参数后,还可以再创建RAM子账号access key通过RAM子账号进行访问,RAM子账号赋予对应访问权限,请参考授权访问鉴权规则

基本架构

整个原型的系统架构如下:系统架构

创建应用

  1. 登录阿里云OpenSearch控制台,单击右上角的创建应用应用列表
  2. 选择应用类型
    本文基于电商场景下,涉及多表关系映射,所以选择支持简单多表join逻辑的高级版应用类型。关于应用类型的详细介绍请参考OpeanSearch应用类型说明应用类型
  3. 填写基本信息基本信息
  4. 选择初始化方式

    • 手动创建应用结构:可以自定义应用结构进行应用创建。
    • 通过模板创建应用结构:系统默认提供了几种常用的模板样式,用户也可以将自己定义的应用结构创建成模板,可以通过已有模板快速创建出一个新的应用。
    • 上传文档生成应用结构:您可以上传已有的数据文件(仅支持JSON格式),系统会自动解析并创建出初始的应用结构(注意字段类型等需要重新定义)
    • 通过数据源创建应用结构:适用于通过RDS、ODPS等数据源同步的场景,可以快速由源表结构创建出初始的应用结构,节省手动构造的工作量,降低出错概率。这里以RDS为例,其他数据源操作类似,具体详见数据源配置

    使用阿里云开放存储服务ODPS、RDS可以在OpenSearch控制台直接配置使用相应的数据源,数据将自动同步进入OpenSearch,简单、方便、可靠。本文将以RDS为例,选择通过数据源创建应用结构。

  5. 连接数据库
    填写数据库配置,具体参见下图:连接数据库

  6. 选择数据源选择数据源

  7. 定义应用结构
    我们采用商品表为主表,商品类别表为辅表的方式创建了应用结构即商品类别表主键id关联商品表外键category_id。 原型所用的结构如下图:定义应用结构
  8. 定义索引结构
    将商品表、商品类别表中需要搜索的相关字段添加到索引列表“default”中,这样就能通过query:”搜索关键字”,对商品进行搜索操作了。具体配置见下图:定义索引结构

    注意:分词方式直接影响搜索结果,请谨慎选择,关于分词方式的选择具体请参考分词类型

  9. 配置数据源
    在这里,您可以选择是否开启数据自动同步功能。 开启后,数据更新将自动同步至OpenSearch。
  10. 确认明细,创建成功
  11. 激活应用
    选择自己需要的数据容量,注意,这里要按照配额进行计费,请按需使用,后续有需要再调整。另外,OpenSearch还提供了小额一定时间的免费测试档,可以用来做前期测试使用。

数据上传

上面我们是以RDS为例,激活应用后会默认开始导入全量数据,可以在应用列表中看到具体进度。当然也可以调用OpenSearch API或者SDK来手动上传数据。应用列表

测试

数据上传成功后就开始搜索体验了,OpenSearch控制台内置了OpenSearch搜索可以通过API/SDK或者页面搜索测试页面进行查询(详见APISDK说明),本文以系统中搜索测试页面为例,搜索语法请参考API开发者手册搜索接口搜索子句介绍。搜索结果如下图所示:搜索结果
您还可以利用OpenSearch各种自定义的功能,来获得更优的搜索体验。例如解决目前用户长尾query召回少、搜索词填写错误无法召回、输入拼音无法召回等问题,具体请参考查询分析相关性实战

  • 这里我们以拼写检查为例配置一个查询分析
    1. 创建查询分析干预词典
      1. 依次单击控制台主页干预功能查询分析干预词典进入查询分析干预词典页面。
      2. 单击右上角创建词典,词典类型选择拼写检查,输入词典名称单击创建创建词典
      3. 在词典列表中刚刚创建的词典后单击管理进入干预词典页面。
      4. 单击新增干预词条配置您的干预词条。干预词条
      5. 单击提交,添加成功。您可以在干预词条列表中看到您创建的干预词条。干预词条列表
    2. 在应用管理页面左侧导航栏中依次单击查询意图理解查询分析进入查询分析页面。
    3. 单击右上角添加规则添加一个未上线规则,干预词典选择我们刚刚创建的test1。查询分析规则配置
      • 停用词:根据系统内置的停用词典过滤查询中无意义的词(一般是使用频度过高的但不影响查询结果的词,比如标点符号、语气助词等)。例如:查询词“奔跑吧!兄弟”,经过停用词处理后标点符号“!”不参与召回。
      • 拼写检查 :检查用户查询串中的拼写错误,并给出纠错建议。对于确定的拼写错误将直接改写原始查询串,然后进行检索;对于可能的拼写错误将仍然使用原始查询串进行检索。例如:查询词“阿里爸爸”,经过拼写纠错会改写为“阿里巴巴”,然后进行检索。
      • 词权重 :分析查询中每个词的重要程度,并将其量化成权重,权重较低的词可能不会参与召回。例如:查询词“开放搜索好不好”,经过词权重处理,只要包含“开放搜索”的文档都可以召回。
      • 同义词:根据系统提供的通用同义词库和语义模型,对查询串进行同义词扩展,以便扩大召回。例如:查询原词为”KFC”,经过同义词处理后,包含”肯德基”或者”KFC”的文档都会被召回(配合词权重功能使用效果更佳)。
    4. 单击修改可修改适用范围(目前仅TEXT类型的索引字段可以配置该功能)。规则创建完毕后,可以通过查询中显式的指定qp=test1的方式进行搜索效果调试。调试无误后,可以单击添加至上线上线该规则。使用查询分析规则后搜索的结果如下图所示:使用规则搜索结果
  • 配置排序表达式
    排序表达式允许用户为应用自定义搜索结果排序方式,通过在查询请求中指定表达式来对结果排序,具体请参考搜索相关性配置
    1. 依次单击应用主页高级配置搜索结果排序进入搜索结果排序管理页面。搜索结果排序管理页
    2. 单击右上角的修改表达式
      • 添加新粗排表达式或编辑现有表达式
        添加粗排
        粗排对性能影响较大,尽量选用最有代表性的字段。这里我们以配置文本分、文档新旧程度的算分配置为例。
      • 添加新精排表达式或编辑现有表达式
        添加精排
        这里我们以配置商品名相关性,商品类别名相关性为例。
    3. 单击保存完成配置。搜索结果如下图所示:排序表达式搜索结果
      单击查看排序分可查看条目排序分值,粗排计算结果和精排计算结果。查看排序分
  • 下拉提示
    电商场景中,为了减少用户输入,帮助用户尽快找到想要的内容,我们可以使用开放搜索的下拉提示功能。关于下拉提示功能的配置请参考下拉提示
  • 类目预测
    您也可以使用类目预测功能预测用户想要查询那个类目的结果,具体步骤请参考类目预测

  • 电商场景中,如果某个商家的多个商品的文档分值都比较高,则都排在了搜索结果的前面。这样既不利于结果展示,也不利于用户体验。我们可以采用多样性聚合distinct子句来提升结果的多样性。具体用法请参考聚合distinct子句

  • 业务上还支持按价格区间进行结果的查看,需要采用filter子句,更多用法请参考过滤filter子句。我们以价格字段进行过滤为例,操作相关代码如下:
  1. if(!lowPrice.equals("")){
  2. queryElement.addFilter("price>=" + lowPrice);
  3. }
  4. if(!highPrice.equals("")){
  5. queryElement.addFilter("price<=" + highPrice);
  6. }

总结

至此一个简单的基于阿里云OpenSearch构建的电商场景下的搜索原型已经构建完成。OpenSearch提供了比较完善的搜索服务和API接口,能够基于OpenSearch快速实现业务对于搜索的需求,大大减少了开发工作,提高了搜索功能开发的实现效率,同时也减少了搭建复杂搜索引擎平台带来的系统部署和运维的工作量和成本。用户可以根据业务场景的不同选择OpeanSearch各种自定义配置和功能,从而获得更优的搜索体验。