SpringBoot集成ElasticSearch(ES)

ElasticSearch环境搭建

采用docker-compose搭建,具体配置如下:


version: '3'# 网桥es -> 方便相互通讯
networks:es:services:elasticsearch:image: registry.cn-hangzhou.aliyuncs.com/zhengqing/elasticsearch:7.14.1      # 原镜像`elasticsearch:7.14.1`container_name: elasticsearch             # 容器名为'elasticsearch'restart: unless-stopped                           # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器volumes:                                  # 数据卷挂载路径设置,将本机目录映射到容器目录- "./elasticsearch/data:/usr/share/elasticsearch/data"- "./elasticsearch/logs:/usr/share/elasticsearch/logs"- "./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml"
#      - "./elasticsearch/config/jvm.options:/usr/share/elasticsearch/config/jvm.options"- "./elasticsearch/plugins/ik:/usr/share/elasticsearch/plugins/ik" # IK中文分词插件environment:                              # 设置环境变量,相当于docker run命令中的-eTZ: Asia/ShanghaiLANG: en_US.UTF-8TAKE_FILE_OWNERSHIP: "true"  # 权限discovery.type: single-nodeES_JAVA_OPTS: "-Xmx512m -Xms512m"#ELASTIC_PASSWORD: "123456" # elastic账号密码ports:- "9200:9200"- "9300:9300"networks:- eskibana:image: registry.cn-hangzhou.aliyuncs.com/zhengqing/kibana:7.14.1       # 原镜像`kibana:7.14.1`container_name: kibanarestart: unless-stoppedvolumes:- ./elasticsearch/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.ymlports:- "5601:5601"depends_on:- elasticsearchlinks:- elasticsearchnetworks:- es

部署

# 运行
docker-compose -f docker-compose-elasticsearch.yml -p elasticsearch up -d
# 运行后,给当前目录下所有文件赋予权限(读、写、执行)
#chmod -R 777 ./elasticsearch

ES访问地址:ip地址:9200 默认账号密码:elastic/123456

kibana访问地址:ip地址:5601/app/dev_tools#/console 默认账号密码:elastic/123456

设置ES密码

# 进入容器
docker exec -it elasticsearch /bin/bash
# 设置密码-随机生成密码
# elasticsearch-setup-passwords auto
# 设置密码-手动设置密码
elasticsearch-setup-passwords interactive
# 访问
curl 127.0.0.1:9200 -u elastic:123456

一、依赖


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springboot-demo</artifactId><groupId>com.et</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>elasticsearch</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>io.projectreactor</groupId><artifactId>reactor-test</artifactId><scope>test</scope></dependency></dependencies></project>

二、配置文件和启动类

# elasticsearch.yml 文件中的 cluster.name
spring.data.elasticsearch.cluster-name=docker-cluster
# elasticsearch 调用地址,多个使用“,”隔开
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
#spring.data.elasticsearch.repositories.enabled=true
#spring.data.elasticsearch.username=elastic
#spring.data.elasticsearch.password=123456
#spring.data.elasticsearch.network.host=0.0.0.0
@SpringBootApplication
public class EssearchApplication {public static void main(String[] args) {SpringApplication.run(EssearchApplication.class, args);}}

三、document实体类

@Ducument(indexName = "orders",type = "product")
@Mapping(mappingPath = "productIndex.json")//解决ik分词不能使用的问题
public class ProductDocument implements Serializable{@Idprivate String id;//@Field(analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")private String productName;//@Field(analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")private String productDesc;private Date createTime;private Date updateTime;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getProductName() {return productName;}public void setProductName(String productName) {this.productName = productName;}public String getProductDesc() {return productDesc;}public void setProductDesc(String productDesc) {this.productDesc = productDesc;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public Date getUpdateTime() {return updateTime;}public void setUpdateTime(Date updateTime) {this.updateTime = updateTime;}
}

四、Service接口以及实现类

public interface EsSearchService extends BaseSearchService<ProductDocument>{//保存void save(ProductDocument... productDocuments);//删除void delete(String id);//清空索引void deleteAll();//根据id查询ProductDocument getById(String id);//查询全部List<ProductDocument> getAll();
}
@Service
public class EsSearchServiceImpl extends BaseSearchServiceImpl<ProductDocument> implements EsSearchService {private Logger log = LoggerFactory.getLogger(getClass());@Resourceprivate ElasticsearchTemplate elasticsearchTemplate;@Resourceprivate ProductDocumentRepository productDocumentRepository;@Overridepublic void save(ProductDocument ... productDocuments) {elasticsearchTemplate.putMapping(ProductDocument.class);if(productDocuments.length > 0){/*Arrays.asList(productDocuments).parallelStream().map(productDocumentRepository::save).forEach(productDocument -> log.info("【保存数据】:{}", JSON.toJSONString(productDocument)));*/log.info("【保存索引】:{}",JSON.toJSONString(productDocumentRepository.saveAll(Arrays.asList(productDocuments))));}}@Overridepublic void delete(String id) {productDocumentRepository.deleteById(id);}@Overridepublic void deleteAll() {productDocumentRepository.deleteAll();}@Overridepublic ProductDocument getById(String id) {return productDocumentRepository.findById(id).get();}@Overridepublic List<ProductDocument> getAll() {List<ProductDocument> list = new ArrayList<>();productDocumentRepository.findAll().forEach(list::add);return list;}
}

