谷粒商城实战笔记-175~177-商城业务-检索服务-检索查询接口开发

news2024/9/22 21:16:45

文章目录

  • 一,175-商城业务-检索服务-检索查询参数模型分析抽取
  • 二,176-商城业务-检索服务-检索返回结果模型分析抽取
  • 三,177-商城业务-检索服务-检索DSL测试-查询部分
  • 四,178-商城业务-检索服务-检索DSL测试-聚合部分
  • 问题记录
    • 解决方案

搜索页面搭建完成之后,点击搜索按钮,发送参数给后台服务,后台服务根据参数从Elasticsearch中查询符合条件的数据,返回给前端。

一,175-商城业务-检索服务-检索查询参数模型分析抽取

根据前端的交互设计,将前端发送的请求参数解析、封装检索查询请求对象。

这一步骤在实际工作中非常重要,开发人员在开发详细设计阶段完成,并输出文档,后续依据文档完成开发。

package com.atguigu.gulimall.search.vo;

import lombok.Data;

import java.util.List;


@Data
public class SearchParam {

    /**
     * 页面传递过来的全文匹配关键字
     */
    private String keyword;

    /**
     * 品牌id,可以多选
     */
    private List<Long> brandId;

    /**
     * 三级分类id
     */
    private Long catalog3Id;

    /**
     * 排序条件:sort=price/salecount/hotscore_desc/asc
     */
    private String sort;

    /**
     * 是否显示有货
     */
    private Integer hasStock;

    /**
     * 价格区间查询
     */
    private String skuPrice;

    /**
     * 按照属性进行筛选
     */
    private List<String> attrs;

    /**
     * 页码
     */
    private Integer pageNum = 1;

    /**
     * 原生的所有查询条件
     */
    private String _queryString;


}

二,176-商城业务-检索服务-检索返回结果模型分析抽取

这一节的主要内容是分析搜索响应的数据结构,根据实际业务和前端需求,将要返回给前端的内容分为如下几部分:

  • 检索到的产品信息
  • 分页信息
  • 汇总的产品的所有属性信息集合
  • 汇总的产品的品牌信息集合
  • 分类信息
package com.atguigu.gulimall.search.vo;

import com.atguigu.common.es.SkuEsModel;
import lombok.Data;

import java.util.List;


@Data
public class SearchResult {

    /**
     * 查询到的所有商品信息
     */
    private List<SkuEsModel> product;


    /**
     * 当前页码
     */
    private Integer pageNum;

    /**
     * 总记录数
     */
    private Long total;

    /**
     * 总页码
     */
    private Integer totalPages;

    private List<Integer> pageNavs;

    /**
     * 当前查询到的结果,所有涉及到的品牌
     */
    private List<BrandVo> brands;

    /**
     * 当前查询到的结果,所有涉及到的所有属性
     */
    private List<AttrVo> attrs;

    /**
     * 当前查询到的结果,所有涉及到的所有分类
     */
    private List<CatalogVo> catalogs;

    @Data
    public static class BrandVo {

        private Long brandId;

        private String brandName;

        private String brandImg;
    }


    @Data
    public static class AttrVo {

        private Long attrId;

        private String attrName;

        private List<String> attrValue;
    }


    @Data
    public static class CatalogVo {

        private Long catalogId;

        private String catalogName;
    }
}

以上是返回给前端的所有信息。

三,177-商城业务-检索服务-检索DSL测试-查询部分

这一节的主要内容是结合前端交互,编写后端的Elasticsearch的DSL语句。

涉及到Elasticsearch查询的开发,最佳的开发方式是先把DSL查询出来,然后转化为Java代码。

在编写ES查询DSL时,需要全文匹配的使用match query,其余的使用filter,因为全文匹配会有评分,精确匹配不需要评分,所以用filter,以提高查询性能。

