spring-data-elasticsearch
简介
- spring-data-elasticsearch 是 Spring 提供的操作 ElasticSearch 的数据层,封装了大量的基础操作,通过它可以很方便的操作 ElasticSearch 的数据。除了 CRUD 外,还包括如分页、排序等一些常用的功能。:
- ElasticsearchRepository:最顶层的接口,是一个空的接口,目的是为了统一所有 Repository 的类型,且能让组件扫描的时候自动识别。
- ElasticsearchCrudRepository:是 Repository 的子接口,提供 CRUD 的功能
Y9 主要使用了 Spring Boot + spring-data-elasticsearch 来做数据的 CRUD 等操作。具体 ElasticsearchRepository 提供的方法可查看:https://docs.spring.io/spring-data/elasticsearch/docs/4.4.18/reference/html/#elasticsearch.clients.configuration
功能引用
引用与配置
(1)修改 pom.xml
将本公司的私服仓库地址添加到 pom.xml 文件中。
xml
<repositories>
<repository>
<id>y9-internet-repo</id>
<url>https://svn.youshengyun.com:9900/nexus/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<!-- <updatePolicy>always</updatePolicy> -->
<!-- always,daily(default),interval:XXX,never -->
</snapshots>
</repository>
</repositories>
(2)将 risenet-y9boot-starter-jpa-public 添加到 pom.xml 的依赖列表里.
xml
<dependency>
<groupId>net.risesoft</groupId>
<artifactId>risenet-y9boot-starter-elasticsearch</artifactId>
<version>[最新版本]</version>
</dependency>
(3)添加数据源属性配置,修改属性文件 application.properties
properties
spring.data.elasticsearch.repositories.enabled=true
spring.elasticsearch.uris=localhost:9200
spring.elasticsearch.username=elastic
spring.elasticsearch.password=risesoft
y9.feature.elasticsearch.packagesToScanEntityPublic=net.risesoft.nosql.elastic.entity
y9.feature.elasticsearch.packagesToScanRepositoryPublic=net.risesoft.nosql.elastic.repository
yaml
spring:
data:
elasticsearch:
repositories:
enabled: true
elasticsearch:
uris: localhost:9200
username: elastic
password: 'risesoft'
y9:
feature:
elasticsearch:
packagesToScanEntityPublic: net.risesoft.y9public.entity
packagesToScanRepositoryPublic: net.risesoft.y9public.repository
使用说明
(1)定义了 ElasticsearchConfiguration 。主要提供以下几种实现:
ElasticsearchOperations operations;
(2)使用示例:
java
package net.risesoft.service.impl;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.Criteria;
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.Query;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import net.risesoft.elastic.entity.User;
import net.risesoft.elastic.repository.UserRepository;
import net.risesoft.id.Y9IdGenerator;
import net.risesoft.service.UserService;
/**
* 描述:人员服务实现层
*/
@RequiredArgsConstructor
@Service(value = "userService")
public class UserServiceImpl implements UserService {
private final ElasticsearchOperations elasticsearchOperations;
private final UserRepository userRepository;
@Override
public void deleteById(String id) {
Optional<User> user = userRepository.findById(id);
if (user.isPresent()) {
userRepository.deleteById(id);
}
}
@Override
public Iterable<User> findAll() {
return userRepository.findAll();
}
@Override
public User findById(String id) {
return userRepository.findById(id).orElse(null);
}
@Override
public User save(User user) {
return userRepository.save(user);
}
@Override
public User saveOrUpdate(User user) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
User u = new User();
if (StringUtils.isBlank(user.getId())) {
u.setId(Y9IdGenerator.genId());
u.setCreateTime(sdf.format(new Date()));
} else {
u = userRepository.findById(user.getId()).orElse(null);
}
u.setName(user.getName());
u.setAge(user.getAge());
u.setBirth(user.getBirth());
u.setEducation(user.getEducation());
u.setMobile(user.getMobile());
u.setSex(user.getSex());
return userRepository.save(u);
}
@Override
public Page<User> search(String name, String mobile, Integer page, Integer rows) {
Sort sort = Sort.by(Sort.Direction.DESC, "createTime");
Pageable pageable = PageRequest.of((page < 1) ? 0 : page - 1, rows, sort);
Criteria criteria = new Criteria("name").exists();
if (StringUtils.isNotBlank(name)) {
criteria.subCriteria(new Criteria("name").contains(name));
}
if (StringUtils.isNotBlank(mobile)) {
criteria.subCriteria(new Criteria("mobile").contains(mobile));
}
Query query = new CriteriaQuery(criteria).setPageable(pageable);
query.setTrackTotalHits(true);
SearchHits<User> search = elasticsearchOperations.search(query, User.class);
List<User> list = search.stream().map(SearchHit::getContent).collect(Collectors.toList());
Page<User> pageResult = new PageImpl<>(list, pageable, search.getTotalHits());
return pageResult;
}
@Override
public Page<User> search2(String name, String mobile, Integer page, Integer rows) {
Sort sort = Sort.by(Sort.Direction.DESC, "createTime");
Pageable pageable = PageRequest.of((page < 1) ? 0 : page - 1, rows, sort);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
if (StringUtils.isNotBlank(name)) {
boolQueryBuilder.must(QueryBuilders.wildcardQuery("title", "*" + name + "*"));
}
if (StringUtils.isNotBlank(mobile)) {
boolQueryBuilder.must(QueryBuilders.wildcardQuery("mobile", "*" + mobile + "*"));
}
NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
builder.withQuery(boolQueryBuilder);
builder.withPageable(pageable);
builder.withTrackTotalHits(true);
SearchHits<User> search = elasticsearchOperations.search(builder.build(), User.class);
List<User> list = search.stream().map(SearchHit::getContent).collect(Collectors.toList());
Page<User> pageResult = new PageImpl<>(list, pageable, search.getTotalHits());
return pageResult;
}
}
示例代码
码云地址:https://gitee.com/risesoft-y9/y9-core
该示例代码路径地址:https://gitee.com/risesoft-y9/y9-core/tree/main/y9-digitalbase-example/risenet-y9demo-elasticsearch