电商行业

更新时间:
复制 MD 格式

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

环境准备

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

  • 创建及使用应用依赖access key参数,主账号下access key参数不能为空。

  • 在为主账号创建access key参数后,还可以再创建RAM子账号access key通过RAM子账号进行访问,RAM子账号赋予对应访问权限,请参考授权访问鉴权规则

基本架构

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

创建应用

1.登录阿里云OpenSearch控制台,在左侧导航栏单击实例管理,在实例管理页面单击左上角创建实例

在页面左上角选择产品版本为OpenSearch-行业算法版,并在顶部导航栏选择目标地域。

2.选择应用类型。

本文基于电商场景下,涉及多表关系映射,所以选择支持简单多表join逻辑的高级版应用类型。关于应用类型的详细介绍请参考OpeanSearch应用类型说明

3.填写应用信息。

本教程中各项参数选择:

  • 商品版本选择行业算法版

  • 商品类型选择按量付费

  • 地域和可用区选择华东1(杭州)

  • 行业类型选择电商行业

  • 集群偏好选择独享集群-通用型

选择商品类型:目前系统支持预付费和后付费,具体区别可参考:计费方式与价格选择地域和可用区域:目前OpenSearch支持的可用区域有

  • 中国区域:华南1、华北1、华北2、华北3、华东1、华东2、中国香港

  • 亚太区域:新加坡

  • 欧洲与美洲区域:德国(法兰克福)、美国(弗吉尼亚)

应用名:应用名由以英文字母开头的数字、英文字母或下划线组成,长度不超过 30 个字符 ;注意:应用名称创建后无法修改!应用类型:高级版、标准版。购买规格:目前OpenSearch支持的有共享通用、共享计算、共享存储、独享通用、独享计算、独享存储,详情可参考:计费方式与价格存储容量和计算资源:按实际而定,计算资源估算方法:LCU个数=QPS*单次查询消耗的LCU。其中单次查询消耗的LCU可以先购买一个入共享通用型应用后,在搜索测试功能中进行测试查看单次查询消耗的LCU。

4.配置应用。

  • 手动创建应用结构:可以自定义应用结构进行应用创建。

  • 通过模板创建应用结构:系统默认提供了几种常用的模板样式,用户也可以将自己定义的应用结构创建成模板,可以通过已有模板快速创建出一个新的应用。

  • 上传文档生成应用结构:您可以上传已有的数据文件(仅支持JSON格式),系统会自动解析并创建出初始的应用结构(注意字段类型等需要重新定义)

  • 通过数据源创建应用结构:适用于通过RDS、MaxCompute(原ODPS)、PolarDB等数据源同步的场景,可以快速由源表结构创建出初始的应用结构,节省手动构造的工作量,降低出错概率。这里以RDS为例,其他数据源操作类似,具体详见数据源配置

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

5.连接数据源

填写数据库配置:在弹出的连接数据库对话框中,填写RDS实例ID数据库名用户名密码,然后单击连接

6.选择数据源。

选择数据源弹窗中,选择RDS页签,选择数据库opensearch(已连接实例 rm-bp1pgu04tn0ia280e),在选择数据表区域将product_1price_detail_1添加至已选择列表,单击确定

7.定义应用结构

我们采用商品表为主表,商品价格表为辅表的方式创建了应用结构即商品价格表主键pid关联商品表外键id。

定义应用结构时,主表product_1包含以下 15 个字段:

  • category_name(类目名称,TEXT)

  • image_url(LITERAL_ARRAY)

  • description(商品描述,TEXT)

  • brand_name(品牌名称,TEXT)

  • thumbnail_url(LITERAL_ARRAY)

  • title(商品标题,TEXT)

  • is_onsale(INT)

  • url(LITERAL)

  • brand_id(LITERAL)

  • series_id(LITERAL)

  • sold_num(商品销量,INT)

  • category_id(INT)

  • onsale_time(上架时间,INT)

  • price(DOUBLE)

  • series_name(TEXT)

每个字段可配置主键、字段标签、类型及外表连接。

辅表price_detail_1(数据源opensearch:price_detail_1)定义了 4 个字段:

  • discount_price,类型 DOUBLE

  • pid,类型 INT,设为主键

  • sale_price,类型 DOUBLE

  • act_price,类型 DOUBLE

