Spring Boot 学习笔记 8 : Elasticsearch
最近项目有个新的需求:记录现场某一台设备在每个时间点的运行状态,并可以通过前端页面操作将记录导出成Excel表格。关于设备数据的读写考虑过使用 MongoDB 和 Elasticsearch 两种数据库,考虑到数据量的大小和水平扩展决定尝试使用 Elasticsearch。
在Windows上安装Elasticsearch
从官网下载 6.0.0 版本的Zip安装包并解压到 D:\elasticsearch-6.0.0 路径下。
进入 D:\elasticsearch-6.0.0\bin 目录下运行 elasticsearch.bat 文件。
启动成功后会在安装路径下自动创建 data 和 logs 目录存放数据和日志。访问 http://localhost:9200/ 可以看到返回的 Json 对象。
安装 Elasticsearch-head 插件。使用命令行进入 D:\elasticsearch-6.0.0\bin 目录下,运行如下命令:
plugin install mobz/elasticsearch-head
返回提示‘plugin‘不是内部或外部命令,也不是可运行的程序或批处理文件。
查看bin目录发现只有 elasticsearch-plugin.bat 批处理文件。
于是运行如下命令(适合 elasticsearch-2.4.0 等低版本 ):
elasticsearch-plugin install mobz/elasticsearch-head
返回提示 Unknown plugin mobz/elasticsearch-head。
无奈只好使用 Git 配合 Node.js 的方式来下载和安装 Elasticsearch-head 插件。
访问 head 插件在 Github 上的项目地址 点击这里。
使用命令行进入 head 插件安装目录 D:\elasticsearch-6.0.0\plugins\elasticsearch-head,运行如下命令:
npm install
安装成功后,启动 Elasticsearch-head 插件:
启动成功后,访问 http://localhost:9100/(或者 http://127.0.0.1:9200/_plugin/head/ 适合 elasticsearch-2.4.0 等低版本)可以看到如下的操作界面:
注册 Elasticsearch 服务
使用命令行进入 D:\elasticsearch-6.0.0\bin 目录下运行如下命令:
elasticsearch-service install
低版本 Elasticsearch-2.4.0 则使用如下命令:
service.bat install
启动 Elasticsearch 服务,
elasticsearch-service start
使用管理员身份启动服务失败:
使用服务列表启动服务失败:
起初怀疑是 JDK 环境配置路径不正确,运行如下命令:
elasticsearch-service manager
管理 Elasticsearch 配置属性:
后来查看错误日志:
发现错误原因是将从 git 下载的 head 插件放到了 elasticsearch6.0.0 的 plugin 目录下,于是更换路径为 D:\elasticsearch-6.0.0\elasticsearch-head。重新安装和启动服务后成功。
停止 Elasticsearch 服务
elasticsearch-service stop
注销 Elasticsearch 服务
elasticsearch-service remove
参考资料:
Windows 下安装 ElasticSearch & ElasticSearch head
安装elasticsearch5.5遇到的问题记录
由于项目时间原因暂时先更新到这里,未完待续。
好,前度刘郎今又来,我接着上面讲。
elasticsearch-head插件连接不上es,显示集群健康值: 未连接
解决方法:
- 修改 Elasticsearch 配置文件 config/elasticsearch.yml,添加如下配置:
- 修改 elasticsearch-head 目录下 Gruntfile.js 文件,添加如下配置:
可能是浏览器不支持,更换火狐浏览器试试。
可能是Elasticsearch安装版本问题,6.0.0 版本尝试以上方法后问题依然存在,而换成 2.4.0 版本问题得到解决,比较莫名其妙,如果有大神知道问题原因还望不吝赐教。
参考资料:
elasticsearch5.0中head连不上es,集群健康值: 未连接
在 SpringBoot 中使用 Elasticsearch
项目使用的 SpringBoot 版本是1.5.6发布版。
在 pom.xml 文件中添加 maven 依赖:
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-elasticsearch --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
在 application.properties 文件中添加配置:
spring.data.elasticsearch.repositories.enabled=true spring.data.elasticsearch.cluster-name=elasticsearch spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300 spring.data.elasticsearch.properties.ip=127.0.0.1 spring.data.elasticsearch.properties.port=9300
需要注意的是 ip 和 port 对应的是 Elasticsearch 安装服务器的 IP 和端口号。而 cluster-name 和 cluster-nodes 必须对应 elasticsearch\config 目录下 elasticsearch.yml 配置文件中的 cluster 和 node 配置。
否则会抛出异常:
另外可以在 elasticsearch.yml 配置文件中添加如下配置:
编写实体类
package *.*.*.domain;import *.*.*.domain.enumeration.VehicleStatus; import *.*.*.domain.enumeration.VehicleType; import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document;import java.io.Serializable;@Data //@EqualsAndHashCode(callSuper = true) //需要在实体类@Document注解中设置indexName和type,indexName和type都必须小写 @Document(indexName = "smileorsilence", type = "vehicle") public class VehicleLog /*extends ElasticsearchLog*/ implements Serializable {@Id // @Fieldprivate String ip;private String name;private String location;private Integer energy;private VehicleType vehicleType;private VehicleStatus vehicleStatus;private String movement;public VehicleLog(String ip, String name, VehicleType vehicleType) { // super();this.ip = ip;this.name = name;this.vehicleType = vehicleType;} }
需要注意的是实体类中不能使用 _id 或者 _uid 这样的字段,否则会抛出 MapperParsingException 异常。
且实体类的 id 属性或者 @Id 注解必须存在其一,否则会抛出 IllegalArgumentException 异常。
编写 ElasticsearchConfiguration 配置类
package *.*.*.config.elasticsearch;import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import org.elasticsearch.client.Client; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.data.elasticsearch.core.EntityMapper; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;import java.io.IOException; import java.net.InetSocketAddress;@Configuration public class ElasticsearchConfiguration {@Beanpublic Client client() {Settings settings = Settings.settingsBuilder().put("cluster.name", "elasticsearch").put("node.name", "127.0.0.1:9300").put("client.transport.ping_timeout", "30s").build();Client client = new TransportClient.Builder().settings(settings).build().addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress("127.0.0.1", 9300)));return client;}@Beanpublic ElasticsearchTemplate elasticsearchTemplate(Client client, Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder) {return new ElasticsearchTemplate(client, new CustomEntityMapper(jackson2ObjectMapperBuilder.createXmlMapper(false).build()));}public class CustomEntityMapper implements EntityMapper {private ObjectMapper objectMapper;public CustomEntityMapper(ObjectMapper objectMapper) {this.objectMapper = objectMapper;objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);}@Overridepublic String mapToString(Object object) throws IOException {return objectMapper.writeValueAsString(object);}@Overridepublic <T> T mapToObject(String source, Class<T> clazz) throws IOException {return objectMapper.readValue(source, clazz);}} }
时间比较有限,配置从简。
编写 Repository
package *.*.*.repository.elasticsearch;import *.*.*.domain.elasticsearch.VehicleLog; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.stereotype.Repository;import java.util.List;/*** @author smileorsilence* @date 2018/05/30*/ @Repository public interface VehicleRepository extends ElasticsearchRepository<VehicleLog, String> {List<VehicleLog> findAllByIp(String ip);}
编写 Service
package *.*.*.service;import *.*.*.domain.VehicleLog; import *.*.*.domain.enumeration.VehicleType; import *.*.*.repository.elasticsearch.VehicleRepository; import *.*.*.service.dto.VehicleDTO; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service;import javax.inject.Inject; import java.util.List; import java.util.stream.Collectors;/*** @author smileorsilence* @date 2018/05/16*/ @Slf4j @Service public class VehicleService {@Injectprivate VehicleRepository vehicleRepository;@Injectprivate RedisService redisService;public void saveVehicleLog() {VehicleLog vehicleLog = new VehicleLog("192.168.20.86", "Vehicle-2-1-1", VehicleType.VEHICLE);vehicleRepository.save(vehicleLog);log.info("saveVehicleLog");}public List<VehicleDTO> selectAllVehicleLogByIp() {List<VehicleDTO> vehicleDTOList = vehicleRepository.findAllByIp("192.168.20.86").stream().map(vl -> new VehicleDTO(vl)).collect(Collectors.toList());log.info("selectAllVehicleLogByIp, vehicleDTOList : {}", vehicleDTOList);return vehicleDTOList;}}
编写 Test
package *.*.*.service;import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import javax.inject.Inject;/*** @author smileorsilence* @date 2018/05/30*/ @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest public class VehicleServiceTest {@Injectprivate VehicleService vehicleService;@Testpublic void saveVehicleLog() throws Exception {vehicleService.saveVehicleLog();}@Testpublic void selectAllVehicleLogByIp() throws Exception {vehicleService.selectAllVehicleLogByIp();}}
运行测试类后抛出异常:
有些不明所以,在网上搜索技术博客寻找原因,看了几篇后觉得不是配置问题,而可能是 maven 依赖版本不支持 Elasticsearch 安装版本所导致。于是查看 Elasticsearch 安装目录下 elasticsearch-service-x64-stdout.2018-05-30.log 日志,发现异常:
java.lang.IllegalStateException: Received message from unsupported version: [2.0.0] minimal compatible version is: [5.6.0]
于是选择重新安装低版本的 Elasticsearch 2.4.0,并重新配置 elasticsearch.yml 文件。
运行 saveVehicleLog 测试方法
运行 selectAllVehicleLogByIp测试方法,抛出异常
判断是由于 VehicleLog 实体类缺少无参的构造方法所导致,添加上以后解决异常:
到此,SpringBoot 集成 Elasticsearch 执行基本的添加和查询操作已经完成,后面更详细的内容有时间将会继续介绍。
在Linux上安装Elasticsearch
首先我是通过 FileZilla 这款 FTP 传输软件将 elasticsearch-2.4.0 版本的 tar 包拷贝到 Linux 系统上 /home/elasticsearch 目录下。注意不能是 root 目录下。
使用 cd 命令进入 /home/elasticsearch 目录下,使用如下命令解压文件。
$ tar -vxf elasticsearch-2.4.0.tar.gz
修改 elasticsearch.yml 配置文件。
$ vim elasticsearch-2.4.0/config/elasticsearch.yml
使用 :wq 保存并退出,使用 cat 命令查看配置。
elasticsearch 不能以 root 用户身份启动,可以使用如下命令。
$ adduser esuser $ chown -R esuser elasticsearch-2.4.0 $ su esuser $ chmod 777 elasticsearch-2.4.0
后台启动 elasticsearch 。
$ ./bin/elasticsearch -d
查看 elasticsearch 是否已经启动。
$ ps aux|grep elasticsearch
安装 elasticsearch-head 插件,进入 elasticsearchbi-2.4.0/bin 目录后,执行如下命令:
./plugin install mobz/elasticsearch-head
穿林打叶过程轰轰烈烈,花开花落一路上起起跌跌。
Spring Boot 学习笔记 8 : Elasticsearch相关推荐
- Spring Boot学习笔记-进阶(3)
文章目录 Spring Boot学习笔记-进阶(3) 一.Spring Boot与缓存 二.Spring Boot与消息 三.Spring Boot与检索 四.Spring Boot与任务 异步任务 ...
- Spring Boot学习笔记-基础(2)
Spring Boot学习笔记-基础(2) Spring Boot 优点: – 快速创建独立运行的Spring项目以及与主流框架集成 – 使用嵌入式的Servlet容器,应用无需打成WAR包 – st ...
- Spring Boot学习笔记-实践建言
2019独角兽企业重金招聘Python工程师标准>>> 本文延续<Spring Boot学习笔记-快速示例>,从开发指南中摘出一些实践经验可供参考.这也是笔者看到的眼前一 ...
- Spring Boot学习笔记(1)
文章目录 Spring Boot学习笔记(1) Spring Boot 整合 JSP Spring Boot HTML Thymeleaf 常用语法 Spring Boot 数据校验 Spring B ...
- Vue + Spring Boot 学习笔记02:引入数据库实现用户登录功能
Vue + Spring Boot 学习笔记02:引入数据库实现用户登录功能 在学习笔记01里,我们利用跨域打通了前端的Vue与后端的Spring Boot,实现了用户登录功能,但是后台的登录控制器在 ...
- Vue + Spring Boot 学习笔记01:实现用户登录功能
Vue + Spring Boot 学习笔记01:实现用户登录功能 一.创建后端Spring Boot项目Book Management 二.创建前端Vue项目bm-vue 三.修改后端项目Book ...
- 超赞:不愧是阿里内部“Spring boot学习笔记”从头到尾,全是精华
spring boot为何会出现? 随着动态语言的流行(Ruby.Groovy. Scala. Node.js),Java 的开发显得格外的笨重:繁多的配置.低下的开发效率.复杂的部署流程以及第三方技 ...
- Spring Boot学习笔记 [完结]
Spring Boot 文章目录 Spring Boot 1.微服务 1.1 什么是微服务? 1.2 单体应用架构 1.3 微服务架构 2. 第一个SpringBoot程序 2.1.原理 2.2 原理 ...
- Spring Boot 学习笔记--整合Thymeleaf
1.新建Spring Boot项目 添加spring-boot-starter-thymeleaf依赖 1 <dependency> 2 <groupId>org.spring ...
最新文章
- webdriver Google-chrome crashed
- 推荐10个能带来快感的实用windows软件,好评如潮!
- CNN可视化又添新作,南大开源Group-CAM:高效的显著图生成方法|CVPR2021
- Java进阶书籍推荐,赶快收藏起来!
- Mybatis高级-resultMap之collection聚集
- Android的快速开发框架 afinal
- paip.验证码识别---初始化
- 复制含有随机指针节点的链表
- 《程序员面试宝典》.pdf
- vc语言c1083错误,VC Fatal Error C1083的几种解决方案
- 曙光服务器怎么进入bios_怎么进入bios,教您怎么进入bios
- 用函数统计各分数段人数c语言,如何使用Excel函数统计各或分数段的人数(五种方法).doc...
- 中国银行理财产品市场运行态势及投资风险透析报告2021-2027年
- 安卓开发无线连接设备进行调试(adb)
- 每日新闻 | 华为首款5G手机今日正式开卖
- 一篇文章让你搞懂Java中的静态代理和动态代理
- 汽车发动机扭矩,转速,功率
- S5PV210时钟详解
- 解决EXCEL中选中单元格右键被屏蔽的问题
- 11_JavaScript基础入门(1)