ElasticsearchRestTemplate 和ElasticsearchRepository 的使用

news2024/11/17 9:39:49

操作ElasticSearch的数据,有两种方式一种是 ElasticsearchRepository 接口,另一种是ElasticsearchTemplate接口

SpringData对ES的封装ElasticsearchRestTemplate类,可直接使用,此类在ElasticsearchRestTemplate基础上进行性一定程度的封装,使用起来更方便灵活,拓展性更强。ElasticsearchRepository可以被继承操作ES,是SpringBoot对ES的高度封装,操作最为方便,但牺牲了灵活性。

 Spring boot 和Elasticsearch版本关系:

一、使用ElasticsearchRestTemplate类

    1.引用Maven类库

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

     2. 配置文件application.yml

spring:
  elasticsearch:
    rest:
      uris: http://192.168.10.202:9200
      connection-timeout: 1s
      read-timeout: 1m
      username: elastic
      password: elastic

注意,如果es资源没有开启x-pack安全插件的话,可以不加username和password(因为默认是没有的)。

3.创建实体类(用于JSON文档对象的转换)

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * @author Sinbad
 * @description: 测试ES对象<br />
 * @date 2022/8/26 17:12
 */
@Document(indexName = "mysql-test")
@Data
public class TestEsEntity {
    @Id  
    Long id;
    @Field(type = FieldType.Text, name = "addr")
    String addr;
    @Field(type = FieldType.Text, name = "name")
    String name;
    @Field(type = FieldType.Date, name = "birthday", pattern = "yyyy-MM-dd")
    LocalDate birthday;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8",locale = "zh_CN")
    @Field(type = FieldType.Date, name = "create_time", pattern = "yyyy-MM-dd HH:mm:ss",format =DateFormat.custom )
    LocalDateTime createTime;
}

 @Document注解:表示对应一个索引名相关的文档
@Data注解:lombok的,为类提供读写属性, 此外还提供了 equals()、hashCode()、toString() 方法
@Id 注解:表示文档的ID字段
@Field注解:文档字段的注解,对于日期含时间的字段,要写patten和format,不然会无法更新文档对象
@JsonFormat注解:将文档转换成JSON返回给前端时用到
注意日期类型字段不要用java.util.Date类型,要用java.time.LocalDate或java.time.LocalDateTime类型。

 测试实例:

import com.hkyctech.commons.base.entity.JsonResult;
import com.hkyctech.tu.core.vo.TestEsEntity ;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.Query;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;

 
@Slf4j
@Service
public class ElasticSearchServiceImpl {
    @Resource
    ElasticsearchRestTemplate elasticsearchTemplate; //直接注入就可以用了
    /***
     * @description 查询全部数据
     */
    public Object testSearchAll(){
        Query query=elasticsearchTemplate.matchAllQuery();
        return elasticsearchTemplate.search(query, TestEsEntity .class);
    }

    /***
    * @description  精确查询地址字段
    * @param keyword 搜索关键字
    */
    public Object testSearchAddr(String keyword) {
        NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
                //查询条件
                .withQuery(QueryBuilders.queryStringQuery(keyword).defaultField("addr"))
                //分页
                .withPageable(PageRequest.of(0, 10))
                //高亮字段显示
                .withHighlightFields(new HighlightBuilder.Field(keyword))
                .build();
        return elasticsearchTemplate.search(nativeSearchQuery, TestEsEntity .class);
    }

    /***
    * @description 组合查询,查询关键词不分词,关系and
    */
    public Object testComboSearchAnd(){
        BoolQueryBuilder esQuery=QueryBuilders.boolQuery()
                .must(QueryBuilders.termQuery("addr", "深圳"))
                .must(QueryBuilders.termQuery("addr", "广东"));

        NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
                //查询条件
                .withQuery(esQuery)
                //分页
                .withPageable(PageRequest.of(0, 10))
                .build();
        return elasticsearchTemplate.search(nativeSearchQuery, TestEsEntity .class);
    }


    /***
     * @description 组合查询,查询关键词不分词,关系or
     */
    public Object testComboSearchOr(){
        BoolQueryBuilder esQuery=QueryBuilders.boolQuery()
                .should(QueryBuilders.termQuery("addr", "深圳"))
                .should(QueryBuilders.termQuery("addr", "广东"));

        NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
                //查询条件
                .withQuery(esQuery)
                //分页
                .withPageable(PageRequest.of(0, 10))
                .build();
        return elasticsearchTemplate.search(nativeSearchQuery, TestEsEntity .class);
    }

    /***
    * @description  索引或更新文档
    * @param vo 文档对象
    */
    public JsonResult testPutDocument(TestEsEntity  vo){
        try {
            Object data = elasticsearchTemplate.save(vo);
            return JsonResult.getSuccessResult(data,"更新成功");
        }catch (Exception e){
            // 看http请求响应日志其实操作成功了,但是会报解析出错,可能是spring的bug,这里拦截一下
            String message=e.getMessage();
            if(message.indexOf("response=HTTP/1.1 200 OK")>0 || message.indexOf("response=HTTP/1.1 201 Created")>0){
                return JsonResult.getSuccessResult("更新成功");
            }
            return JsonResult.getFailResult(e.getStackTrace(),e.getMessage());
        }
    }

