Elasticsearch常用API详解

Elasticsearch常用API详解

1.CrudRepository

简介:可以先去看看官网的地址,对你有帮助:https://docs.spring.io/spring-data/elasticsearch/docs/4.1.2/reference/html/#repositories.core-concepts

常用的crud

public interface CrudRepository<T, ID> extends Repository<T, ID> {
    
     <S extends T> S save(S entity);   //保存
    
    Optional<T> findById(ID primaryKey);  //根据id查询
     
      Iterable<T> findAll();     //查全部
    
     long count();            //统计
    
    void delete(T entity);    //删除
    
     boolean existsById(ID primaryKey);  //判断id是否存在 
    
}

1.1查全部

@Test
public void findAll(){
    //设置分页
 	// Pageable pageable = PageRequest.of(0, 5);
    // Iterable<EsProduct> all = esProductRepository.findAll(pageable);
    Iterable<EsProduct> all = esProductRepository.findAll();
    Iterator<EsProduct> iterator = all.iterator();
    while(iterator.hasNext()){
        EsProduct next = iterator.next();
        System.out.println("输出:"+next);
    }
    System.out.println("111");
}	


输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vOoLF0bB-1665369410173)(Elasticsearch%E5%BA%95%E5%B1%82%E8%B0%83%E7%94%A8%E5%91%BD%E4%BB%A4.assets/image-20220830145234390.png)]

1.2 根据id查

@Test
public void findAllById() {
    Optional<EsProduct> byId = esProductRepository.findById((long) 9);
    EsProduct esProduct = byId.get();
    System.out.println("输出:"+esProduct);
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iaMWxyXD-1665369410174)(Elasticsearch%E5%BA%95%E5%B1%82%E8%B0%83%E7%94%A8%E5%91%BD%E4%BB%A4.assets/image-20220830150246353.png)]

1.3统计全部

@Test
public void count() {
    long count = esProductRepository.count();
    System.out.println("全部数据:"+count);
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-onVbLsvU-1665369410175)(Elasticsearch%E5%BA%95%E5%B1%82%E8%B0%83%E7%94%A8%E5%91%BD%E4%BB%A4.assets/image-20220830150911145.png)]

1.4根据id查询是否存在

@Test
public void existsById(){
    boolean existsById = esProductRepository.existsById((long) 9);
    if(existsById){
        System.out.println("哈哈哈哈");
    }
    else{
        System.out.println("不存在");
    }

1.5删除

@Test
public void delete(){
    esProductRepository.deleteById((long)9);
    esProductRepository.deleteAll();
    //根据实体类条件删除
    EsProduct esProduct = new EsProduct();
    esProductRepository.delete(esProduct);
}

1.6保存或者修改

@Test
public void save(){
    EsProduct esProduct = new EsProduct();
    esProductRepository.save(esProduct);
}

   @Test
    public void update() {
        EsProduct esProduct = new EsProduct();
        esProduct.setId((long)9);
        esProduct.setProductName("红红火火恍恍惚惚或我改了");
        esProductRepository.save(esProduct);

    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t0aJWzDz-1665369410176)(Elasticsearch%E5%B8%B8%E7%94%A8API%E8%AF%A6%E8%A7%A3.assets/image-20220831153827157.png)]

2.另外一种写法执行增删查改等操作(常用 且 重点

2.1简单的CRUD

首先,要先继承ElasticsearchRepository

public interface xxxRepository extends ElasticsearchRepository<xxx, Long> {
		
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uy9AXflA-1665369410177)(Elasticsearch%E5%BA%95%E5%B1%82%E8%B0%83%E7%94%A8%E5%91%BD%E4%BB%A4.assets/image-20220830153441146.png)]

左边先写你要的数据 然后右边一般是get或者find…等等

eg:

/***
 * 根据id查找
 * @param id
 * @return
 */
EsProduct getAllById(Long id);
@Test
public void findAllById() {
    Optional<EsProduct> byId = esProductRepository.findById((long) 9);
    EsProduct oneData = esProductRepository.getAllById((long) 9);
    System.out.println("输出oneData:"+oneData);
    EsProduct esProduct = byId.get();
    System.out.println("输出:"+esProduct);
}

