最近项目有个新的需求:记录现场某一台设备在每个时间点的运行状态,并可以通过前端页面操作将记录导出成Excel表格。关于设备数据的读写考虑过使用 MongoDB 和 Elasticsearch 两种数据库,考虑到数据量的大小和水平扩展决定尝试使用 Elasticsearch。

在Windows上安装Elasticsearch
  1. 从官网下载 6.0.0 版本的Zip安装包并解压到 D:\elasticsearch-6.0.0 路径下。

  2. 进入 D:\elasticsearch-6.0.0\bin 目录下运行 elasticsearch.bat 文件。

    启动成功后会在安装路径下自动创建 data 和 logs 目录存放数据和日志。访问 http://localhost:9200/ 可以看到返回的 Json 对象。

  3. 安装 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 等低版本)可以看到如下的操作界面:

  4. 注册 Elasticsearch 服务

    使用命令行进入 D:\elasticsearch-6.0.0\bin 目录下运行如下命令:

    elasticsearch-service install

    低版本 Elasticsearch-2.4.0 则使用如下命令:

    service.bat install

  5. 启动 Elasticsearch 服务,

    elasticsearch-service start

    使用管理员身份启动服务失败:

    使用服务列表启动服务失败:

    起初怀疑是 JDK 环境配置路径不正确,运行如下命令:

    elasticsearch-service manager

    管理 Elasticsearch 配置属性:

    后来查看错误日志:

    发现错误原因是将从 git 下载的 head 插件放到了 elasticsearch6.0.0 的 plugin 目录下,于是更换路径为 D:\elasticsearch-6.0.0\elasticsearch-head。重新安装和启动服务后成功。

  6. 停止 Elasticsearch 服务

    elasticsearch-service stop
  7. 注销 Elasticsearch 服务

    elasticsearch-service remove

参考资料:

Windows 下安装 ElasticSearch & ElasticSearch head

安装elasticsearch5.5遇到的问题记录

由于项目时间原因暂时先更新到这里,未完待续。


好,前度刘郎今又来,我接着上面讲。

elasticsearch-head插件连接不上es,显示集群健康值: 未连接

解决方法:

  1. 修改 Elasticsearch 配置文件 config/elasticsearch.yml,添加如下配置:

  1. 修改 elasticsearch-head 目录下 Gruntfile.js 文件,添加如下配置:

  1. 可能是浏览器不支持,更换火狐浏览器试试。

  2. 可能是Elasticsearch安装版本问题,6.0.0 版本尝试以上方法后问题依然存在,而换成 2.4.0 版本问题得到解决,比较莫名其妙,如果有大神知道问题原因还望不吝赐教。

参考资料:

elasticsearch5.0中head连不上es,集群健康值: 未连接

在 SpringBoot 中使用 Elasticsearch
  1. 项目使用的 SpringBoot 版本是1.5.6发布版。

  2. 在 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>
  3. 在 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 配置文件中添加如下配置:

  4. 编写实体类

    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 异常。

  5. 编写 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);}}
    }

    时间比较有限,配置从简。

  6. 编写 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);}
  7. 编写 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;}}
  8. 编写 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();}}
  9. 运行测试类后抛出异常:

    有些不明所以,在网上搜索技术博客寻找原因,看了几篇后觉得不是配置问题,而可能是 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]

  10. 于是选择重新安装低版本的 Elasticsearch 2.4.0,并重新配置 elasticsearch.yml 文件。

  11. 运行 saveVehicleLog 测试方法

  12. 运行 selectAllVehicleLogByIp测试方法,抛出异常

    判断是由于 VehicleLog 实体类缺少无参的构造方法所导致,添加上以后解决异常:

到此,SpringBoot 集成 Elasticsearch 执行基本的添加和查询操作已经完成,后面更详细的内容有时间将会继续介绍。


在Linux上安装Elasticsearch
  1. 首先我是通过 FileZilla 这款 FTP 传输软件将 elasticsearch-2.4.0 版本的 tar 包拷贝到 Linux 系统上 /home/elasticsearch 目录下。注意不能是 root 目录下。

  2. 使用 cd 命令进入 /home/elasticsearch 目录下,使用如下命令解压文件。

    $ tar -vxf elasticsearch-2.4.0.tar.gz
  3. 修改 elasticsearch.yml 配置文件。

    $ vim elasticsearch-2.4.0/config/elasticsearch.yml

    使用 :wq 保存并退出,使用 cat 命令查看配置。

  4. elasticsearch 不能以 root 用户身份启动,可以使用如下命令。

    $ adduser esuser
    $ chown -R esuser elasticsearch-2.4.0
    $ su esuser
    $ chmod 777 elasticsearch-2.4.0

  5. 后台启动 elasticsearch 。

    $ ./bin/elasticsearch -d
  6. 查看 elasticsearch 是否已经启动。

    $ ps aux|grep elasticsearch

  7. 安装 elasticsearch-head 插件,进入 elasticsearchbi-2.4.0/bin 目录后,执行如下命令:

    ./plugin install mobz/elasticsearch-head

