Elasticsearch 是一个开源的分布式 RESTful 搜索和分析引擎,它使您可以快速,近乎实时地存储,搜索和分析大量数据,能够解决越来越多不同的应用场景。
- 比如用作搜索网络商店的商品,用户的搜索,交易数据的搜索。
- 业务的收集和存储
- 报表的分析
在Springboot中如何使用elasticsearch去存储和查询数据呢,目前来说有以下几种方式比较便捷:
- REST Client
- Spring Data
- Spring Data Elasticsearch Repositories
本文将使用Spring Data Elasticsearch Repositories这种方式去访问Elasticsearch。
准备
需要自己搭建一台Elasticsearch,elasticsearch的版本为7.7.0。本次Elasticsearch为单机版本Elasticsearch,生产环境要使用集群版本。执行下面命令安装
代码语言:javascript复制# 下载elasticsearch的rpm
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-x86_64.rpm
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-x86_64.rpm.sha512
shasum -a 512 -c elasticsearch-7.7.0-x86_64.rpm.sha512
sudo rpm --install elasticsearch-7.7.0-x86_64.rpm
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.servic
修改es给其他ip访问:
代码语言:javascript复制cluster.name: "docker-cluster"
network.host: 0.0.0.0
# custom config
node.name: "node-1"
discovery.seed_hosts: ["127.0.0.1", "[::1]"]
cluster.initial_master_nodes: ["node-1"]
# 开启跨域访问支持,默认为false
http.cors.enabled: true
# 跨域访问允许的域名地址,(允许所有域名)以上使用正则
http.cors.allow-origin: /.*/
Spring boot集成Elasticsearch
在springboot的工程的pom文件中引入elasticsearch的起步依赖spring-boot-starter-data-elasticsearch,如下:
代码语言:javascript复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
在springboot的配置文件application.properties文件填写elasticesearch的配置,这里使用的9300端口,即使用TCP协议端口。
代码语言:javascript复制server.port=8500
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
spring.data.elasticsearch.cluster-name=my-application
和大多数spring-boot-starter-data-jpa类似,都是使用实体对象和数据库的存储结构字段对应起来的。使用@Document(indexName = “user”)注解,会在elasticesearch里面创建一个user的索引,@Id注解白名uId字段为elasticsearch的id字段。
代码语言:javascript复制@Document(indexName = "user")
public class User implements Serializable {
@Id
private String uId;
private String name;
private Integer age;
private String address;
//省略getter setter
}
写一个接口UserRepository继承ElasticsearchRepository,ElasticsearchRepository包含了基本的增删改查的能力,并在接口类上加上@Repository注解,注入到spring 容器中。
代码语言:javascript复制@Repository
public interface UserRepository extends ElasticsearchRepository<User, String> {
}
UserServiceImpl类去操作UserRepository的接口,去操作Elasticsearch。
代码语言:javascript复制@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public long count() {
return userRepository.count();
}
@Override
public User save(User user) {
return userRepository.save(user);
}
@Override
public void delete(User user) {
userRepository.delete(user);
}
@Override
public Iterable<User> getAll() {
return userRepository.findAll();
}
@Override
public List<User> getByName(String name) {
List<User> list = new ArrayList<>();
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("name", name);
Iterable<User> iterable = userRepository.search(matchQueryBuilder);
iterable.forEach(e->list.add(e));
return list;
}
@Override
public Page<User> pageQuery(Integer pageNo, Integer pageSize, String kw) {
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchPhraseQuery("name", kw))
.withPageable(PageRequest.of(pageNo, pageSize))
.build();
return userRepository.search(searchQuery);
}
}
写一个测试类,然后依次调用接口:
代码语言:javascript复制@RestController
public class TestController {
@Autowired
private UserService userService;
@GetMapping("/testInsert")
public void testInsert() {
User user = new User();
user.setuId("1");
user.setName("zhangsna");
user.setAge(101);
user.setAddress("广东省深圳市");
userService.save(user);
user.setuId("2");
user.setName("lisi");
user.setAge(32);
user.setAddress("广东省深圳市");
userService.save(user);
user.setuId("3");
user.setName("wangwu");
user.setAge(34);
user.setAddress("广东省深圳市");
userService.save(user);
}
@GetMapping("/testDelete")
public void testDelete() {
User user = new User();
user.setuId("1");
userService.delete(user);
}
@GetMapping("/testGetAll")
public void testGetAll() {
Iterable<User> iterable = userService.getAll();
iterable.forEach(e -> System.out.println(e.toString()));
}
@GetMapping("/testGetByName")
public void testGetByName() {
List<User> list = userService.getByName("lisi");
System.out.println(list);
}
@GetMapping("/testPage")
public void testPage() {
Page<User> page = userService.pageQuery(0, 10, "wangwu");
System.out.println(page.getTotalPages());
System.out.println(page.getNumber());
System.out.println(page.getContent());
}
}
kibana展示数据
首先需要按照kibana,安装命令如下:
代码语言:javascript复制wget https://artifacts.elastic.co/downloads/kibana/kibana-7.7.0-x86_64.rpm
shasum -a 512 kibana-7.7.0-x86_64.rpm
sudo rpm --install kibana-7.7.0-x86_64.rpm
//设置kibana开机自启
sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable kibana.service
sudo systemctl start kibana.service //启动kibana
sudo systemctl stop kibana.service //停止kibana
启动成功后,在浏览器上访问kibana的地址http://10.10.10.1:5601,进入kibana的主界面。然后进到Discover界面。选择user的索引,就可以正常展示数据,数据如下: