11.搜索过滤聚合

总结:

1.过滤功能分析

a.顶部导航已经选择的过滤条件
b.过滤条件展示,分类,品牌,规格参数

2.生成分类和品牌过滤(在搜索结果里,根据分类聚合所有商品,得到全部分类渲染到分类结果中)

a.应该根据搜索商品结果聚合出商品信息,品牌信息

应该根据用户搜索的结果,显示搜索的结果商品的全部分类和品牌信息。-- 从搜索的结果商品中聚合得到商品的分类,品牌信息。

2.1 扩展返回结果
PageResult只有total, totalPage, Items3个属性。但现在要根据用户搜索结果商品进行聚合,得到结果商品的分类,品牌信息。所以需要对返回结果进行扩展,添加分类和品牌的数据。

SearchResult
public class SearchResult extends PageResult
添加:private List<Map<String, Object>> categories;
private List brands;

2.2 实现功能:聚合商品分类和品牌
因为索引库中只要id, 所以要根据id聚合,然后再根据id去查询完整的数据。
所以商品微服务提供一个接口,根据品牌id集合,批量查询品牌。

修改SearchService中的search(SearchRequest request)方法, 增加聚合品牌和分类的功能

初始化自定义查询构建器
添加查询条件
添加结果集过滤,过滤掉字段,只需要id,subTitle, skus
获取分页参数,获取分页
添加3级分类,品牌聚合字段
执行搜索,获取搜索结果集
解析结果集,查询每个桶的分类id,再根据分类id添加分类对象,只添加部分字段到Map<String,Object>, 结果List<Map<String,Object>>)
解析结果集,查询每个桶的品牌id,再根据品牌id添加品牌对象,结果 List

结果:
在这里插入图片描述

2.3 规格参数的过滤(根据分类搜索结果聚合出所有分类)

用户搜索得到商品,并聚合出商品分类。

  • 只有在聚合出的商品类=1 的情况下才去聚合商品规格,因为不同类下,规格参数不一样

判断用户分类数量是否等于1,如果是则进行规格参数聚合
根据分类,查找可以用来搜索的规格
对规格参数进行聚合,将规格参数聚合结果整理后返回。

3.2.1 扩展返回结果

public class SearchResult extends PageResult{
private List<Map<String, Object>> categories;
private List brands;
private List<Map<String, Object>> specs;
}

3.2.2.判断是否需要聚合,判断分类的个数,如果是1个则进行规格聚合:
3.2.3.获取需要聚合的规格参数
根据分类id, searching字段为true查询所有规格参数
3.2.4.聚合规格参数
聚合出规格参数
3.2.5.解析聚合结果
解析聚合结果,即将所有规格参数名和值放入:Map<String , Object>

测试结果:
在这里插入图片描述


  • 了解过滤功能的基本思路
  • 实现分类和品牌展示
  • 了解规格参数展示
  • 实现过滤条件筛选
  • 实现已选过滤项回显
  • 实现取消选择过滤项

1.过滤功能分析

首先看下页面要实现的效果:
在这里插入图片描述
整个过滤部分有3块:

  • 顶部的导航,已经选择的过滤条件展示:
    • 商品分类面包屑,根据用户选择的商品分类变化
    • 其它已选择过滤参数
  • 过滤条件展示,又包含3部分
    • 商品分类展示
    • 品牌展示
    • 其它规格参数
  • 展开或收起的过滤条件的按钮

顶部导航要展示的内容跟用户选择的过滤条件有关。

  • 比如用户选择了某个商品分类,则面包屑中才会展示具体的分类
  • 比如用户选择了某个品牌,列表中才会有品牌信息。

所以,这部分需要依赖第二部分:过滤条件的展示和选择。因此我们先不着急去做。

展开或收起的按钮是否显示,取决于过滤条件有多少,如果很少,那么就没必要展示。所以也是跟第二部分的过滤条件有关。

这样分析来看,我们必须先做第二部分:过滤条件展示。

2.1.扩展返回的结果

原来,我们返回的结果是PageResult对象,里面只有total、totalPage、items3个属性。但是现在要对商品分类和品牌进行聚合,数据显然不够用,我们需要对返回的结果进行扩展,添加分类和品牌的数据。

那么问题来了:以什么格式返回呢?

看页面:

在这里插入图片描述
分类:页面显示了分类名称,但背后肯定要保存id信息。所以至少要有id和name

品牌:页面展示的有logo,有文字,当然肯定有id,基本上是品牌的完整数据

我们新建一个类,继承PageResult,然后扩展两个新的属性:分类集合和品牌集合:

在这里插入图片描述

public class SearchResult extends PageResult<Goods> {
   
    
    private List<Map<String, Object>> categories;
    private List<Brand> brands;

    public SearchResult() {
   
    }

    public SearchResult(List<Map<String, Object>> categories, List<Brand> brands) {
   
        this.categories = categories;
        this.brands = brands;
    }