8.定义索引结构

将商品表、商品价格表中需要搜索的相关字段添加到索引列表“default”中,这样就能通过query=default:“关键字”,对商品进行搜索操作了。

选择行业为电商,模板为通用。索引字段列表包含以下索引配置:

  • default(默认索引):包含字段category_namedescriptionbrand_nametitlecreate_byupdate_by,分析方式为行业-电商通用分析

  • category_name(类目名称索引):分析方式为行业-电商通用分析

  • category_id:分析方式为关键字

  • series_name:分析方式为中文-通用分析

  • brand_name:分析方式为中文-通用分析

  • id:分析方式为关键字

  • title(标题索引):分析方式为行业-电商通用分析

  • seller_id:分析方式为关键字

  • brand_id:分析方式为关键字

  • series_id:分析方式为关键字

说明

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

9.配置数据源

在这里,您可以选择是否开启数据自动同步功能。 开启后,数据更新将自动同步至OpenSearch。在数据源配置页面,product_1price_detail_1两张表均已关联同一 RDS 实例,数据自动同步开关已开启。

10.配置完成后,单击“完成”,此时在应用详情页中就可以看到,应用的状态处于“应用初始化中.”。

上传数据

上面我们是以RDS为例,索引构建中会默认开始导入全量数据,可以在应用详情页中看到具体进度。当然也可以调用OpenSearch API或者SDK来手动上传数据。

测试

数据上传成功后就开始搜索体验了,OpenSearch控制台内置了OpenSearch搜索可以通过API/SDK或者搜索测试页面进行查询(详见APISDK说明),本文以系统中搜索测试页面为例,搜索语法请参考API开发者手册搜索接口query子句介绍。在搜索测试页面,选择应用test_han_indexes(线下应用),在查询栏输入query=title:'裙子',子句 config 设为start:0,即可查看搜索结果。

您还可以利用OpenSearch各种自定义的功能,来获得更优的搜索体验。例如解决目前用户长尾query召回少、搜索词填写错误无法召回、输入拼音无法召回等问题,具体请参考查询分析相关性实战

配置一个查询分析:这里我们以拼写纠错为例配置一个查询分析。

第一步:创建查询分析干预词典: 1.1 依次单击控制台主页功能 搜索算法中心--召回配置--词典管理 进入查询分析干预词典页面。

1.2 单击右上角“创建”,在创建查询分析词典对话框中设置名称dic_error词典类型选择拼写纠错,然后单击“保存”。1.3 在词典列表中刚刚创建的词典后单击词条管理进入干预词典页面。进入词条管理页面后,可查看词典基本信息(名称、词典类型、创建时间、词条数),并通过新增干预词条批量添加词条按钮添加词条。词条列表包含 Query、纠正词、干预类型、修改时间、生效状态等列。

1.4 单击新增干预词条配置您的干预词条,在新增干预词条弹窗中填写以下信息:

  • Query:输入待纠正的搜索词,例如连衣群

  • 纠正词:输入正确的词,例如连衣裙

  • 干预类型:选择添加屏蔽

1.5 单击保存,添加成功。您可以在干预词条列表中看到您创建的干预词条,例如将错误 Query连衣群纠正为连衣裙,干预类型为“添加”,生效状态为“已生效”。干预词典管理页面顶部有新增干预词条批量添加词条按钮,支持通过输入Query搜索框筛选词条。