穿林打叶过程轰轰烈烈,花开花落一路上起起跌跌。

Spring Boot 学习笔记 8 : Elasticsearch相关推荐

  1. Spring Boot学习笔记-进阶(3)

    文章目录 Spring Boot学习笔记-进阶(3) 一.Spring Boot与缓存 二.Spring Boot与消息 三.Spring Boot与检索 四.Spring Boot与任务 异步任务 ...

  2. Spring Boot学习笔记-基础(2)

    Spring Boot学习笔记-基础(2) Spring Boot 优点: – 快速创建独立运行的Spring项目以及与主流框架集成 – 使用嵌入式的Servlet容器,应用无需打成WAR包 – st ...

  3. Spring Boot学习笔记-实践建言

    2019独角兽企业重金招聘Python工程师标准>>> 本文延续<Spring Boot学习笔记-快速示例>,从开发指南中摘出一些实践经验可供参考.这也是笔者看到的眼前一 ...

  4. Spring Boot学习笔记(1)

    文章目录 Spring Boot学习笔记(1) Spring Boot 整合 JSP Spring Boot HTML Thymeleaf 常用语法 Spring Boot 数据校验 Spring B ...

  5. Vue + Spring Boot 学习笔记02:引入数据库实现用户登录功能

    Vue + Spring Boot 学习笔记02:引入数据库实现用户登录功能 在学习笔记01里,我们利用跨域打通了前端的Vue与后端的Spring Boot,实现了用户登录功能,但是后台的登录控制器在 ...

  6. Vue + Spring Boot 学习笔记01:实现用户登录功能

    Vue + Spring Boot 学习笔记01:实现用户登录功能 一.创建后端Spring Boot项目Book Management 二.创建前端Vue项目bm-vue 三.修改后端项目Book ...

  7. 超赞:不愧是阿里内部“Spring boot学习笔记”从头到尾,全是精华

    spring boot为何会出现? 随着动态语言的流行(Ruby.Groovy. Scala. Node.js),Java 的开发显得格外的笨重:繁多的配置.低下的开发效率.复杂的部署流程以及第三方技 ...

  8. Spring Boot学习笔记 [完结]

    Spring Boot 文章目录 Spring Boot 1.微服务 1.1 什么是微服务? 1.2 单体应用架构 1.3 微服务架构 2. 第一个SpringBoot程序 2.1.原理 2.2 原理 ...

  9. Spring Boot 学习笔记--整合Thymeleaf

    1.新建Spring Boot项目 添加spring-boot-starter-thymeleaf依赖 1 <dependency> 2 <groupId>org.spring ...

最新文章

  1. webdriver Google-chrome crashed
  2. 推荐10个能带来快感的实用windows软件,好评如潮!
  3. CNN可视化又添新作,南大开源Group-CAM:高效的显著图生成方法|CVPR2021
  4. Java进阶书籍推荐,赶快收藏起来!
  5. Mybatis高级-resultMap之collection聚集
  6. Android的快速开发框架 afinal
  7. paip.验证码识别---初始化
  8. 复制含有随机指针节点的链表
  9. 《程序员面试宝典》.pdf
  10. vc语言c1083错误,VC Fatal Error C1083的几种解决方案
  11. 曙光服务器怎么进入bios_怎么进入bios,教您怎么进入bios
  12. 用函数统计各分数段人数c语言,如何使用Excel函数统计各或分数段的人数(五种方法).doc...
  13. 中国银行理财产品市场运行态势及投资风险透析报告2021-2027年
  14. 安卓开发无线连接设备进行调试(adb)
  15. 每日新闻 | 华为首款5G手机今日正式开卖
  16. 一篇文章让你搞懂Java中的静态代理和动态代理
  17. 汽车发动机扭矩,转速,功率
  18. S5PV210时钟详解
  19. 解决EXCEL中选中单元格右键被屏蔽的问题
  20. 11_JavaScript基础入门(1)

热门文章

  1. 微信支付,二维码图片解析
  2. 浪漫的星空,表白的弹窗,python制作
  3. 计算几何入门 1.3:凸包的构造——增量构造法
  4. 如何实现小程序的无限推送
  5. 易方机器人教育怎么样_易方机器人教育加盟费用
  6. 问题解决:Excel中依据某一列数据进行匹配
  7. 华尔街最“伟大”骗子排行榜!
  8. css尺寸(大小)属性
  9. 详解数据结构课程设计———运动会分数统计
  10. CPU核心数目 与 多线程