    /***
    * @description  删除文档
    * @param id 文档ID
    */
    public JsonResult deleteDocument(String id){
        try {
            elasticsearchTemplate.delete(id, TestEsEntity .class);
            return JsonResult.getSuccessResult("删除成功");
        }catch (Exception e){
            String message=e.getMessage();
            // 看http请求响应日志其实操作成功了,但是会报解析出错,可能是spring的bug,这里拦截一下
            if(message.indexOf("response=HTTP/1.1 200 OK")>0 ){
                return JsonResult.getSuccessResult("删除成功");
            }
            return JsonResult.getFailResult(e.getStackTrace(),e.getMessage());
        }
    }
}

二、使用ElasticsearchRepository 类

  1.引用Maven类库

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
 

  2. 配置文件application.yml

spring:
  elasticsearch:
    rest:
      uris: http://192.168.10.202:9200
      connection-timeout: 1s
      read-timeout: 1m
      username: elastic
      password: elastic

 3. 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;
 
@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();
}
 

 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();
}
 

 开发实例:

public interface LogRepository extends ElasticsearchRepository<Log, String> {
    /**
     * 定义一个方法查询:根据title查询es
     *
     * 原因:  ElasticsearchRepository会分析方法名,参数对应es中的field(这就是灵活之处)
     * @param title
   
     */

    List<Log> findBySummary(String summary);
    List<Log> findByTitle(String title);

	/**
     * 定义一个方法查询: 根据title,content查询es
     */
    List<Log> findByTitleAndContent(String title, String content);

}
 
   @PostMapping("save")
    public void save(@Validated @RequestBody Log req){
        Log dto = new Log();
        dto.setTitle(req.getTitle());
        dto.setSummary(req.getSummary());
        dto.setContent(req.getContent());
        dto.setCreateTime(new Date());
        dto.setId(req.getId());      
        LogRepository.save(dto);
        return ;
        } 

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

官网:Spring Data Elasticsearch - Reference Documentation

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/82922.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kibana:使用 Maps 来显示分布式的团队

在我之前的文章 “Kibana&#xff1a;如何在 Maps 应用中显示图片提示” 里&#xff0c;我展示了如何在 Kibana 中使用图片来展示一个图片的提示。这个在很多情况下是非常有用的&#xff0c;比如在疫情发生期间&#xff0c;我可以通过点击地图上的点来查看发生疫情人员的详细情…