五、repository

@Component
public interface ProductDocumentRepository extends ElasticsearchRepository<ProductDocument,String> {
}

productIndex.json

{"properties": {"createTime": {"type": "long"},"productDesc": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_max_word"},"productName": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_max_word"},"updateTime": {"type": "long"}}
}

六、测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class EssearchApplicationTests {private Logger log = LoggerFactory.getLogger(getClass());@Autowiredprivate EsSearchService esSearchService;@Testpublic void save() {log.info("【创建索引前的数据条数】:{}",esSearchService.getAll().size());ProductDocument productDocument = ProductDocumentBuilder.create().addId(System.currentTimeMillis() + "01").addProductName("无印良品 MUJI 基础润肤化妆水").addProductDesc("无印良品 MUJI 基础润肤化妆水 高保湿型 200ml").addCreateTime(new Date()).addUpdateTime(new Date()).builder();ProductDocument productDocument1 = ProductDocumentBuilder.create().addId(System.currentTimeMillis() + "02").addProductName("荣耀 V10 尊享版").addProductDesc("荣耀 V10 尊享版 6GB+128GB 幻夜黑 移动联通电信4G全面屏游戏手机 双卡双待").addCreateTime(new Date()).addUpdateTime(new Date()).builder();ProductDocument productDocument2 = ProductDocumentBuilder.create().addId(System.currentTimeMillis() + "03").addProductName("资生堂(SHISEIDO) 尿素红罐护手霜").addProductDesc("日本进口 资生堂(SHISEIDO) 尿素红罐护手霜 100g/罐 男女通用 深层滋养 改善粗糙").addCreateTime(new Date()).addUpdateTime(new Date()).builder();esSearchService.save(productDocument,productDocument1,productDocument2);log.info("【创建索引ID】:{},{},{}",productDocument.getId(),productDocument1.getId(),productDocument2.getId());log.info("【创建索引后的数据条数】:{}",esSearchService.getAll().size());}@Testpublic void getAll(){esSearchService.getAll().parallelStream().map(JSON::toJSONString).forEach(System.out::println);}@Testpublic void deleteAll() {esSearchService.deleteAll();}@Testpublic void getById() {log.info("【根据ID查询内容】:{}", JSON.toJSONString(esSearchService.getById("154470178213401")));}@Testpublic void query() {log.info("【根据关键字搜索内容】:{}", JSON.toJSONString(esSearchService.query("无印良品荣耀",ProductDocument.class)));}@Testpublic void queryHit() {String keyword = "联通尿素";String indexName = "orders";List<Map<String,Object>> searchHits = esSearchService.queryHit(keyword,indexName,"productName","productDesc");log.info("【根据关键字搜索内容,命中部分高亮,返回内容】:{}", JSON.toJSONString(searchHits));//[{"highlight":{"productDesc":"<span style='color:red'>无印良品</span> MUJI 基础润肤化妆水 高保湿型 200ml","productName":"<span style='color:red'>无印良品</span> MUJI 基础润肤化妆水"},"source":{"productDesc":"无印良品 MUJI 基础润肤化妆水 高保湿型 200ml","createTime":1544755966204,"updateTime":1544755966204,"id":"154475596620401","productName":"无印良品 MUJI 基础润肤化妆水"}},{"highlight":{"productDesc":"<span style='color:red'>荣耀</span> V10 尊享版 6GB+128GB 幻夜黑 移动联通电信4G全面屏游戏手机 双卡双待","productName":"<span style='color:red'>荣耀</span> V10 尊享版"},"source":{"productDesc":"荣耀 V10 尊享版 6GB+128GB 幻夜黑 移动联通电信4G全面屏游戏手机 双卡双待","createTime":1544755966204,"updateTime":1544755966204,"id":"154475596620402","productName":"荣耀 V10 尊享版"}}]}@Testpublic void queryHitByPage() {String keyword = "联通尿素";String indexName = "orders";Page<Map<String,Object>> searchHits = esSearchService.queryHitByPage(1,1,keyword,indexName,"productName","productDesc");log.info("【分页查询,根据关键字搜索内容,命中部分高亮,返回内容】:{}", JSON.toJSONString(searchHits));//[{"highlight":{"productDesc":"<span style='color:red'>无印良品</span> MUJI 基础润肤化妆水 高保湿型 200ml","productName":"<span style='color:red'>无印良品</span> MUJI 基础润肤化妆水"},"source":{"productDesc":"无印良品 MUJI 基础润肤化妆水 高保湿型 200ml","createTime":1544755966204,"updateTime":1544755966204,"id":"154475596620401","productName":"无印良品 MUJI 基础润肤化妆水"}},{"highlight":{"productDesc":"<span style='color:red'>荣耀</span> V10 尊享版 6GB+128GB 幻夜黑 移动联通电信4G全面屏游戏手机 双卡双待","productName":"<span style='color:red'>荣耀</span> V10 尊享版"},"source":{"productDesc":"荣耀 V10 尊享版 6GB+128GB 幻夜黑 移动联通电信4G全面屏游戏手机 双卡双待","createTime":1544755966204,"updateTime":1544755966204,"id":"154475596620402","productName":"荣耀 V10 尊享版"}}]}@Testpublic void deleteIndex() {log.info("【删除索引库】");esSearchService.deleteIndex("orders");}}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UML简述(项目立项、设计、需求整理必备)

UML目录 前言1、UML概述1.1、基本概念1.2、UML图类型说明1.3、UML的41视图 2、UML图详细图示2.1、类图2.2、对象图2.3、组件图2.4、部署图2.5、包图2.6、用例图2.7、状态图2.8、活动图2.9、时序图2.10、通信图&#xff08;协作图&#xff09;2.11、定时图&#xff08;计时图&am…

BurpSuite2024.2.1

1.更新介绍 此版本引入了特定的API 扫描功能&#xff0c;并将 Bambdas 合并到 Logger 捕获过滤器中。我们还改进了 DOM Invader 和 Burp Suite 导航记录器的功能&#xff0c;并进行了许多其他改进和错误修复。 API扫描 我们引入了特定的 API 扫描功能。您现在可以上传 OpenAP…

【PHP】PHP通过串口与硬件通讯,向硬件设备发送数据并接收硬件返回的数据

一、前言 之前写过两篇PHP实现与硬件串口交互的文章&#xff0c;一篇是【PHP】PHP实现与硬件串口交互&#xff0c;接收硬件发送的实时数据&#xff08;上&#xff09;_php串口通信-CSDN博客&#xff0c;另一篇是【PHP】PHP实现与硬件串口交互&#xff0c;向硬件设备发送指令数…

Java开发从入门到精通(一):Java的基础语法进阶

Java大数据开发和安全开发 &#xff08;一&#xff09;Java注释符1.1 单行注释 //1.2 多行注释 /* */1.3 文档注释 /** */1.4 各种注释区别1.5 注释的特点1.5 注释的快捷键 &#xff08;二&#xff09;Java的字面量&#xff08;三&#xff09;Java的变量3.1 认识变量3.2 为什么…

基于Easyexcel实现不同场景的导出功能

基于Easyexcel实现不同场景的导出功能 导出的数据包含有图片 导出excel表格的数据包含有图片&#xff0c;这种场景比较少。通Easyexcel实现这样的需求&#xff0c;我认为最简便的方法就是使用前面提到的自定义转换器&#xff08;com.alibaba.excel.converters.Converter&…

sql 注入 之sqli-labs/less-5 双注入,也称:报错注入

该关卡返回正确或者错误页面,还有错误的代码&#xff0c;所以可以使用报错注入。报错注入的方式&#xff1a; updatexml 函数注入&#xff1a; mysql5.1.5 版本以上支持该函数&#xff0c;返回数据限制32位 模板&#xff1a;select * from user where id1 and (updatexml(&q…

【YOLO v5 v7 v8 v9小目标改进】辅助超推理SAHI:分而治之,解决高分辨率图像中小物体检测的问题

辅助超推理SAHI&#xff1a;分而治之&#xff0c;解决高分辨率图像中小物体检测的问题 设计思路结构小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改YOLO v9 魔改 论文&#xff1a;https://arxiv.org/pdf/2202.06934.pdf 代码&#xff1a;https://github.com/obss/sahi 设计思…

RabbitMQ 交换器

RabbitMQ 交换器 官方例子 http://www.rabbitmq.com/getstarted.html direct 如上图所示&#xff0c;两个队列绑定到了direct交换器上&#xff0c;第一个队列绑定的 binding key 为 orange &#xff0c;第二个队列有两个绑定&#xff0c;分别是 black 和 green 。 如上图所示…

为什么那么多程序员推荐 Linux,是不是在 Linux 下开发效率高?

为什么那么多程序员推荐 Linux&#xff0c;是不是在 Linux 下开发效率高&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux 的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全…

java SSM厂房管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM厂房管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S…

基于el-tree实现懒加载穿梭条

一、关键代码 <template><div><!-- 左侧待选列表 --><div class"left-box"><p>待选列表</p><el-input placeholder"输入关键词过滤" v-model"leftFilterText" clearable/><el-treeref"tree…

电商自动集成端口(API商品接口)上线!轻松用API对接各大电商接口

对卖家阿沸而言&#xff0c;处理订单配送是一项比较复杂的任务&#xff0c;他必须要同时处理大量的来自全球多个渠道和地点的各种SKU订单&#xff0c;还要将库存分开管理&#xff0c;发货时总是搞得手忙脚乱...... 我们知道&#xff0c;正确配送订单对于保持客户满意度和忠诚度…