技术栈入门------ElasticSearch
创始人
2024-05-26 10:59:37
0

使用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.2http://192.168.56.10:9200 一定改为自己虚拟机的地址

二、整合SpringBoot

1、导入Elasticsearch客户端的依赖

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

1.87.4.22021.0.0
org.elasticsearch.clientelasticsearch-rest-high-level-client7.4.2

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();}@Beanpublic 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管理的上架功能@Overridepublic void up(Long spuId) {//查找出spuId对应的所有sku对象List skuInfoEntities = skuInfoService.getSkusBySpuId(spuId);//查出当前sku的所有可以被用来检索的规格属性List productAttrValueEntities = attrValueService.baseAttrlistforspu(spuId);List attrIds = productAttrValueEntities.stream().map(attr -> {return attr.getAttrId();}).collect(Collectors.toList());
/*        //在批量规格参数attrids找到具有检索属性的规格参数的id集List sarchAttrIds = attrService.selectSearchAttrsIds(attrIds);*/Set idSet = new HashSet<>(attrIds);//找到符合要求的数据List attrsList = productAttrValueEntities.stream().filter(item -> {//下面返回的是Listreturn idSet.contains(item.getAttrId());}).map(item -> {//把上面过滤的List对象转为ListSkuEsModel.Attrs attrs = new SkuEsModel.Attrs();BeanUtils.copyProperties(item, attrs);return attrs;}).collect(Collectors.toList());//发送远程调用,库存服务查询是否有库存//获取skuIds集合List skuIdList = skuInfoEntities.stream().map(SkuInfoEntity::getSkuId).collect(Collectors.toList());Map stockMap =null;//进行异常处理(因为远程调用可能因为网络问题导致失败,进行异常处理就不会影响下面的代码运行)try{//远程调用仓库接口R r = wareFeignService.getSkusHasStock(skuIdList);TypeReference> typeReference = new TypeReference>() {};//获取返回R中的数据并封装成mapstockMap = r.getData(typeReference).stream().collect(Collectors.toMap(SkuHasStockVo::getSkuId, item -> item.getHasStock()));} catch (Exception e) {log.error("库存服务查询异常:原因{}",e);}Map finalStockMap =stockMap;List 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-searchR 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、重复调用?接口幂等性:重试机制}}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...