14、生鲜电商平台-搜索模块的设计与架构

说明:搜索模块针对的是买家用户,在找菜品找的很费劲下的一种查询方面。目前也是快速的检索商品。

对于移动端的APP买家用户而言,要求的速度在3秒内完成。支持模糊查询,由于业务实战表面,整个搜索频率不到18%-25%之间

同时业务也不算很大,所以并没采用java全文检索技术.(lucene等)。这里采用的就是基本的模糊查询。

1. 搜索维度的是思考。

1.1  买家搜索的内容很有可能是针对菜品的本身属性而言,所以涉及到的内容有商品名称,商品别名,商品标签,商品描述,规格的名称,加工方式等。

1.2  我们知道模糊搜索会导致索引失效,同时整个查询性能也是有影响的。

1.3 业务形态显示有些热点的词语与内容可以做JVM缓存以提高整个单品的购买率。比如土豆现在分析出很多人要,如果我们可以跟某个商家谈好,一天

需要10w斤土豆的量进行供应,那么整个页面会出现这个关键字的默认显示。这个是后端灵活配置的。

2. 对于买家搜索的关键字,我们需要数据库进行记录,这样可以从系统级别算出买家会需要什么,可以进行针对性的营销.

相关数据库表的设计如下:

CREATE TABLE `buyer_search` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘自动增加ID‘,
  `buyer_id` bigint(20) DEFAULT NULL COMMENT ‘买家ID‘,
  `words` bigint(20) DEFAULT NULL COMMENT ‘卖家ID‘,
  `create_time` datetime DEFAULT NULL COMMENT ‘创建时间‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘买家搜索记录表‘;

补充说明:目的其实是很明确的,就是记录买家搜索的关键字以便分析与研究用。为了更好的体验用户。

相关业务代码如下:

    /**
     * APP全文搜索 新
     * @param request
     * @param response
     * @param keyword
     * @return
     */
    @RequestMapping(value = "/search/new", method = { RequestMethod.GET, RequestMethod.POST })
    public JsonResult newSearchGoods(HttpServletRequest request, HttpServletResponse response,Long userId,Long regionId,String keyword){
        try{
            logger.info("SearchController.search.keyword:搜索内容:" + keyword);
            //搜索结果按商家显示
            //List<SellerVo> list = sellerService.searchSeller(regionId,keyword);
            //搜索结果按商品显示
            List<NewSearchVo> list = goodsService.newSearchGoods(userId,regionId,keyword);
            return new JsonResult(JsonResultCode.SUCCESS, "查询信息成功", list);
        }catch(Exception ex){
            logger.error("[SearchController][newSearchGoods] exception :",ex);
            return new JsonResult(JsonResultCode.FAILURE, "系统错误,请稍后重试","");
        }
    }
    

VO对象如下:

/**
 * 搜索显示类(APP全局搜索)
 */
public class NewSearchVo implements Serializable{

    private static final long serialVersionUID = 1L;

    /**
     * 来源于users的ID
     */
    private Long sellerId;

    /**
     * 店铺名称
     */
    private String sellerName;

    /**
     * 店铺别名,可以理解为简称
     */
    private String sellerAlias;

    /**
     * 店铺logo
     */
    private String sellerLogo;

    /**
     * 店铺评级,默认为0
     */
    private int sellerRank;

    /**
     * 店铺评分
     */
    private Double sellerGrade;

    /**
     * 搜索后商品列表
     */
    private List<GoodsVo> searchItemList;

    public Long getSellerId() {
        return sellerId;
    }

    public void setSellerId(Long sellerId) {
        this.sellerId = sellerId;
    }

    public String getSellerName() {
        return sellerName;
    }

    public void setSellerName(String sellerName) {
        this.sellerName = sellerName;
    }

    public String getSellerAlias() {
        return sellerAlias;
    }

    public void setSellerAlias(String sellerAlias) {
        this.sellerAlias = sellerAlias;
    }

    public String getSellerLogo() {
        return sellerLogo;
    }

    public void setSellerLogo(String sellerLogo) {
        this.sellerLogo = sellerLogo;
    }

    public int getSellerRank() {
        return sellerRank;
    }

    public void setSellerRank(int sellerRank) {
        this.sellerRank = sellerRank;
    }

