尚品汇-创建ES索引库(二十七)

news2024/11/24 0:47:19

目录:

(1)商品检索功能介绍

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

(3)nested 介绍

(4)搭建service-list服务

(5)构建实体与es mapping建立映射关系

(6)初始化mapping结构到es中

(1)商品检索功能介绍

根据用户输入的检索条件,查询出对应的商品

检索两个入口

首页的分类:

搜索栏:

检索列表展示页面

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

建立mapping!

这时我们要思考三个问题:

  1. 哪些字段需要分词
    1.  例如:商品名称
  2. 我们用哪些字段进行过滤
    1. 平台属性值
    2. 分类Id
  3. 哪些字段我们需要通过搜索查询出来。
    1. 商品名称,价格,图片等。

以上分析的所有显示,以及分词,过滤的字段都应该在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"}}

          ]

        }

      }

    }

  }

}

此查询得不到匹配,是因为AliceSmith不在同一个嵌套对象中。

尽管查询的对象是一个,但是是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>

说明:

  1. 引入service-product-client模块
  2. 引入spring-boot-starter-data-elasticsearch依赖

添加配置文件

bootstrap.properties:

说明:添加es配置

spring.application.name=service-list

  spring.profiles.active=dev

  spring.cloud.nacos.discovery.server-addr=192.168.200.129:8848

  spring.cloud.nacos.config.server-addr=192.168.200.129:8848

  spring.cloud.nacos.config.prefix=${spring.application.name}

  spring.cloud.nacos.config.file-extension=yaml

  spring.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 {

    @Id
    private 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 {

    @Autowired
    private ElasticsearchRestTemplate restTemplate;

    /**
     * @return
     */
    @GetMapping("inner/createIndex")
    public Result createIndex() {
        //创建索引库
        restTemplate.createIndex(Goods.class);

        //建立mapping
        restTemplate.putMapping(Goods.class);
        return Result.ok();
    }
}

 

在浏览器运行:

http://localhost:8203/api/list/inner/createIndex

通过kibana查看mapping

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

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

相关文章

前端常用的几个工具网站

觉得不错的前端工具类网站 1、Grid布局生成 https://cssgrid-generator.netlify.app 2、拟物按钮样式生成 https://neumorphism.io 3、玻璃形态效果 在线制作CSS玻璃形态 4、一些Button、checkBox、switch、card的css样式 零代码 - 精美CSS样式库 5、CSS阴影生成 在线创建…

python游戏开发之五子棋游戏制作

五子棋是一种源自中国的传统棋类游戏&#xff0c;起源可以追溯到古代。它是一种两人对弈的游戏&#xff0c;使用棋盘和棋子进行。棋盘通常是一个 1515 的网格&#xff0c;棋子分为黑白两色&#xff0c;双方轮流在棋盘上落子。游戏的目标是通过在棋盘上落子&#xff0c;使自己的…

ViT和SwinTransformer详解

ViT是Google brain发表于ICLR21上的工作&#xff0c;开创性将transformer用在vision领域&#xff0c;且图像识别性能超CNN&#xff0c;至今引用3.8w&#xff1b;原文&#xff1a;https://arxiv.org/pdf/2010.11929 SwinTransformer是微软亚洲研究院发表于ICCV21上&#xff0c;…

使用python CodeGeeX 辅助数据处理xml

1 背景:手头上有N 张算是开发完成的报表,但是由于每个报表是不同的人开发的,每个人不同的编码风格,准备看看报表是否都定义了Title,是否都定义了报表的描述,是否有不带where条件的前台查询,是否同一个参数定义一致.现在AI 代码助手功能据说很强大了,试试描述需求让机器来辅助编…

【中项】系统集成项目管理工程师-第10章 项目整合管理-10.3指导与管理项目工作

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

常用在线 Webshell 查杀工具推荐

一、简介 这篇文章将介绍几款常用的在线 Webshell 查杀工具&#xff0c;包括长亭牧云、微步在线云沙箱、河马和VirusTotal。每个工具都有其独特的特点和优势&#xff0c;用于帮助用户有效检测和清除各类恶意 Webshell&#xff0c;保障网站和服务器的安全。文章将深入探讨它们的…

实现自定义QDateEdit可删除日期值

在Qt框架中&#xff0c;QDateEdit是一个用于编辑日期的控件&#xff0c;如果想要删除QDateEdit不是特别好做&#xff0c;如果直接获取QDateEdit中的QLineEdti并设置显示删除按钮&#xff08;代码如下所示&#xff09;&#xff0c;删除按钮会一直显示&#xff0c;效果并不好&…

SIP 消息的路由和 7 个相关的 Header IMS-HSS 中的透明数据及非透明数据(VoNR、VoLTE均用)

目录 1. SIP 消息的路由和 7 个相关的 Header 1.1 SIP 消息路由相关的7个Header 1.2 理解 Record-Route 和 Route 1.3 Record-Route 和 Route 流程举例 1.4 SIP 请求消息的路由原则 1.5 SIP 请求消息路由举例 1.6 SIP 请求消息路由原则和流程举例 2. IMS-HSS 中的透明数…

【C++指南】命名空间

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 目录 一、命名空间的重要性 1. C语言中没有命名空间而存在的问题 2. C引入了命名空间解决的问题 3.…

【论文速读】《LLM4CP: Adapting Large Language Models for Channel Prediction》

论文地址&#xff1a; https://ieeexplore.ieee.org/document/10582829 前言&#xff1a;之前就想&#xff0c;大语言模型是否可以通过微调用于通信系统的无线空口应用&#xff0c;这篇文章给出了答案。通过讲信道状态信息进行嵌入和注意力操作&#xff0c;变成大语言模型可以…

Map和Set及哈希--的奥秘(详解)

目录&#xff1a; 一 搜索树&#xff1a; 二. 搜索相关概念 三.Map 的说明 四. Set 的说明 五.哈希表: 一 搜索树&#xff1a; 1.概念&#xff1a; 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: (1). 若它的左子树不为空&a…

常见中间件漏洞复现之【Jboss】!

Jboss介绍 JBoss是⼀个基于J2EE的开发源代码的应⽤服务器。JBoss代码遵循LGPL许可&#xff0c;可以在任何商业应⽤中免费使⽤。JBoss是⼀个管理EJB的容器和服务器&#xff0c;⽀持EJB1.1、EJB 2.0和EJB3的规范。但JBoss核⼼服务不包括⽀持servlet/JSP的WEB容器&#xff0c;⼀般…

61 函数参数——可变长度参数

可变长度参数在定义函数时主要有两种形式&#xff1a;*parameter 和 **parameter&#xff0c;前者主要用来接收任意多个实参并将其放在一个元组中&#xff0c;后者接收类似于关键参数一样显示赋值形式的多个实参并将其放入字典中。 # 无论调用该函数时传递了多少实参&#xff…

鸿蒙Harmony开发:onFrame逐帧回调规范

通过返回应用onFrame逐帧回调的方式&#xff0c;让开发者在应用侧的每一帧都可以设置属性值&#xff0c;从而实现设置了该属性值对应组件的动画效果。 使用animator实现动画效果 使用如下步骤可以创建一个简单的animator&#xff0c;并且在每个帧回调中打印当前插值。 引入相…

萌新的Java入门日记18

一、mybatis范围筛选 1.第一种表示方法 <!--resultType 查出来的结果自贡每一行都要映射到该类型的对象--><select id"getStaff" resultType"com.easy.bean.Staff">select * from staff<!--根据参数不同组合出不同的SQL语句 动态SQL语句…

java之IO篇——工具包Commons-io和Hutool

前言 结束了IO篇的File、基本流和高级流。还要认识IO流的一些工具包Commons-io和hutool&#xff0c;不算是框架&#xff0c;但是非常实用。 目录 前言 一、Commons-io 1.来历及作用 2.使用 二、Hutool 1.简介 2.使用 一、Commons-io 1.来历及作用 Commons-io是apache…

C++第七篇 模板初阶和STL简介

目录 一&#xff0c;模板初阶 1.泛型编程 2.函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 3.类模板(模板类&#xff0c;模板函数) 3.1 类模板定义格式 二&#xff0c;STL简介 1. 什么是STL 2. ST…

【JUC】并发编程与源码分析 1-7章

1 线程基础知识复习 1把锁&#xff1a;synchronized&#xff08;后面细讲&#xff09; 2个并&#xff1a; 并发&#xff08;concurrent&#xff09;&#xff1a;是在同一实体上的多个事件&#xff0c;是在一台机器上“同时”处理多个任务&#xff0c;同一时刻&#xff0c;其…

【学习笔记】A2X通信的协议(三)- A2X PC5通信(一)

目录 6. A2X通信 6.1 A2X PC5通信 6.1.1 一般说明 6.1.2 通过NR-PC5的单播模式A2X通信 6.1.2.1 概述 6.1.2.2 A2X PC5单播链路建立程序 6.1.2.2.1 一般说明 6.1.2.2.2 发起UE启动A2X PC5单播链路建立程序 6.1.2.2.3 目标UE接受的A2X PC5单播链路建立程序 6.1.2.2.5 目…

学单片机怎么在3-5个月内找到工作?

每个初学者&#xff0c;都如履薄冰&#xff0c;10几年前&#xff0c;我自学单片机时&#xff0c;也一样。 想通过学习&#xff0c;找一份体面点的工作&#xff0c;又害怕辛辛苦苦学出来&#xff0c;找不到工作。 好在&#xff0c;当初执行力&#xff0c;还算可以&#xff0c;自…