尚品汇-创建ES索引库(二十七)
目录:
(1)商品检索功能介绍
(2)根据业务搭建数据结构
(3)nested 介绍
(4)搭建service-list服务
(5)构建实体与es mapping建立映射关系
(6)初始化mapping结构到es中
(1)商品检索功能介绍

根据用户输入的检索条件,查询出对应的商品
检索两个入口
首页的分类:

搜索栏:

检索列表展示页面







(2)根据业务搭建数据结构

建立mapping!
这时我们要思考三个问题:
- 哪些字段需要分词
- 例如:商品名称
- 我们用哪些字段进行过滤
- 平台属性值
- 分类Id
- 哪些字段我们需要通过搜索查询出来。
- 商品名称,价格,图片等。
以上分析的所有显示,以及分词,过滤的字段都应该在es中出现。Es中如何保存这些数据呢?
“根据上述的字段描述,应该建立一个mappings对应的存上上述字段描述的信息!”
根据以上制定出如下结构:mappings
Index:goods
type:_doc
document: properties - rows
field: id,price,title…
Es中index默认是true。
注意:ik_max_word 中文词库必须有!
attrs:平台属性值的集合,主要用于平台属性值过滤。
(3)nested 介绍

nested:类型是一种特殊的对象object数据类型(specialised version of the object datatype ),允许对象数组彼此独立地进行索引和查询。
demo: 建立一个普通的index
如果linux 中有这个my_index 先删除!DELETE /my_index


步骤1:建立一个index
PUT my_index/_doc/1
{
"group" : "fans",
"user" : [
{
"first" : "John",
"last" : "Smith"
},
{
"first" : "Alice",
"last" : "White"
}
]
}
步骤2 : 执行查询
GET my_index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "user.first": "Alice" }},
{ "match": { "user.last": "Smith" }}
]
}
}
}
查询结果:

能够查询出数据的原因是因为:建立my_index 的时候,它默认的数据类型是Object

{user.first:”John ,Alice”}
{user.last:”Smith,White”}
实际上:从业务的角度出发应该没有数据: 因为
User1 {John,Smith}
User2 {Alice,White}
是两个对象 而 {Alice,Smith} 在当前的user 中不存在!
步骤3:删除当前索引
DELETE /my_index

步骤4:建立一个nested 类型的
PUT my_index
{
"mappings": {
"properties": {
"user": {
"type": "nested"
}
}
}
}
user字段映射为nested类型,而不是默认的object类型
重新执行步骤1,使用nested 查询
GET /my_index/_search
{
"query": {
"nested": {
"path": "user",
"query": {
"bool": {
"must": [
{"match": {"user.first": "Alice"}},
{"match": {"user.last": "Smith"}}
]
}
}
}
}
}
此查询得不到匹配,是因为Alice和Smith不在同一个嵌套对象中。

尽管查询的对象是一个,但是是nested存储,普通的查询不能查出来
{"match": {"user.last": "White"}} 此时就会有数据:


(4)搭建service-list服务



在service模块下搭建,搭建方式如service-item


修改配置pom.xml
添加依赖:
<dependencies><dependency><groupId>com.atguigu.gmall</groupId><artifactId>service-product-client</artifactId><version>1.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency></dependencies>
说明:
- 引入service-product-client模块
- 引入spring-boot-starter-data-elasticsearch依赖
添加配置文件
bootstrap.properties:
说明:添加es配置
spring.application.name=service-listspring.profiles.active=devspring.cloud.nacos.discovery.server-addr=192.168.200.129:8848spring.cloud.nacos.config.server-addr=192.168.200.129:8848spring.cloud.nacos.config.prefix=${spring.application.name}spring.cloud.nacos.config.file-extension=yamlspring.cloud.nacos.config.shared-configs[0].data-id=common.yaml

添加主启动类
没有用到mysql,这里需要用注解排除数据源
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@ComponentScan({"com.atguigu.gmall"})
@EnableDiscoveryClient
@EnableFeignClients(basePackages= {"com.atguigu.gmall"})
public class ServiceListApplication {public static void main(String[] args) {SpringApplication.run(ServiceListApplication.class,args);}
}
(5)构建实体与es mapping建立映射关系