    public Double getSellerGrade() {
        return sellerGrade;
    }

    public void setSellerGrade(Double sellerGrade) {
        this.sellerGrade = sellerGrade;
    }

    public List<GoodsVo> getSearchItemList() {
        return searchItemList;
    }

    public void setSearchItemList(List<GoodsVo> searchItemList) {
        this.searchItemList = searchItemList;
    }
}

3, 数据查询性能暂时的基本满足要求,也贴出来给大家一起参考,目的是共同学习与思考.

    <!-- 全局搜索商品  新-->
    <select id="newSearchGoods" resultMap="newSearchResult">
        <include refid="newSearchSelect" />
        <include refid="newSearchFrom" />
        <include refid="searchWhere" />
        <if test=" keyword != null">
            and (g.goods_name like concat(‘%‘,#{keyword},‘%‘)
            or g.goods_as like concat(‘%‘,#{keyword},‘%‘)
            or g.goods_label like concat(‘%‘,#{keyword},‘%‘)
            or g.goods_brand like concat(‘%‘,#{keyword},‘%‘)
            or g.goods_desc like concat(‘%‘,#{keyword},‘%‘)
            or gf.format_name like concat(‘%‘,#{keyword},‘%‘)
            or pm.method_name like concat(‘%‘,#{keyword},‘%‘)
            or s.seller_name like concat(‘%‘,#{keyword},‘%‘)
            or exists(select 1 from category where category_id = g.category_id and category_name like concat(‘%‘,#{keyword},‘%‘) )
            )
        </if>
        <include refid="searchOrderBy" />
    </select>

总结,由于搜索这块所涉及的业务相对而言比较少,功能也比较单一,含金量不是很高,所以互相学习。

对于扩展方案,如果这块的业务发现很大,可以采用中文分词记录,进行数据的挖掘,已经冷热点数据的一个分离等等,这个后期大家有需要的话,我们再研究。

相关业务运营截图如下:

转载自-- https://www.cnblogs.com/jurendage/p/9062649.html

原文地址:https://www.cnblogs.com/lu-manman/p/10052317.html

时间: 2024-11-02 00:16:25

14、生鲜电商平台-搜索模块的设计与架构的相关文章

8、生鲜电商平台-购物车模块的设计与架构

说明:任何一个电商无论是B2C还是B2B都有一个购物车模块,其中最重要的原因就是客户需要的东西放在一起,形成一个购物清单,确认是否有问题,然后再进行下单与付款. 1. 购物车数据库设计: 说明:业务需求: 1>购物车里面应该存放,那个买家,买了那个菜品的什么规格,有多少数量,然后这个菜品的加工方式如何.(如果存在加工方式的话,就会在这里显示处理.) 2>买家存在购物起送价.也就是用户放入购物车的商品的总价格如果低于配置的起送价,那么这个提交按钮就是灰色的.(不可能你点一个洋葱我们就送过去,成本

9、生鲜电商平台-推荐系统模块的设计与架构

业务需求: 对于一个B2B的生鲜电商平台,对于买家而言,他需要更加快速的购买到自己的产品,跟自己的餐饮店不相关的东西,他是不关心的,而且过多无用的东西掺杂在一起,反而不便 于买家下单,用户体验也很差,严重的会因此丢了客户.(客户觉得太难用了.一般都就会放弃使用.) 对于卖家而言,他自己就调整下自己的商品的上架与下架,然后就是调整下自己商品的价格.(蔬菜类的商品会随着市场的供求关系会有相应的波动.) 业务分析: 推荐系统:根据买家的行为习惯以及购买行为来推荐些他可能需要的东西的一套算法系统. 对于

37、生鲜电商平台-供应链模块的设计与架构

说明:Java开源生鲜电商平台中供应链模块属于卖家的行为,也就是卖家如何管理他们自己的供应商,包括结算方式,压款方式,结算周期等等,超出了我这个B2B平台所提供的服务范畴,但是这块也是非常重要的一块,只是属于另外的一个领域,对此我只发布我自己的看法与见解,包括设计等. 近段时间有几个项目,客户提到需要实现供应商管理供应链上的库存(Vendor Managed Inventory)的业务.所以对这方面做了比较多的研究,现在写下来和各位同行分享一下. 本文将分为两部份,第一部分介绍供应链.牛鞭效应和

17、生鲜电商平台-异常模块的设计与架构

说明:任何一个软件系统都会出现各式各样的异常与错误,我们需要根据异常的情况进行捕获与分析,改善自己的代码,让其更加的稳定的,快速的运行,那么作为一个 B2B的Java开源生鲜电商平台,我们的异常需要思考以下几个维度. 1. 运行的代码异常     说明:代码在运行的过程中,难免出现各种异常与错误,我们采用Log4j进行日志的记录.               在分层代码解耦过程中,我们统一在Controller进行异常的捕获与日志记录. 相关的运行的代码异常架构如下: /** * (商家店铺)商

Java开源生鲜电商平台-通知模块设计与架构(源码可下载)

Java开源生鲜电商平台-通知模块设计与架构(源码可下载) 说明:对于一个生鲜的B2B平台而言,通知对于我们实际的运营而言来讲分为三种方式:           1. 消息推送:(采用极光推送)           2. 主页弹窗通知.(比如:现在有什么新的活动,有什么新的优惠等等)           3. 短信通知.(对于短信通知,这个大家很熟悉,我们就说下我们如何从代码层面对短信进行分层的分析与架构) 1. 消息推送 说明:目前市场上的推送很多,什么极光推送,环信,网易云等等,都可以实现秒

Java开源生鲜电商平台-用户表的设计(源码可下载)

Java开源生鲜电商平台-用户表的设计(源码可下载) 说明:由于该系统属于B2B平台,不设计到B2C的架构. 角色分析:买家与卖家. 由于买家与卖家所填写的资料都不一样,需要建立两站表进行维护,比如:buyer,seller. 这样进行数据库的解耦,任何一方的变动都互不影响,但是我想集中式管理,以及一些业务个性化要求,我就增加了一个users表.表结构如下: 账号唯一键,所以做了唯一键索引, 账号的准确性采用手机短信验证. 根据类型区分买家与卖家,登陆的时候,采用的就是users这种表进行维护

21、生鲜电商平台-通知模块设计与架构

说明:对于一个生鲜的B2B平台而言,通知对于我们实际的运营而言来讲分为三种方式:           1. 消息推送:(采用极光推送)           2. 主页弹窗通知.(比如:现在有什么新的活动,有什么新的优惠等等)           3. 短信通知.(对于短信通知,这个大家很熟悉,我们就说下我们如何从代码层面对短信进行分层的分析与架构) 1. 消息推送 说明:目前市场上的推送很多,什么极光推送,环信,网易云等等,都可以实现秒级别的推送,我们经过了市场调研与稳定性考察,最终选择了极光推

Java开源生鲜电商平台-Java后端生成Token架构与设计详解(源码可下载)

Java开源生鲜电商平台-Java后端生成Token架构与设计详解(源码可下载) 目的:Java开源生鲜电商平台-Java后端生成Token目的是为了用于校验客户端,防止重复提交. 技术选型:用开源的JWT架构. 1.概述:在web项目中,服务端和前端经常需要交互数据,有的时候由于网络相应慢,客户端在提交某些敏感数据(比如按照正常的业务逻辑,此份数据只能保存一份)时,如果前端多次点击提交按钮会导致提交多份数据,这种情况我们是要防止发生的. 2.解决方法: ①前端处理:在提交之后通过js立即将按钮

Java开源生鲜电商平台-OMS订单系统中并发问题和锁机制的探讨与解决方案(源码可下载)

Java开源生鲜电商平台-OMS订单系统中并发问题和锁机制的探讨与解决方案(源码可下载) 说明:Java开源生鲜电商中OMS订单系统中并发问题和锁机制的探讨与解决方案: 问题由来     假设在一个订单系统中(以火车票订单系统为例),用户A,用户B都要预定从成都到北京的火车票,A.B在不同的售票窗口均同时查询到了某车厢卧铺中.下铺位有空位.用户A正在犹豫订中铺还是下铺,这时用户B果断订购了下铺.当用户A决定订下铺时,系统提示下铺已经被预订,请重新选择铺位.在这个系统场景中,我们来探讨一下,火车票