GET gulimall_product/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "skuTitle": "华为"
          }
        }
      ],
      "filter": [
        {
          "term": {
            "catalogId": "225"
          }
        },
        {
          "terms": {
            "brandId": [
              1,
              2,
              9
            ]
          }
        },
        {
          "nested": {
            "path": "attrs",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "attrs.attrId": {
                        "value": "15"
                      }
                    }
                  },
                  {
                    "terms": {
                      "attrs.attrValue": [
                        "海思(Hisilicon)",
                        "以官网信息为准"
                      ]
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "term": {
            "hasStock": true
          }
        },
        {
          "range": {
            "skuPrice": {
              "gte": 5000,
              "lte": 7000
            }
          }
        }
      ]
    }
  },
  "sort": [
    {
      "skuPrice": {
        "order": "desc"
      }
    }
  ],
  "from": 0,
  "size": 4,
  "highlight": {
    "pre_tags": ["<b style='color:red'>"],
    "post_tags": ["</b>"], 
    "fields": {"skuTitle":{}}
  }
}

如果对DSL的语法比较熟悉,编写DSL难度并不大。

四,178-商城业务-检索服务-检索DSL测试-聚合部分

在搜索界面,点击搜索后,会展示如下的属性信息,以供用户进行点击查询,这些信息是在查询时根据产品信息汇总得到的,是实时的。

在这里插入图片描述

也就是说,我们还要在es查询结果基础上对数据进行汇总分析,可以使用ES提供的聚合分析完成这个需求。

GET gulimall_product/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "brand_agg": {
      "terms": {
        "field": "brandId"
      },
      "aggs": {
        "brand_name_agg": {
          "terms": {
            "field": "brandName",
            "size": 10
          }
        },
        "brand_img_agg": {
          "terms": {
            "field": "brandImg",
            "size": 10
          }
        }
      }
    },
    "catelog_agg": {
      "terms": {
        "field": "catalogId"
      },
      "aggs": {
        "catelog_name_agg": {
          "terms": {
            "field": "catalogName",
            "size": 10
          }
        }
      }
    },
    "attr_agg":{
      "nested": {
        "path": "attrs"
      },
      "aggs": {
        "attr_id_agg": {
          "terms": {
            "field": "attrs.attrId",
            "size": 10
          },
          "aggs": {
            "attr_name_agg": {
              "terms": {
                "field": "attrs.attrName",
                "size": 10
              }
            },
            "attr_value_agg": {
              "terms": {
                "field": "attrs.attrValue",
                "size": 10
              }
            }
          }
        }
      }
    }
  },
  "size": 0
}

问题记录

在kibana上执行搜索请求时,后台服务报错,报错信息如下。

{
  "error" : {
    "root_cause" : [
      {
        "type" : "query_shard_exception",
        "reason" : "failed to create query: Cannot invoke \"org.wltea.analyzer.dic.DictSegment.match(char[], int, int)\" because \"org.wltea.analyzer.dic.Dictionary.singleton._StopWords\" is null",
        "index_uuid" : "2y1rV0AxTEO-0b3NW_7vyA",
        "index" : "gulimall_product"
      }
    ],
    "type" : "search_phase_execution_exception",
    "reason" : "all shards failed",
    "phase" : "query",
    "grouped" : true,
    "failed_shards" : [
      {
        "shard" : 0,
        "index" : "gulimall_product",
        "node" : "xUhfiZFBQlC5T8RerthrhQ",
        "reason" : {
          "type" : "query_shard_exception",
          "reason" : "failed to create query: Cannot invoke \"org.wltea.analyzer.dic.DictSegment.match(char[], int, int)\" because \"org.wltea.analyzer.dic.Dictionary.singleton._StopWords\" is null",
          "index_uuid" : "2y1rV0AxTEO-0b3NW_7vyA",
          "index" : "gulimall_product",
          "caused_by" : {
            "type" : "null_pointer_exception",
            "reason" : "Cannot invoke \"org.wltea.analyzer.dic.DictSegment.match(char[], int, int)\" because \"org.wltea.analyzer.dic.Dictionary.singleton._StopWords\" is null"
          }
        }
      }
    ]
  },
  "status" : 400
}

在这里插入图片描述
原因是安装的IK分词器不能正常工作。

之前是使用命令进行自动安装。

bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/7.13.0

这种安装方式是有缺陷的,缺失配置文件相关。

应该手动安装。

解决方案