package com.atguigu.gmall.model.list;@Document(indexName = "goods", shards = 3, replicas = 1)
@Data
public class Goods {@Idprivate Long id;@Field(type = FieldType.Keyword, index = false)private String defaultImg;@Field(type = FieldType.Text, analyzer = "ik_max_word")private String title;@Field(type = FieldType.Double)private Double price;@Field(type = FieldType.Date,format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss")private Date createTime; // 新品@Field(type = FieldType.Long)private Long tmId;@Field(type = FieldType.Keyword)private String tmName;@Field(type = FieldType.Keyword)private String tmLogoUrl;@Field(type = FieldType.Long)private Long category1Id;@Field(type = FieldType.Keyword)private String category1Name;@Field(type = FieldType.Long)private Long category2Id;@Field(type = FieldType.Keyword)private String category2Name;@Field(type = FieldType.Long)private Long category3Id;@Field(type = FieldType.Keyword)private String category3Name;@Field(type = FieldType.Long)private Long hotScore = 0L;@Field(type = FieldType.Nested)private List<SearchAttr> attrs;}
平台属性-平台属性值
@Data
public class SearchAttr {@Field(type = FieldType.Long)private Long attrId;@Field(type = FieldType.Keyword)private String attrName;@Field(type = FieldType.Keyword)private String attrValue;
}
(6)初始化mapping结构到es中
package com.atguigu.gmall.list.controller;
@RestController
@RequestMapping("api/list")
public class ListApiController {@Autowiredprivate ElasticsearchRestTemplate restTemplate;/*** @return*/@GetMapping("inner/createIndex")public Result createIndex() {//创建索引库restTemplate.createIndex(Goods.class);//建立mappingrestTemplate.putMapping(Goods.class);return Result.ok();}
}
在浏览器运行:

http://localhost:8203/api/list/inner/createIndex
通过kibana查看mapping


相关文章:
尚品汇-创建ES索引库(二十七)
目录: (1)商品检索功能介绍 (2)根据业务搭建数据结构 (3)nested 介绍 (4)搭建service-list服务 (5)构建实体与es mapping建立映射关系 &…...
设计模式-六大原则
概述 设计模式的六大原则是设计模式的基础,了解设计模式的原则,有利于设计模式实际应用的理解,在真实使用的时候,一般不太可能一个程序满足所有的设计模式六大原则,或多或少都会有违背设计模的地方,所以不…...
MyBatis搭建和增删改查
MyBatis是一个开源的持久层框架,用于处理数据库的增删改查操作。它能够将Java对象与数据库中的数据进行映射关系的配置,并自动生成对应的SQL语句,从而简化了数据库操作的编码工作。 MyBatis的核心思想是将SQL语句与Java代码分离,…...
【一图学技术】6.反向代理 vs API网关 vs 负载均衡的原理和使用场景
反向代理 vs API网关 vs 负载均衡 一、概念 🌏反向代理(Reverse Proxy)是一种位于服务器和客户端之间的代理服务器。 它接收来自客户端的请求,并将其转发给后端服务器,然后将后端服务器的响应返回给客户端。客…...
python爬虫番外篇 | Reuqests库高级用法(1)
文章目录 1.会话对象(Session Objects)2.请求和响应对象(Request and Response Objects)3.准备好的请求(Prepared Requests)4.SSL证书验证5.客户端证书6.CA 证书7.正文内容工作流程(Body Conten…...
【链表OJ】常见面试题 3
文章目录 1.[环形链表II](https://leetcode.cn/problems/linked-list-cycle-ii/description/)1.1 题目要求1.2 快慢指针1.3 哈希法 2.[随机链表的复制](https://leetcode.cn/problems/copy-list-with-random-pointer/description/)2.1 题目要求2.2 迭代法 1.环形链表II 1.1 题目…...
Linux学习笔记9(Linux包管理)
目录 归档包管理 归档 查看归档包 解归档包 压缩包管理 Zip/unzip gzip/gunzip bzip2/bunzip2 源码包安装软件 三大步: 预备步骤:安装依赖的编译库 一、./configure --prefix/usr/local/nginx 二、make 三、make install 软件包安装 配置…...
论文阅读《Geometric deep learning of RNA structure》
引入了机器学习方法,通过少量的数据学习。只使用原子坐标作为输入。 预测RNA三维结构比预测蛋白质结构更困难。 设计了一个原子旋转等变评分器ARES,由每个原子的三维坐标和化学元素类型(输入)指定,ARES预测模型与未知真…...
宏集方案 | 传统建筑智能化改造,迈向物联新时代
前言 智能建筑涉及多个系统的集成,如照明、空调、安防等,这些系统的兼容性和协调运作是一大挑战。然而,传统的工业建筑和商业楼宇受早期设计的局限,多个控制系统间互不兼容,并且难以重新部署通信线缆。 针对传统建筑…...
如果服务器更改Web端口会减少被攻击的风险吗?
通过更改服务器的Web端口,是否能够显著降低被攻击的风险?首先,理解Web服务默认使用的端口是关键。HTTP协议通常使用80端口,而HTTPS则默认使用443端口。这些端口因其广泛认知而成为黑客攻击的首要目标。理论上,将Web服务迁移到非标…...
vim列编辑模式
在编辑文本时,经常会有这样的需求,对特定列进行进行批量编辑。比如批量注释一段代码,或者删除待定字符(如一列空格)。幸运的是VIM支持列编辑模式。 假设文本内容: Maximum length of a custom vocabulary…...
如何实现pxe安装部署
此实验环境:rhel7主机 一、kickstart自动化安装脚本 1、安装可视化图形 [rootlocalhost ~]# yum group install "Server with GUI" 2、关闭vmware dhcp功能(编辑-虚拟网络编辑器) 3、httpd 1、安装httpd服务 [rootlocalhost …...
机器学习常见模型
1、线性模型 线性模型是机器学习最基本的算法类型,它试图学到一个通过多个特征(属性)计算的线性组合来预测的函数,简单的线性回归形式如yaxb,其中,x代表特征,而y代表结果,一旦a和b的…...
【python案例】基于Python 爬虫的房地产数据可视化分析设计与实现
引言 研究背景与意义 房地产行业在我国属于支柱性产业,在我国社会经济发展中一直扮演着重要角色。房价问题,尤其是大中城市的房价问题,一直是政府、大众和众多研究人员关注的热点。如何科学地预测房价是房价问题的研究方向之一。随着互联网…...
如何在Python中诊断和解决内存溢出问题
python的内存溢出即程序在申请内存后未能正确释放,导致随着时间推移占用的内存越来越多,以下是一些可能导致内存溢出的原因: 1、循环引用:当对象之间形成循环引用,并且这些对象定义了__del__方法时,Python…...
什么是爬虫软件?这两个爬虫神器你必须要试试
爬虫软件概述 爬虫,又称为网络爬虫或网页爬虫,是一种自动浏览互联网的程序,它按照一定的算法顺序访问网页,并从中提取有用信息。爬虫软件通常由以下几部分组成: 用户代理(User-Agent)…...
记录|MVS和VM软件使用记录
目录 前言一、常用属性二、触发模式选择三、操作注意点四、录像、抓拍功能五、VM软件六、VM软件界面介绍七、VM软件运行间隔八、VM软件图像源九、VM软件相机管理十、获取图像十一、方案存储十一、相机拍摄彩图转换颜色转换快速匹配特征模板:运行参数 十二、位置修正…...
算法通关:014_1:用栈实现队列
文章目录 题目总结代码运行结果 题目 用栈实现队列 leetcode :232 总结 时间复杂度 平均下来每个方式是O(1) 代码 class MyQueue {public Stack<Integer> in;public Stack<Integer> out;//初始化public MyQueue() {in new Stack<>();out new Stack<…...
【C#】Random
在 C# 中,Random 类的实例通常用于生成随机数。在方法内部或外部创建 Random 实例主要影响的是实例的生命周期和性能。 在方法外部创建 Random 实例 生命周期:如果在类的成员变量中创建 Random 实例,那么这个实例的生命周期将与类的实例相同…...
MongoDB简介及其在Java中的应用
什么是MongoDB? MongoDB是一个基于分布式文件存储的数据库,由C语言编写。它旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB结合了关系数据库和非关系数据库(NoSQL)的特点,是功能最丰富、最像关系数据库的…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