    public SearchResult(List<Goods> items, Long total, List<Map<String, Object>> categories, List<Brand> brands) {
   
        super(items, total);
        this.categories = categories;
        this.brands = brands;
    }

    public SearchResult(List<Goods> items, Long total, Integer totalPage, List<Map<String, Object>> categories, List<Brand> brands) {
   
        super(items, total, totalPage);
        this.categories = categories;
        this.brands = brands;
    }

    public List<Map<String, Object>> getCategories() {
   
        return categories;
    }

    public void setCategories(List<Map<String, Object>> categories) {
   
        this.categories = categories;
    }

    public List<Brand> getBrands() {
   
        return brands;
    }

    public void setBrands(List<Brand> brands) {
   
        this.brands = brands;
    }
}

2.2.聚合商品分类和品牌

我们修改搜索的业务逻辑,对分类和品牌聚合。

因为索引库中只有id,所以我们根据id聚合,然后再根据id去查询完整数据。

所以,商品微服务需要提供一个接口:根据品牌id集合,批量查询品牌。

修改SearchService:

public SearchResult search(SearchRequest request) {
   

    // 判断查询条件
    if (StringUtils.isBlank(request.getKey())) {
   
        // 返回默认结果集
        return null;
    }

    // 初始化自定义查询构建器
    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
    // 添加查询条件
    queryBuilder.withQuery(QueryBuilders.matchQuery("all", request.getKey()).operator(Operator.AND));
    // 添加结果集过滤,只需要:id,subTitle, skus
    queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{
   "id", "subTitle", "skus"}, null));

    // 获取分页参数
    Integer page = request.getPage();
    Integer size = request.getSize();
    // 添加分页
    queryBuilder.withPageable(PageRequest.of(page - 1, size));

    String categoryAggName = "categories";
    String brandAggName = "brands";
    queryBuilder.addAggregation(AggregationBuilders.terms(categoryAggName).field("cid3"));
    queryBuilder.addAggregation(AggregationBuilders.terms(brandAggName).field("brandId"));

    // 执行搜索,获取搜索的结果集
    AggregatedPage<Goods> goodsPage = (AggregatedPage<Goods>)this.goodsReponsitory.search(queryBuilder.build());

    // 解析聚合结果集
    List<Map<String, Object>> categories = getCategoryAggResult(goodsPage.getAggregation(categoryAggName));
    List<Brand> brands = getBrandAggResult(goodsPage.getAggregation(brandAggName));

    // 封装成需要的返回结果集
    return new SearchResult(goodsPage.getContent(), goodsPage.getTotalElements(), goodsPage.getTotalPages(), categories, brands);
}
/**
     * 解析品牌聚合结果集
     * @param aggregation
     * @return
     */
private List<Brand> getBrandAggResult(Aggregation aggregation) {
   
    // 处理聚合结果集
    LongTerms terms = (LongTerms)aggregation;
    // 获取所有的品牌id桶
    List<LongTerms.Bucket> buckets 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您下载了本程序,但是该程序无法运行,或者您不会部署,那么您可以选择退款或者寻求我们的帮助(如果找我们帮助的话,是需要追加额外费用的) 爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
E桶金聚合搜索引擎的几大特点: 1.轻松聚合百度,Google及国内某大型聚合搜索引擎的搜索,给网民展现更好的搜索结果。 2.聚合搜索结果可选择保存到本地,使下次的搜索速度飞快。 3.完善的关键词竞价广告机制:竞价广告根据查询关键词的中文分词结果进行精确匹配。会员可注册为聚合搜索引擎的竞价用户,选择自己感兴趣的关键词投放竞价广告。所有广告的点击记录会员可以轻松看到。 4.会员推广本站可获取推广积分。推广积分可用来在本站投放竞价广告,实现双赢。 5.网站的所有搜索数据都完整保存,并进行精确统计展现给管理员。让管理员知道您的用户都在搜什么。 6.网站的黑名单功能轻松过滤某些不和谐关键词,防止网站被低俗。 还有一点是最近才发现的,这种聚合搜索引擎从google拉取长尾关键词的流量很猛噢! E桶金聚合搜索引擎 4.0版升级的主要内容如下: 1.推广中心集成支付宝支付功能,可以直接在线充值投放竞价广告。(非常重要) 2.增加百宝箱功能,可以像百度开放平台一样轻松地在自己的搜索中增加自己特有的应用,如:万年历、时间、在线汇率等; 3.增加聚合搜索日志的IP黑名单功能,轻松将一些不知名蜘蛛的ip加入黑名单,避免搜索日志迅速变大影响性能。 4.前台搜索界面仿百度的最新风格,更加简洁、实用。(重要) 5.对用户中心和用户注册登录界面全新改版,更加实用,大气。(重要) 6.推广用户增加保存公司名称和网址的功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值