es中ElasticsearchRepository 的原理和使用

把数据存储到es中,有两种方式一种是 ElasticsearchRepository 接口,另一种是ElasticsearchTemplate接口,今天我们主要分析ElasticsearchRepository接口。

一、ElasticsearchRepository 原理分析:

1、首先springBoot 项目的pom文件中引入jar包:

<!-- ES搜索 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

Spring-data-elasticsearch是Spring提供的操作ElasticSearch的数据层,封装了大量的基础操作,通过它可以很方便的操作ElasticSearch的数据。 

2、配置文件中配置:

#如禁止es的健康检查如下,默认均为开启状态

management:
  health:
    elasticsearch:
      enabled: false


es:
  ip: 172.18.89.33
  port: 9200
  articleType: /nandao-article/

3、业务方法继承方式:

public interface ArticleRepository extends ElasticsearchRepository<ArticleEsDto,String> {

//这里面可以自定义方法,后面会介绍
}

4、查看ElasticsearchRepository接口的源码

package org.springframework.data.elasticsearch.repository;

import java.io.Serializable;

import org.elasticsearch.index.query.QueryBuilder;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.data.repository.NoRepositoryBean;

/**
 * @param <T>
 * @param <ID>
 * @author Rizwan Idrees
 * @author Mohsin Husen
 */
@NoRepositoryBean
public interface ElasticsearchRepository<T, ID extends Serializable> extends ElasticsearchCrudRepository<T, ID> {

	<S extends T> S index(S entity);

	Iterable<T> search(QueryBuilder query);

	Page<T> search(QueryBuilder query, Pageable pageable);

	Page<T> search(SearchQuery searchQuery);

	Page<T> searchSimilar(T entity, String[] fields, Pageable pageable);

	void refresh();

	Class<T> getEntityClass();
}

我们是通过继承 ElasticsearchRepository 来完成基本的CRUD及分页操作的,和普通的JPA没有什么区别。

5、查看 ElasticsearchCrudRepository 的源码:


import java.io.Serializable;

import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;

/**
 * @param <T>
 * @param <ID>
 * @author Rizwan Idrees
 * @author Mohsin Husen
 * @author Oliver Gierke
 */
@NoRepositoryBean
public interface ElasticsearchCrudRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {

}

6、查看  PagingAndSortingRepository 源码:

package org.springframework.data.repository;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

/**
 * Extension of {@link CrudRepository} to provide additional methods to retrieve entities using the pagination and
 * sorting abstraction.
 *
 * @author Oliver Gierke
 * @see Sort
 * @see Pageable
 * @see Page
 */
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {

	/**
	 * Returns all entities sorted by the given options.
	 *
	 * @param sort
	 * @return all entities sorted by the given options
	 */
	Iterable<T> findAll(Sort sort);

	/**
	 * Returns a {@link Page} of entities meeting the paging restriction provided in the {@code Pageable} object.
	 *
	 * @param pageable
	 * @return a page of entities
	 */
	Page<T> findAll(Pageable pageable);
}

7、查看  CrudRepository  源码:

package org.springframework.data.repository;

import java.util.Optional;

/**
 * Interface for generic CRUD operations on a repository for a specific type.
 *
 * @author Oliver Gierke
 * @author Eberhard Wolff
 */
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {

	/**
	 * Saves a given entity. Use the returned instance for further operations as the save operation might have changed the
	 * entity instance completely.
	 *
	 * @param entity must not be {@literal null}.
	 * @return the saved entity will never be {@literal null}.
	 */
	<S extends T> S save(S entity);

	/**
	 * Saves all given entities.
	 *
	 * @param entities must not be {@literal null}.
	 * @return the saved entities will never be {@literal null}.
	 * @throws IllegalArgumentException in case the given entity is {@literal null}.
	 */
	<S extends T> Iterable<S> saveAll(Iterable<S> entities);

	/**
	 * Retrieves an entity by its id.
	 *
	 * @param id must not be {@literal null}.
	 * @return the entity with the given id or {@literal Optional#empty()} if none found
	 * @throws IllegalArgumentException if {@code id} is {@literal null}.
	 */
	Optional<T> findById(ID id);

	/**
	 * Returns whether an entity with the given id exists.
	 *
	 * @param id must not be {@literal null}.
	 * @return {@literal true} if an entity with the given id exists, {@literal false} otherwise.
	 * @throws IllegalArgumentException if {@code id} is {@literal null}.
	 */
	boolean existsById(ID id);

	/**
	 * Returns all instances of the type.
	 *
	 * @return all entities
	 */
	Iterable<T> findAll();

	/**
	 * Returns all instances of the type with the given IDs.
	 *
	 * @param ids
	 * @return
	 */
	Iterable<T> findAllById(Iterable<ID> ids);

	/**
	 * Returns the number of entities available.
	 *
	 * @return the number of entities
	 */
	long count();

	/**
	 * Deletes the entity with the given id.
	 *
	 * @param id must not be {@literal null}.
	 * @throws IllegalArgumentException in case the given {@code id} is {@literal null}
	 */
	void deleteById(ID id);

	/**
	 * Deletes a given entity.
	 *
	 * @param entity
	 * @throws IllegalArgumentException in case the given entity is {@literal null}.
	 */
	void delete(T entity);

	/**
	 * Deletes the given entities.
	 *
	 * @param entities
	 * @throws IllegalArgumentException in case the given {@link Iterable} is {@literal null}.
	 */
	void deleteAll(Iterable<? extends T> entities);

	/**
	 * Deletes all entities managed by the repository.
	 */
	void deleteAll();
}

