一、介绍
1.1 技术介绍
elasticsearch是一个高度可扩展的开源全文搜索和分析引擎,可以快速的、近实时地对大数据进行存储、搜索和分析,用来支撑复杂的数据搜索需求和企业级应用,主要用于海量系统日志的数据查询与分析。
1.2 官网地址
官网:
https://www.elastic.co/cn/elasticsearch/
下载地址(windows版):
https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-8-10
1.3 软件版本
Spring Boot版本:2.1.8
ElasticSearch版本:6.8.10
二、环境搭建
2.1 安装
-
安装前确保电脑已安装1.8版本或以上的JDK
登录下载地址,下载Windows版本
图-1
将压缩包解压到指定文件夹
进入bin
目录下,双击elasticsearch.bat
文件,启动Elasticserarch服务,显示started表示启动成功
登录
http://localhost:9200
,显示Elasticsearch信息,安装成功
{
"name" : "Do0ma2a",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "ns7XjWczTpC7dA2pI3QEtQ",
"version" : {
"number" : "6.8.10",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "537cb22",
"build_date" : "2020-05-28T14:47:19.882936Z",
"build_snapshot" : false,
"lucene_version" : "7.7.3",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
2.2 配置
测试项目为一个Spring Boot项目,需配置pom文件及application文件
2.2.1 配置pom.xml
pom文件中添加关于elasticsearch相关的spring boot依赖
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.toj</groupId>
<artifactId>esdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>esdemo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 新增elasticsearch相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.1.2 配置application.properties
端口自定,名称和节点根据部署情况进行更改
# 服务端口号
server.port=9003
# elasticsearch名称及地址
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
# http://localhost:9200上的名称
"cluster_name" : "elasticsearch"
三、Demo开发演示
3.1 Demo概述
本项目将用Elasticsearch模拟数据库,进行添加,删除,查找数据,并通过json传到前台,并使用Postman进行测试
3.1.1 设置用户实体
添加构造函数,无参构造函数,getter和setter方法,否则ES无法对数据进行操作
package cn.toj.esdemo.domain;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import java.io.Serializable;
/**
* @author Carlos
* @description
* @Date 2020/7/23
*/
// Document中的indexName必须为小写英文,否则会报错,相当于表名
@Document(indexName = "user")
public class User implements Serializable {
@Id
private String userId;
private String userName;
private String sex;
private String address;
public User(String userId, String userName, String sex, String address) {
this.userId = userId;
this.userName = userName;
this.sex = sex;
this.address = address;
}
public User() {
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"userId='" + userId + '\'' +
", userName='" + userName + '\'' +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
3.1.2 继承ESRepository类并传入实体
生成的接口相当于传统开发的Mapper文件,可对表进行增删改查操作
package cn.toj.esdemo.dao;
import cn.toj.esdemo.domain.User;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface UserRepository extends ElasticsearchRepository<User, String> {
}
3.1.3 添加服务层接口及其实现类
实现插入,删除,根据userName
字段进行查找的操作,并通过@Service
注解生成Bean
接口:
package cn.toj.esdemo.service;
import cn.toj.esdemo.domain.User;
import java.util.List;
public interface IUserService {
/**
* 保存用户
* @param user
* @return
*/
User save(User user);
/**
* 删除用户
* @param user
*/
void del(User user);
/**
* 根据用户名查找用户
* @param name
* @return
*/
List<User> getByName(String name);
}
实现类:
package cn.toj.esdemo.service.impl;
import cn.toj.esdemo.dao.UserRepository;
import cn.toj.esdemo.domain.User;
import cn.toj.esdemo.service.IUserService;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* @author Carlos
* @description
* @Date 2020/7/23
*/
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private UserRepository userRepository;
@Override
public User save(User user) {
return userRepository.save(user);
}
@Override
public void del(User user) {
userRepository.delete(user);
}
@Override
public List<User> getByName(String name) {
List<User> userList = new ArrayList<>();
MatchQueryBuilder queryBuilder = new MatchQueryBuilder("userName", name);
Iterable<User> userIterable = userRepository.search(queryBuilder);
userIterable.forEach(userList::add);
return userList;
}
}
3.1.4 控制层对外接收信息
package cn.toj.esdemo.controller;
import cn.toj.esdemo.domain.User;
import cn.toj.esdemo.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author Carlos
* @description
* @Date 2020/7/23
*/
@RestController
public class UserController {
@Autowired
private IUserService userService;
@PostMapping("/insert")
public User insert(@RequestBody User user){
User saveUser = userService.save(user);
return saveUser;
}
@PostMapping("/del")
public String delete(@RequestBody User user){
userService.del(user);
return "Delete user success.";
}
@PostMapping("/query")
public List<User> getByName(@RequestBody String name) {
return userService.getByName(name);
}
}
3.1.5 项目结构
3.2 测试
3.2.1 验证插入
返回插入的用户信息
3.2.2 验证查询
查询到刚才插入的信息
3.2.3 验证删除
删除成功
再次查询,已经查不到,删除成功
3.3 Demo下载地址
GitHub项目地址:
https://github.com/diyzhang/42j109-esdemo使用Git下载项目的命令:
git clone https://github.com/diyzhang/42j109-esdemo.git