/mydata/elasticsearch/plugins目录下创建ik目录,cdik目录下。


下载IK分词器。

wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.13.0/elasticsearch-analysis-ik-7.13.0.zip


解压压缩包。

unzip elasticsearch-analysis-ik-7.13.0.zip


重启Elasticsearch容器。

docker restart elasticsearch

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2038984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis散列若干记录

字典 redis本身使用字典结构管理数据 redis使用hash表实现字典结构 使用了什么hash算法 使用SipHash算法&#xff0c;该算法能有效防止Hash表碰撞&#xff0c;并有不错的性能 hash冲突怎么解决 使用链表法解决hash冲突 hash表如何扩容 渐进式扩容&#xff0c;不会引起线程长期阻…

趣味算法------可截断素数

目录 题目描述&#xff1a; 思路解析&#xff1a; 质数判断函数&#xff1a; 反转函数&#xff1a; 右截断素数判断函数&#xff1a; 左可截断素数&#xff1a; 具体代码&#xff1a; 题目描述&#xff1a; 左截断素数是不包含 0 位的素数&#xff0c;当连续删除第一个数…

大四生都在的用8款AI论文生成器在线网站!

在当前的AI技术浪潮中&#xff0c;智能AI写作工具已经成为了学术研究和论文撰写的重要助手。对于大四生来说&#xff0c;选择合适的AI论文生成器可以大大提高写作效率和质量。以下是8款值得推荐的AI论文生成器在线网站&#xff1a; 一、千笔-AIPassPaPer 这是一款功能全面且高…

花几千上万学习Java,真没必要!(四十六)

Lambda表达式&#xff1a; 测试代码1&#xff1a; package test.lambda; public class LambdaDemo { // 实现Runnable接口的类 static class MyThread implements Runnable { Override public void run() { System.out.println("线程运行中&#xff1a;通过实现Runn…

【智能流体力学】ANSYS Fluent流体仿真基础、深度学习驱动思想及其CAX计算机辅助集成技术

目录 一、CAX计算机辅助集成技术二、计算机辅助工程(CAE)三、SCDM (Species Concentration Display Model) 显示和分析物质浓度分布的模型1. **SCDM概述**2. **主要功能**3. **功能特点**4. **使用步骤**5. **应用实例**6. **优点与限制**四、行业应用五、Fluent 软件功能1. …

Datawhale AI 夏令营 第四期 AIGC Task2

活动简介 活动链接&#xff1a;Datawhale AI 夏令营&#xff08;第四期&#xff09; 以及AIGC里面的本次任务说明&#xff1a;Task 2 精读代码&#xff0c;实战进阶 和上次任务一样&#xff0c;链接里的教程非常详细&#xff0c;对小白非常友好&#xff0c;从使用AI助手理解…

网工内推 | 网络、集成工程师,最高17K,NP以上认证优先

01 广东南方新媒体股份有限公司 &#x1f537;招聘岗位&#xff1a;网络工程师 &#x1f537;岗位职责&#xff1a; 1、负责基础设施运维管理&#xff0c;包括机房环境设备、网络设备、安全设备与服务器等&#xff0c;负责机房设备上架、下架、位置调整、布线等的常规操作。…

day36——homework

二、基于UDP的TFTP文件传输 1&#xff09;tftp协议概述 简单文件传输协议&#xff0c;适用于在网络上进行文件传输的一套标准协议&#xff0c;使用UDP传输 特点&#xff1a; 是应用层协议 基于UDP协议实现 数据传输模式 octet&#xff1a;二进制模式&#xff08;常用&am…

数据同步工具DataX

目录 1.概要 2.简介 3.DataX处理异构数据源 4.DataX的框架 5.DataX的核心架构 6.DataX的安装 7.DataX的使用案例 8.mysql同步到mysql案例 1.概要 本篇文件将介绍一款数据同步工具DataX的原理&#xff0c;安装&#xff0c;以及使用。 2.简介 官网连接&#xff1a;https…

STL经典案例(二)——公司招员工

