技术栈入门------ElasticSearch

news2024/11/23 11:07:40

使用ElasticSearch的准备工作

一、在Linux上安装ElasticSearch

1、docker下载elasticSearch和kibana的镜像

docker pull elasticsearch:7.4.2 存储和检索数据
docker pull kibana:7.4.2 可视化检索数据

2、创建目录

mkdir -p /mydata/elasticsearch/config 
mkdir -p /mydata/elasticsearch/data 
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml

3、启动并挂载Elasticsearch

chmod -R 777 /mydata/elasticsearch/ 保证权限 
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \ -e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx1024m" \ 
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ 
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \ 
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \ 
-d elasticsearch:7.4.2

特别注意: -e ES_JAVA_OPTS="-Xms64m -Xmx256m" \ 
测试环境下,设置 ES 的初始内存和最大内存,否则导 致过大启动不了 ES

4、启动kibana

docker run --name kibana -e ELASTICSEARCH_HOSTS=http://虚拟机Linux的ip地址:9200 -p 5601:5601 \ -d kibana:7.4.2

http://192.168.56.10:9200 一定改为自己虚拟机的地址

二、整合SpringBoot

1、导入Elasticsearch客户端的依赖

注意这里的<elasticsearch.version>7.4.2</elasticsearch.version>要写成和自己Linux的elasticsearch版本,如果不写这句那就用的是SpringBoot默认的版本,然后上面的linux中的elasticSearch和kibana版本最好保持一致性

<properties>
  <java.version>1.8</java.version>
  <elasticsearch.version>7.4.2</elasticsearch.version>
  <spring-cloud.version>2021.0.0</spring-cloud.version>
</properties>

<dependency>
  <groupId>org.elasticsearch.client</groupId>
  <artifactId>elasticsearch-rest-high-level-client</artifactId>
  <version>7.4.2</version>
</dependency>

2、ElasticSearch的配置类

package com.saodai.saodaimall.search.config;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
* ElasticSearch的配置类
**/
@Configuration
public class SaodaimallElasticSearchConfig {
    public static final RequestOptions COMMON_OPTIONS;
    static {
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
        // builder.addHeader("Authorization", "Bearer " + TOKEN);
        // builder.setHttpAsyncResponseConsumerFactory(
        //         new HttpAsyncResponseConsumerFactory
        //                 .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
        COMMON_OPTIONS = builder.build();
    }
    
    
    @Bean
    public RestHighLevelClient esRestClient(){
        RestClientBuilder builder = null;
        builder = RestClient.builder(new HttpHost("192.168.241.128", 9200, "http"));
        RestHighLevelClient client = new RestHighLevelClient(builder);
        return  client;
    }
    
    
}

本商城项目哪里用到了ElasticSearch

商品服务

商品服务的商品上架功能就是把上架的商品的所有信息存到ElasticSearch

1、在Vscode中发送上架请求

2、商品服务的SpuInfoController来处理请求/{spuId}/up

/**
     * 商品维护的spu管理的上架功能
     */
    @PostMapping("/{spuId}/up")
    public R spuUp(@PathVariable("spuId") Long spuId){
        spuInfoService.up(spuId);
        return R.ok();
    }

分流程:

(1)查找出spuId对应的所有sku对象