第二步:开放搜索控制台左侧导航栏中依次单击召回配置查询分析配置进入查询分析页面。第三步:单击创建添加一个未上线规则,干预词典选择我们刚刚创建的dic_error。在添加规则对话框中,目标应用显示为test_han_indexes(线上应用),填写规则名称为test_error(由数字、英文字母或下划线组成,小写字母开头,长度不超过 16 位)。索引范围选择title,行业类型选择电商。在功能选择区域勾选拼写纠错,词典使用勾选系统内置词典,干预词典选择dic_error,单击确定完成规则创建。

  • 停用词:根据系统内置的停用词典过滤查询中无意义的词(一般是使用频度过高的但不影响查询结果的词,比如标点符号、语气助词等)。例如:查询词“奔跑吧!兄弟”,经过停用词处理后标点符号“!”不参与召回。

  • 拼写纠错 :检查用户查询串中的拼写错误,并给出纠错建议。对于确定的拼写错误将直接改写原始查询串,然后进行检索;对于可能的拼写错误将仍然使用原始查询串进行检索。例如:查询词“阿里爸爸”,经过拼写纠错会改写为“阿里巴巴”,然后进行检索。

  • 词权重 :分析查询中每个词的重要程度,并将其量化成权重,权重较低的词可能不会参与召回。例如:查询词“开放搜索好不好”,经过词权重处理,只要包含“开放搜索”的文档都可以召回。

  • 同义词:根据系统提供的通用同义词库和语义模型,对查询串进行同义词扩展,以便扩大召回。例如:查询原词为”KFC”,经过同义词处理后,包含”肯德基”或者”KFC”的文档都会被召回(配合词权重功能使用效果更佳)。

  • 实体识别:命名实体识别(Named Entity Recognition,简称NER)是系统对Query分词后将每个语义实体进行需求识别的功能。每个语义实体会被打上相应的类型标签,类型标签重要性低的语义实体在查询中可能会被省略;类型标签重要性高的语义实体会直接影响类目预测模型的训练。比如“耐克修身连衣裙”,实体识别的结果为“耐克/品牌/中”“修身/款式元素/低”“连衣裙/品类/高”。

第四步:创建之后,可在查询分析界面,单击“搜索测试”进行效果验证。创建完成后,查询分析配置列表中显示该规则:查询分析名称为test_error,类型为自定义,目标索引为title,行业选择电商,包含功能为拼写纠错,操作列可进行搜索测试配置删除。在搜索测试页面,选择对应索引,设置参数qp=test_error,输入查询title:'连衣群'(故意输入错别字),单击搜索。系统提示“以下是查询 连衣裙 的结果,仍然搜: 连衣群”,实际查询词被自动纠正为(title:"连衣裙"),并返回匹配“连衣裙”的商品结果。

第五步:调试无误后,可返回查询分析界面,在切换到“索引视角”后,将其设置为默认查询分析。设置完成后,查询分析配置列表中显示新增规则:索引名称为title,查询分析名称为[默认]test_error(红色表示未上线),默认列为“有”,类型为自定义,包含功能为拼写纠错,操作列可单击取消默认规则

配置排序表达式:排序表达式允许用户为应用自定义搜索结果排序方式,通过在查询请求中指定表达式来对结果排序,具体请参考搜索相关性配置

第一步:依次单击应用主页排序配置→策略管理进入搜索结果排序管理页面。

第二步:单击右上角的创建,添加新的基础排序(粗排)。

在基本信息配置中,选择目标应用及其环境,填写策略名称(长度 1~30 个字符,以字母开头,可含大小写字母、数字和下划线),类型选择表达式,然后单击下一步。在排序配置步骤中,算分特征选择static_bm250权重设置为1,然后单击完成。基础排序(粗排)对性能影响较大,尽量选用最有代表性的字段。这里我们以配置文本分、文档新旧程度的算分配置为例。

第三步:添加新的业务排序(精排)。在创建策略基本信息页面,填写策略名称,将应用范围设置为业务排序,将类型设置为表达式,然后单击下一步进入排序配置。在排序表达式编辑区域中输入text_relevance(title),然后单击完成。这里我们以配置商品名相关性为例。

第四步:完成配置。在搜索测试页面,选择索引test_han_indexes,应用类型选择线上应用,输入查询query=title:'裙子',config 子句设为start:0,页面左右对比两种业务排序策略返回的搜索结果,验证精排配置效果。这里搜索测试支持普通查询和设置策略排序后的查询结果对比。

配置下拉提示:电商场景中,为了减少用户输入,帮助用户尽快找到想要的内容,我们可以使用开放搜索的下拉提示功能。关于下拉提示功能的配置请参考下拉提示

配置类目预测:您也可以使用类目预测功能预测用户想要查询那个类目的结果,具体步骤请参考类目预测

其他常用配置

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

  • 业务上还支持按价格区间进行结果的查看,需要采用filter子句,更多用法请参考过滤子句-filter。我们以价格字段进行过滤为例,操作相关代码如下:

    if(!lowPrice.equals("")){
      queryElement.addFilter("price>=" + lowPrice);
    }
    if(!highPrice.equals("")){
      queryElement.addFilter("price<=" + highPrice);
    }

总结

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