8、查看 Repository 空方法

@Indexed
public interface Repository<T, ID> {

}

ElasticsearchRepository继承了ElasticsearchCrudRepository extends PagingAndSortingRepository 继承 CrudRepository 接口 继承 Repository空方法,这些均是源码提供的接口,

9、按照规则 可以自定义一下方法,举例:

import com.huobi.chat.news.service.dto.ArticleEsDto;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import java.util.List;

 
public interface ArticleRepository extends ElasticsearchRepository<ArticleEsDto,String> {

    /**
     * 自定义方法里By后面的字符串,必须存在泛型类ArticleEsDto里,而且可以用and连接;
     * 比如 findByTitle、findByContent、findByTitleAndContent
     *
     * List<ArticleEsDto> findByP(String title);//会报错
     * 否则报如下错:
     * Caused by: org.springframework.data.mapping.PropertyReferenceException:
     * No property p found for type ArticleEsDto! Did you mean 'id'?
     *
     */

    List<ArticleEsDto> findByTitle(String title);

   // List<ArticleEsDto> findByP(String title);

    List<ArticleEsDto> findByContent(String content);

    List<ArticleEsDto> findBySummary(String summary);

    List<ArticleEsDto> findByTitleAndContent(String titleAndContent,String ss);

}

如图证明写接口名称时就会有提示:

二、测试使用

1 、保存接口测试 

    @PostMapping("save")
    public void save(@Validated @RequestBody ArticleEsDto req){
        ArticleEsDto dto = new ArticleEsDto();
        dto.setTitle(req.getTitle());
        dto.setSummary(req.getSummary());
        dto.setContent(req.getContent());
        dto.setArticleId(999L);
        dto.setId(req.getId());
        dto.setSource(req.getSource());
        dto.setJid(111L);
        dto.setListPicturePath("http:llll");
        //es原生保存接口
        articleRepository.save(dto);
        return ;
        }

传的参数:

{
    "id":8,
    "title":"佛陀阿弥陀佛啊",
    "content":"释迦摩尼佛",
    "summary":"观世音菩萨佛",
    "source":"as",
    "listPicturePath":"hhhh"
}

2、原生查询接口


    @PostMapping("search")
    public void queryTest(@Validated @RequestBody ArticleDetailReq req){
        QueryStringQueryBuilder builder = new QueryStringQueryBuilder(req.getMobileType());
        //原生查询方法
        Iterable<ArticleEsDto> searchResult = articleRepository.search(builder);
        Iterator<ArticleEsDto> iterator = searchResult.iterator();
        while (iterator.hasNext()) {
            System.out.println("成功查询:"+iterator.next());
        }
        return;
    }

3、自定义查询接口:

    @PostMapping("testTitle")
    public void testSearchTitle(@Validated @RequestBody ArticleDetailReq req){
        List<ArticleEsDto> searchResult = articleRepository.findByTitle(req.getMobileType());
        Iterator<ArticleEsDto> iterator = searchResult.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
        System.out.println("sa");
        return;
    }

查询参数:

{
    "mobileType":"佛a"
    
}

4、自定义多参数查询:

    @PostMapping("findByTitleAndContent")
    public void findByTitleAndContent(@Validated @RequestBody ArticleDetailReq req){
        List<ArticleEsDto> searchResult = articleRepository.findByTitleAndContent(req.getMobileType(),req.getMobileType());
        Iterator<ArticleEsDto> iterator = searchResult.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
        System.out.println("sa");
        return;
    }

5、查询结果如下图:

  到此,ElasticsearchRepository分享完毕,下篇我们分享ElasticSearchTemplate的原理和使用,敬请期待!

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寅灯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值