(2)查出当前sku的所有可以被用来检索的规格属性

  //商品维护的spu管理的上架功能
    @Override
    public void up(Long spuId) {
        //查找出spuId对应的所有sku对象
        List<SkuInfoEntity> skuInfoEntities = skuInfoService.getSkusBySpuId(spuId);
        //查出当前sku的所有可以被用来检索的规格属性
        List<ProductAttrValueEntity> productAttrValueEntities = attrValueService.baseAttrlistforspu(spuId);
        List<Long> attrIds = productAttrValueEntities.stream().map(attr -> {
            return attr.getAttrId();
        }).collect(Collectors.toList());
/*        //在批量规格参数attrids找到具有检索属性的规格参数的id集
        List<Long> sarchAttrIds = attrService.selectSearchAttrsIds(attrIds);*/
        Set<Long> idSet = new HashSet<>(attrIds);
        //找到符合要求的数据
        List<SkuEsModel.Attrs> attrsList = productAttrValueEntities.stream().filter(item -> {
            //下面返回的是List<ProductAttrValueEntity>
            return idSet.contains(item.getAttrId());
        }).map(item -> {
            //把上面过滤的List<ProductAttrValueEntity>对象转为List<SkuEsModel.Attrs>
            SkuEsModel.Attrs attrs = new SkuEsModel.Attrs();
            BeanUtils.copyProperties(item, attrs);
            return attrs;
        }).collect(Collectors.toList());

        //发送远程调用,库存服务查询是否有库存
          //获取skuIds集合
        List<Long> skuIdList = skuInfoEntities.stream().map(SkuInfoEntity::getSkuId).collect(Collectors.toList());

        Map<Long, Boolean> stockMap =null;
        //进行异常处理(因为远程调用可能因为网络问题导致失败,进行异常处理就不会影响下面的代码运行)
        try{
            //远程调用仓库接口
            R r = wareFeignService.getSkusHasStock(skuIdList);
            TypeReference<List<SkuHasStockVo>> typeReference = new TypeReference<List<SkuHasStockVo>>() {};
            //获取返回R中的数据并封装成map<skuId,HasStock>
            stockMap = r.getData(typeReference).stream().collect(Collectors.toMap(SkuHasStockVo::getSkuId, item -> item.getHasStock()));
        } catch (Exception e) {
            log.error("库存服务查询异常:原因{}",e);
        }

        Map<Long, Boolean> finalStockMap =stockMap;
        List<SkuEsModel> collect = skuInfoEntities.stream().map(skuInfoEntity -> {
            //组装需要的数据
            SkuEsModel skuEsModel = new SkuEsModel();
            BeanUtils.copyProperties(skuInfoEntity,skuEsModel);
            skuEsModel.setSkuPrice(skuInfoEntity.getPrice());
            skuEsModel.setSkuImg(skuInfoEntity.getSkuDefaultImg());
            //hasStock,hotScore
            //设置库存信息
            if (finalStockMap == null) {
                skuEsModel.setHasStock(true);
            } else {
                skuEsModel.setHasStock(finalStockMap.get(skuInfoEntity.getSkuId()));
            }


            //热度评分
            //查询品牌和分类的名称信息
            BrandEntity brandEntity = brandService.getById(skuInfoEntity.getBrandId());
            skuEsModel.setBrandName(brandEntity.getName());
            skuEsModel.setBrandId(brandEntity.getBrandId());
            skuEsModel.setBrandImg(brandEntity.getLogo());

            CategoryEntity categoryEntity = categoryService.getById(skuInfoEntity.getCatalogId());
            skuEsModel.setCatalogId(categoryEntity.getCatId());
            skuEsModel.setCatalogName(categoryEntity.getName());

            //设置可以检索的规格参数
            skuEsModel.setAttrs(attrsList);
            return skuEsModel;

        }).collect(Collectors.toList());

        //TODO 5、远程调用将数据发给es进行保存:saodaimall-search
        R r = searchFeginService.productStatusUp(collect);

        if (r.getCode() == 0) {
            //远程调用成功
            //TODO 6、修改当前spu的状态
            System.out.println("远程调成功!");
            this.baseMapper.updaSpuStatus(spuId, ProductConstant.ProductStatusEnum.SPU_UP.getCode());
        } else {
            //远程调用失败
            //TODO 7、重复调用?接口幂等性:重试机制
        }
    }

 

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

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

相关文章

[含文档+源码等]微信小程序校园生活小助手+后台管理系统前后分离VUE[包运行成功]

博主介绍&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 [含文档源码等]微信小程序校园生活小助手后台管理系统前后分离VUE[包运行成功] 演示视频 视频去哪了呢&#xff1f;_哔哩哔哩_bilibili 系统介绍 本系…

简单对比一下VRRP和策略路由之间主备切换的差异

前面我们介绍的VRRP&#xff08;&#xff09;&#xff0c;两台设备之间处于主备关系&#xff0c;也就是说&#xff0c;当主设备故障之后&#xff0c;流量才会切换到备设备上。这种使用方式一定程度上讲&#xff0c;不太符合经济适用的原则&#xff0c;我们前面介绍过链路聚合&a…

Java面试--SpringMVC请求流程

用户发送请求&#xff0c;请求被 SpringMVC 前端控制器&#xff08;DispatherServlet&#xff09;捕获&#xff1b;前端控制器&#xff08;DispatherServlet&#xff09;对请求 URL 解析获取请求 URI&#xff0c;根据 URI&#xff0c;调用 HandlerMapping&#xff1b;前端控制器…

求最长递增子序列

题目&#xff1a; 给定数组arr&#xff0c;返回arr的最长递增子序列 举例&#xff1a; arr [2,1,5,3,6,4,8,9,7] 返回最长递增子序列为 [1,3,4,8,9] 方法一&#xff1a;复杂度为O&#xff08;N^2&#xff09; 1. 生成长度为N的数组 dp&#xff0c;dp[i] 表示以arr[i] 这…

架构师必读 —— 逻辑模型(8)

利用框架整理信息 框架用于明确“整体结构”&#xff0c;也指“通过MECE分析法将整体构成要素进行大分类”。重要的是框架应是MECE分析框架&#xff0c;因为 一旦有遗漏和重复&#xff0c;就会导致混乱。整体构成要素可大致分为 3~7大类。 建议先确认目的后思考框架&#x…

实时单目追踪和稠密建图的算法框架:TANDEM算法

01 概述 最近在研究TANDEM算法&#xff0c;是一个实时单目追踪和稠密建图的算法框架。TANDEM的算法框架可以概括为如下的几个部分&#xff1a; 1、位姿计算----在关键帧实施基于滑窗的像素级集束优化&#xff1b; 2、追踪前端----实施直接稠密图片配准&#xff0c;基于全局模…