需求&#xff1a;公司招了十个员工ABCDEFGHIJ&#xff0c;公司有五个部门&#xff0c;公司随机给这十个员工分配薪水&#xff0c;并且随机将这十名员工分配到不同的部门。 员工类中成员属性为姓名和工资&#xff0c;成员方法为设置姓名、设置工资、获得姓名、获得工资 部门有五…

Electron 开发桌面应用程序用于对接USB Audio Class协议

开发用于对接USB Audio Class协议的Electron桌面应用程序是一个复杂的任务&#xff0c;可能涉及多个开源库和项目的组合。以下是一些开源项目和库&#xff0c;它们可以帮助你实现这个目标&#xff1a; 1. Electron Electron 是一个用于构建跨平台桌面应用程序的框架。你可以使…

【云原生】Prometheus Pushgateway使用详解

目录 一、前言 二、Pushgateway概述 2.1 什么是Pushgateway 2.1.1 Pushgateway在Prometheus中的位置 2.2 为什么需要Pushgateway 2.3 Pushgateway作用 2.4 Pushgateway 工作原理 2.5 Pushgateway 使用场景 2.6 Pushgateway 优缺点 三、Pushgateway 部署 3.1 二进制安…

[C#]基于C# winform结合llamasharp部署llama3中文的gguf模型

【llmasharp源码】 https://github.com/SciSharp/LLamaSharp 【测试模型】 https://www.modelscope.cn/pooka74/LLaMA3-8B-Chat-Chinese-GGUF.git 【测试通过环境】 vs2019 netframework4.7.2 llamasharp0.15.0 cuda11.7.1cudnn8.8.0 注意测试发现使用cpu推理非常卡&a…

Stable Diffusion绘画 | ControlNet应用-SoftEdge(软边缘):让转绘更柔和

SoftEdge(软边缘) Canny(硬边缘) 有时候捕捉的细节过多&#xff0c;其实有时候并不需要那么多的细节。 例如下图中&#xff0c;围巾上的网格细节全部都被捕捉下来了&#xff1a; 切换到「SoftEdge(软边缘)」&#xff0c;它只重点抓取轮廓边缘&#xff0c;而且线条会比 Canny …

优购电商小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商品分类管理&#xff0c;商品信息管理&#xff0c;留言板管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品信息&#xf…

入门 PyQt6 看过来(项目)26 在线购物-主页面

功能导航页面很简单&#xff0c;就几个按钮功能。效果如下图&#xff1a; 1 主界面 ​ 包含 “商品选购”、”下单结算“、”销售分析“四个按钮以及“功能导航”标题。 2 工程目录 首先先创建工程目录及子目录&#xff1a; ​ 3 代码 主窗口文件为Main.py&#xff0c;其…

第2章 C语言基础知识

第2章 C语言基础知识 1.printf()函数 在控制台输出数据&#xff0c;需要使用输出函数&#xff0c;C语言常用的输出函数为printf()。 printf()函数为格式化输出函数&#xff0c;其功能是按照用户指定的格式将数据输出到屏幕上。 printf(“格式控制字符串”,[输出列表]); 格式控…

C++ 124类和对象_运算符重载_赋值

C 124类和对象_运算符重载_赋值 学习内容 解决自定义对象之间赋值是因析构函数重复释放内存时引发的异常问题 结果 代码 #include<iostream> using namespace std;//cout 在这里&#xff0c;没有它会报错//类和对象_运算符重载_赋值 //学习内容 //解决自定义对…

【Qt】Qt窗口 | 菜单栏QMenuBar

文章目录 一. 菜单栏二. 代码创建&使用菜单栏1. 创建菜单栏2. 在菜单栏中添加菜单3. 创建菜单项4. 在菜单项之间添加分割线5. 添加快捷方式6. 菜单/菜单项添加图标7. 添加子菜单 三. 图形化创建菜单栏 窗口 Qt 中窗口是通过QMainWindow类实现的 QMainWindow 是一个为用户提…

React使用useRef ts 报错

最近在写自己的React项目&#xff0c;我在使用useRef钩子函数的时候发现 TS2322: Type MutableRefObject<HTMLDivElement | undefined> is not assignable to type LegacyRef<HTMLDivElement> | undefined Type MutableRefObject<HTMLDivElement | undefined&g…