ADI Blackfin DSP处理器-BF533的开发详解40:图像处理专题-GrayStretch 图像的灰度拉伸(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了图像的灰度拉伸&#xff0c;代码运行时&#xff0c;会通过文件系统打开工程文件根目下" …/ImageView"路径中的 t…

回归预测 | MATLAB实现WOA-GRU鲸鱼算法优化门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现WOA-GRU鲸鱼算法优化门控循环单元多输入单输出回归预测 目录回归预测 | MATLAB实现WOA-GRU鲸鱼算法优化门控循环单元多输入单输出回归预测写在前面效果一览基本描述模型描述程序设计参考资料写在前面 程序获取 | 机器学习/深度学习程序获取方式&#xff0…

Django学习第一天记录

1.安装Django(Windows环境) 首先需要确定系统中存在python环境&#xff0c;当前&#xff0c;本机的python环境为python 3.6.6&#xff0c;可以使用命令python --version进行查看。 在python环境成功搭建的基础上&#xff0c;我们使用命令pip install django即可进行django环境…

虚拟现实解决方案,实现 VR 数智机房

如今&#xff0c;虚拟现实技术作为连接虚拟世界和现实世界的桥梁&#xff0c;正加速各领域应用形成新场景、新模式、新业态。 图扑软件基于自研可视化引擎 HT for Web 搭建的 VR 数据中心机房&#xff0c;是将数据中心的运营搬到 VR 虚拟场景。以数据中心实际场景为基础&#…

Chaos Vantage这款渲染器有多强,一起来了解一下

Chaos Vantage 是最老牌渲染器之一的VRay开发公司Chaos新开发的一款实时GPU渲染引擎&#xff0c;以前的名字是Project Lavina&#xff0c;首次在Siggraph 2018上作为技术预览展示&#xff0c;官方定位是“在完全光线追踪环境中探索大型3D场景的工具”。 与其他实时渲染解决方案…

头戴式耳机适不适合跑步、分享几款最适合跑步的耳机

激情的运动和美妙的音乐毫无疑问是绝妙的搭配&#xff0c;几乎每天都驰骋在田径场上的我&#xff0c;一直非常关注运动耳机&#xff0c;也有不少朋友找我推荐运动耳机。运动耳机的选择有很多&#xff0c;但是极度靠谱的产品却是真的很少&#xff01;如果你也不希望你在选购运动…

双十二大家都在买哪些书?这份书单请码住

双十二来啦&#xff0c;这一天也在提醒着我们这一年就要结束了。虽然距离上次买买买才过去不久&#xff0c;但是想读的书却在时刻增加。 这个双十二&#xff0c;依旧给大家推荐好书&#xff0c;根据近期搜索人气、销量排行、读者口碑整理了“计算机新书”“2022最受欢迎图书”“…

C#+SqlServer超市管理系统的设计与实现

目 录 1引言 1 1.1课题研究内容 1 2系统需求分析 1 2.1系统模块构建 1 2.1.1系统整体结构功能模块 1 2.1.2前、后台功能模块 2 3 数据库设计 3 3.1 E-R图和关系图 3 3.2数据库表设计 4 4系统实现 7 4.1 前台模块 7 4.2 后台模块 14 5 结果测试 24 5.1前台模块的测试 24 5.2后台…

教你制作GIF表情包,逐帧动画制作

我们经常看到很多著名的电影场景都被制作成GIF动画&#xff0c;非常有趣。下面2分钟教你制作GIF表情包&#xff0c;方法很简单&#xff0c;一起来学习吧&#xff01; 方法一&#xff1a;手机制作GIF 我们来看看如何在手机上制作GIF&#xff0c;您需要使用刷新视频编辑工具。打开…

南方农机杂志南方农机杂志社南方农机编辑部2022年第24期目录

南方论坛《南方农机》投稿&#xff1a;cnqikantg126.com 基于物联网的食用菌日光温室终端控制研究 崔玉萍;席雪琴; 8-1016 基于颜色统计的水果采摘机器人水果识别的研究 夏康利;何强; 11-16 基于MATLAB/GUI双作用椭圆轨道滚柱泵人机界面设计 陈舰; 17-20 电动自…

nodejs 引用 canvas报错:without installing the canvas npm package

Error: Not implemented:HTMLCanvasElement. prototype.getContext(without installing the canvas npm package) 试了node 14.19.1 和 node 16.15.0 两个版本的都不行&#xff0c;即使是npm install canvas 成功了&#xff0c;运行也会报错&#xff0c;困扰了好久&#xff0c;…

【Python百日进阶-数据分析】Day125 - plotly.express.scatter():散点图

文章目录一、散点图语法二、参数三、返回类型四、示例4.1 array_like 对象4.2 DataFrame 列4.3 使用列名设置大小和颜色4.4 颜色可以是连续的&#xff0c;也可以是离散的/分类的。4.5 所述symbol参数可以被映射到的列&#xff0c;可以使用多种符号。4.6 Dash 中的散点图4.7 散点…

零基础转行学python有必要去培训机构吗

Python语言&#xff0c;以其简单易学成为不少人学习编程语言的新方向。而市面上也出来了各种各样的python培训机构&#xff0c;不少人就有疑惑了&#xff0c;既然python语言简单易学&#xff0c;那么还有必要去培训机构系统学习吗&#xff1f;知了堂认为&#xff0c;如果你是想…

人工智能:声纹识别技术介绍

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

使用gitee将本地资源上传

在编程时&#xff0c;写好本地文件以后我们可以使用gitee将写的东西上传到gitee官网上分享或者让我们自己可以随时查看&#xff0c;首先&#xff0c;我们需要下载git这个软件&#xff0c;在这里推荐使用电脑管家里面的软件管理下载 &#xff0c;软件图标如下&#xff1a; 1.生成…

自定义RBAC(4)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; 前面把RBAC的权限系统设计过程都讲清楚了&#xff0c;现在就来实现它。大致分这么几个步骤&#xff1a; 1、先定义出完整的权限系统表结构&#xff1b; 2、实现…

Sqlite 数据库操作(二)—— Sqlite常用API 及其使用方法

要使用sqlite数据库的API&#xff0c;需要满足两个条件&#xff1a; 安装sqlite3函数库 —— 终端输入 sudo apt-get install libsqlite3-dev 在程序中引入头文件 sqlite3.h —— #include <sqlite3.h>gcc编译时链接 sqlite3动态库 …

atompark:外贸工具-Atomic 6合一系列产品-Crack

Atomic Studio 邮件发件人Atomic Mail Sender 我们最畅销的电子邮件活动工具 邮件发件人 群发邮件发件人 使用我们内置的 SMTP 或您自己的&#xff01; 按姓名称呼收件人 移除退订者 电子邮件猎手 发现网站上的电子邮件地址 按关键字搜索 执行高速和准确的搜索 邮件验证器 …

Synchronized原理

Synchronized原理一、基本特点二、加锁工作过程 (锁升级/锁膨胀)2.1 偏向锁2.2 轻量级锁2.3 重量级锁三、锁消除四、锁粗化五、总结一、基本特点 结合锁策略&#xff0c;我们就可以总结出 Synchronized 具有以下特性(只考虑 JDK 1.8)&#xff1a; 开始时是乐观锁, 如果锁冲突…