如何找回电脑回收站删除的文件, 10种恢复工具方法!

你想取回你的回收站删除的文件吗&#xff1f;无论是图像、视频还是文档&#xff0c;我们的设备都会存储所有内容。您可能不小心删除了数据&#xff0c;或者由于其他原因而消失了。要恢复您的文件&#xff0c;您可以访问技术人员或下载任何最好的文件恢复软件。 如果您选择第二…

怎样把电脑D盘合并到c盘?相邻的分区怎么合并到C盘

因为C盘是重要的系统盘&#xff0c;系统用户设置文件夹&#xff0c;包括各个用户的文档、收藏夹、上网浏览信息、配置文件&#xff0c;不能随意删除。如果C盘空间不足&#xff0c;就会影响到电脑的整体运行速率&#xff0c;会导致电脑卡顿&#xff0c;要想彻底地解决这种情况&a…

HTML期末作业课程设计期末大作业——电影网页制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

PHP序列化和反序列化漏洞学习

目录 PHP基础知识&#xff1a; 类的结构&#xff1a; 序列化 反序列化 魔术方法 字符串逃逸 PHP基础知识&#xff1a; 类的结构&#xff1a; 常见访问权限修饰符&#xff1a; public:公共的&#xff0c;在类的内部、子类中或者类的外部都可以使用&#xff0c;不受限制;p…

【GO】 K8s 管理系统项目[API部分--Daemonset]

K8s 管理系统项目[API部分–Daemonset] 1. 接口实现 service/dataselector.go // daemonCell type daemonSetCell appsv1.DaemonSetfunc(d daemonSetCell) GetCreation() time.Time {return d.CreationTimestamp.Time }func(d daemonSetCell) GetName() string {return d.Na…

高性能的Java IDE——IntelliJ IDEA v2022.3全新发布

IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 I…

怎样在电脑上录制ppt课件?如何录制课件讲解视频

怎样在电脑上录制ppt课件&#xff1f;在当前的环境下&#xff0c;大部分学生都是在家进行上网课&#xff0c;本文就给大家分享几款非常简单实用的录制教学视频的工具。 一、PPT录屏 在windows系统中有个常用软件就是ppt&#xff0c;ppt也能够录屏&#xff0c;只是我们大家都忽…

postgresql数据库流复制

primary和standby在同一服务器的不同目录下。 primary: /var/postgre/data standby: /var/postgre/data1 1. 加账号 (也可以使用postgres账号) [postgresv-vlxsz-devdb01 data]$ psql psql (14.1) Type "help" for help. postgres# create role replica with r…

自动化制药设备中PLC如何进行远程监控?有何应用场景

随着科学技术水平的不断提高&#xff0c;制药设备也逐步走向自动化。自动化制药设备实现到精确的位置定位&#xff0c;实时的过程监控&#xff0c;快速的网络通讯&#xff0c;在到现场的每个动作的执行&#xff0c;具备高效率的生产特点。PLC作为现在工业设备控制系统的核心&am…

php-fpm 的状态查看和php-fpm 调优随笔

php-fpm status 配置 1. 找到php-fpm的配置文件&#xff0c;将 pm.status_path /status 注释去掉 重启php-fpm 2. 在nginx 中配置一个server块或者配置一个location 3. 最后通过curl 或者 http 请求可以看到php-fpm 的状态 可以带着参数访问&#xff0c;json、xml、html fu…

Android -- 每日一问:在项目中使用AsyncTask会有什么问题吗?

经典回答 那我们考查 AsyncTask 会问些什么呢&#xff1f;得先问问会不会用吧&#xff0c;看看知不知道有 onProgressUpdate 方法。 其次问一下是怎么理解 AsyncTask 的机制&#xff0c;有没有看过它的源代码&#xff1f; 这个问题主要看对方是否对 Android 的东西有好奇心&am…

夜天之书 #69 企业开源该选什么软件许可证?

开源软件和自由软件的概念与其许可证紧密绑定。通常&#xff0c;开源软件被定义为使用 OSI 认可的&#xff0c;即符合开源定义[1]的许可证来分发的软件&#xff0c;而自由软件被定义成使用 GPL 或说 Copyleft 式许可证分发的软件。尽管今天人们最关心的可能是软件的生产过程即如…

通过展开序列ISTA(SISTA)算法创建的递归神经网络(RNN)(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 递归神经网络&#xff08;recursive neural network&#xff09;是具有树状阶层结构且网络节点按其连接顺序对输入信息进行递归…

element表格去除border边框同时有竖直方向的边框

为什么要去除boder边框&#xff0c;原因是boder的边框与页面的背景色相同&#xff0c;然后显得表格内凹了一个像素 要实现的需求是表格去除border边框同时添加竖直方向的边框 但是如果不添加boder属性&#xff0c;表格则没有竖直方向的边框 这种下无内凹&#xff0c;但是显得…