Skip to content

spring-data-elasticsearch

简介

  1. 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

Released under the GPL-3.0 License.