运行结果都是输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sf8kYzKu-1665369410177)(Elasticsearch%E5%BA%95%E5%B1%82%E8%B0%83%E7%94%A8%E5%91%BD%E4%BB%A4.assets/image-20220830153600351.png)]

其他的一些简单的查询例子如下:

public interface EsProductRepository extends ElasticsearchRepository<EsProduct, Long> {
	//需注意,这些方法不是写死的,要对应你封装的实体类,也可以在该方法再进行扩展
    //eg:countByProductNameAnd....
    
    
	 /***
     * 根据商品名字统计s
     * @param productName
     * @return
     */
    long countByProductName(String productName);
    
      /***
     * 根据用户名称删除
     * @param productName
     * @return
     */
    long deleteByProductName(String productName);
   
    
      /***
     * 根据商品名称查询
     * @param productName
     * @return
     */
    List<EsProduct> getAllByProductName(String productName);
    
    
      /***
     * 按价格进行降序排序
     * @return
     */
    List<EsProduct> findEsProductsByOrderByPriceDesc();
    	
    
        /***
     * 按价格进行降序升序,并分页
     * @param page
     * @return
     */
    Page<EsProduct> findEsProductsByOrderByPriceAsc(Pageable page);
    
    
    /***
     * 模糊查询商品名称并分页
     * @param productName
     * @param page
     * @return
     */
    Page<EsProduct> findEsProductsByProductNameLike(String productName,Pageable page);
    
     /***
     * 根据商品名称进行流的查询
     * @param productName
     * @return
     */
    Stream<EsProduct> findEsProductsByProductName(String productName);
    
    
    
    

}

2.2复杂的查询

条件是productName 或者 subTitle 或者 keywords 都可以查到。

public interface EsProductRepository extends ElasticsearchRepository<EsProduct, Long> {
/**
 * 搜索查询
 *
 * @param productName              商品名称
 * @param subTitle          商品标题
 * @param keywords          商品关键字
 * @param page              分页信息
 * @return
 */
Page<EsProduct> findByProductNameOrSubTitleOrKeywords(String productName, String subTitle, String keywords, Pageable page);

}

写法注意

1.要采用驼峰命名法。

2.方法名称productName 和 subTitle 和 keywords 都是数据库属性有的,名字都要对应上。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eVQoeElm-1665369410178)(Elasticsearch%E5%BA%95%E5%B1%82%E8%B0%83%E7%94%A8%E5%91%BD%E4%BB%A4.assets/image-20220830155001065.png)]

@Test
public void findByProductNameOrSubTitleOrKeywords(){
    //开启分页
    Pageable pageable = PageRequest.of(0, 5);
    Page<EsProduct> byProductNameOrSubTitleOrKeywords = esProductRepository.findByProductNameOrSubTitleOrKeywords("小米", "海澜之家", "便宜", pageable);
    System.out.println("输出:"+byProductNameOrSubTitleOrKeywords);
}

运行结果:可以看出,都没任何问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xBaEA6yy-1665369410178)(Elasticsearch%E5%BA%95%E5%B1%82%E8%B0%83%E7%94%A8%E5%91%BD%E4%BB%A4.assets/image-20220830155706705.png)]

2.3可空性注释

来表达存储库方法的可空性约束。它们在运行时提供了一种工具友好的方法和选择加入null检查,如下所示:

  • @NonNullApi:在包级别上用于声明参数和返回值的默认行为分别是既不接受也不产生null值。
  • @NonNull: 用于不能使用的参数或返回值null(在适用的情况下不需要用于参数和返回值@NonNullApi)。
  • @Nullable: 用在参数或返回值上即可null

eg:List<EsProduct> getAllByProductName(@Nullable String productName);

2.4支持流式查询

 /***
     * 根据商品名称进行流的查询
     * @param productName
     * @return
     */
    Stream<EsProduct> findEsProductsByProductName(String productName);

2.5支持异步结果查询

/***
 * 根据商品名称查询
 * @param productName
 * @return
 */
@Async
List<EsProduct> getAllByProductName(@Nullable String productName);

个人搭建项目代码地址:
https://github.com/hongjiatao/spring-boot-anyDemo

欢迎收藏点赞三连。谢谢!有问题可以留言博主会24小时内无偿回复。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

有点东西且很多

你的鼓励是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值