当前位置: 首页 > news >正文

ES之三:springboot集成ES

一.选择版本很重要,不然会找不到好多方法

明明有Timeout方法,不报红,运行时,报错,找不到该类 ClassNotFoundException

为了避免使用的Elasticsearch版本和SpringBoot采用的版本不一致导致的问题,尽量使用一致的版本。下表是对应关系:

在这里插入图片描述

Spring BootSpring Data ElasticsearchElasticsearch
2.4.x4.1.x7.9.x
2.5.x4.2.x7.12.x
2.6.x4.3.x7.15.x
2.7.x4.4.x7.17.x

我的项目用的 springboot-2.7.7
在这里插入图片描述

在这里插入图片描述

四、实体映射

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDate;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;/*** 商品表* @TableName sys_model*/
@TableName(value ="sys_model")
@Data
@Document(indexName = "sys_model")
public class Model implements Serializable {/*** 主键*/@Id@TableId(value = "sys_id")@Field(type = FieldType.Keyword)private String sysId;/*** 对象Id*/@TableField(value = "object_id")@Field(type = FieldType.Keyword)private String objectId;/*** 商品订单号*/@TableField(value = "out_trade_no")@Field(type = FieldType.Keyword)private String outTradeNo;/*** 金额*/@TableField(value = "total_amount")@Field(type = FieldType.Keyword)private String totalAmount;/*** 商品名称*/@TableField(value = "subject")@Field(type = FieldType.Text)private String subject;/*** 是否支付 0 已支付 1未支付*/@TableField(value = "is_pay")@Field(type = FieldType.Integer)private Integer isPay;/*** 是否有效*/@TableField(value = "active")@Field(type = FieldType.Integer)private Integer active;/*** 创建时间*/@TableField(value = "create_time")@Field(type = FieldType.Date)private LocalDate createTime;/*** 修改时间*/@TableField(value = "update_time")@Field(type = FieldType.Date)private LocalDate updateTime;/*** 创建人*/@TableField(value = "create_by")@Field(type = FieldType.Keyword)private String createBy;/*** 修改然*/@TableField(value = "update_by")@Field(type = FieldType.Keyword)private String updateBy;@TableField(exist = false)private static final long serialVersionUID = 1L;
}

以下是对注释的讲解

@Document :
应用于类级别,表示该类是映射到数据库的候选对象。
重要属性:
indexName :存储此实体的索引名称,可包含 SpEL 模板表达式。
createIndex :标记在存储库引导中是否创建索引,默认值为 true 。
versionType :版本管理的配置,默认值为 EXTERNAL 。
@Id :
应用于字段级别,标记用于标识目的的字段。
@Transient :
应用于字段,默认情况下所有字段都映射到文档,该注释使此字段不被包含。
@PersistenceConstructor :
标记从数据库实例化对象时要使用的给定构造函数,参数按名称映射到检索到的文档中的键值。
@Field :
应用于字段级别,定义字段属性。
属性包括:
name :字段在 Elasticsearch 文档中的名称,未设置时使用 Java 字段名称。
type :字段类型,如多种类型可选。
format 和日期类型的 pattern :日期类型必须定义。
store :标记是否存储原始字段值,默认值为 false 。
analyzer 、 searchAnalyzer 、 normalizer :用于指定自定义分析和正规化。
@GeoPoint :
将字段标记为 geo_point 数据类型,若字段是 GeoPoint 类实例可省略。
@ValueConverter :
定义用于转换给定属性的类,仅转换带注释的属性。
@Setting :
定义不同的索引设置。
参数包括:
useServerConfiguration :不发送任何设置参数,由 Elasticsearch 服务器配置确定。
settingPath :指定义必须在类路径中解析的设置的 JSON 文件。
shards :要使用的分片数,默认为 1 。
replicas :副本数,默认为 1 。
refreshIntervall :默认为 1s 。
indexStoreType :默认为 fs 。

五、CRUD

主要有以下4个类

  • IndexOperations 在索引级别定义操作,例如创建或删除索引。
  • DocumentOperations 定义根据其ID存储,更新和检索实体的操作。
  • SearchOperations 定义使用查询搜索多个实体的动作
  • ElasticsearchOperations 结合DocumentOperations和SearchOperations的接口
  • ElasticsearchRestTemplate 是ElasticsearchOperations的实现类

日常使用时,使用ElasticsearchRestTemplate即可,代码如下

@Autowired
private ElasticsearchRestTemplate template;
1、操作索引
// 获取IndexOperations对象
IndexOperations indexOperations = template.indexOps(Model.class);
// 查
boolean exists = indexOperations.exists();
// 删
boolean delete = indexOperations.delete();
// 增
boolean flag = indexOperations.create();
// 设置Mapping
boolean mapping = indexOperations.putMapping();
2、条件搜索
使用 QueryBuilder 完成各种条件查询的示例@Testvoid getInfoByCondition() {// 创建一个 matchAllQueryQueryBuilder queryBuilder = QueryBuilders.matchAllQuery();// 条件查询:精确匹配QueryBuilder exactMatchQuery = QueryBuilders.termQuery("fieldName", "value");// 条件查询:范围匹配QueryBuilder rangeQuery = QueryBuilders.rangeQuery("numericField").from(10).to(20);// 条件查询:短语匹配QueryBuilder phraseMatchQuery = QueryBuilders.matchPhraseQuery("textField", "phrase");// 条件查询:布尔查询QueryBuilder boolQuery = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("field1", "value1")).mustNot(QueryBuilders.termQuery("field2", "value2")).should(QueryBuilders.termQuery("field3", "value3"));// 条件查询:模糊匹配QueryBuilder fuzzyQuery = QueryBuilders.fuzzyQuery("fieldName", "value");// 将查询构建器添加到搜索源构建器中SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(queryBuilder);}~~~
# 六、ElasticsearchRepository
一个类似于Spring Data JPA的文档操作方法#### 1、新建一个Model的数据持久层

package com.elasticsearch.repository;

import com.elasticsearch.domain.Model;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

/**

  • @Author:jackma
  • @name:ModelRepository
  • @Date:2024/7/20 22:36
    */
    @Repository
    public interface ModelRepository extends ElasticsearchRepository<Model,String> {
    }
    建立此持久层后,如果User实体@Document注解内的createIndex为true时(默认为true),则服务启动时会先检查索引是否存在,若不存在则会自动创建索引

2、默认的CRUD示例
// 增/改
Model model = new Model(1, “张三”, 18, “上海市闵行区”, LocalDateTime.now());
Model save = repository.save(model);

// 查
Optional optionalModel = repository.findById(1);

// 删
repository.deleteById(1);

————————————————

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JavaScript基础面试题:(第二天)
  • 搞定JavaScript异步原理,深入学习Promise
  • 什么是TypeScript?
  • python测试开发基础---multiprocessing.Pool
  • 机器人笛卡尔空间轨迹规划原理与MATLAB实现
  • OpenXR Monado compositor处理应用layers(cheduled->delivered)
  • 深入掌握 Go 语言中的数值类型与循环技巧
  • Gitlab删除本地标签和分支
  • 【操作系统原理】第三章——进程线程模型(上)
  • 【Python 千题 —— 算法篇】重复字符查找
  • 把设计模式用起来!(2)
  • 【全网首发】2024数学建模国赛E题31页word版成品论文【附带完整解题代码+可视化图表】
  • PostgreSQL的基础知识
  • 1. Fabric.js安装使用
  • 110001安庆巡检_工艺巡检
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • Apache Zeppelin在Apache Trafodion上的可视化
  • Flex布局到底解决了什么问题
  • HTTP中的ETag在移动客户端的应用
  • IDEA 插件开发入门教程
  • isset在php5.6-和php7.0+的一些差异
  • Java,console输出实时的转向GUI textbox
  • JavaScript服务器推送技术之 WebSocket
  • JS变量作用域
  • Meteor的表单提交:Form
  • Promise面试题2实现异步串行执行
  • socket.io+express实现聊天室的思考(三)
  • spring + angular 实现导出excel
  • SQLServer之创建显式事务
  • Vim Clutch | 面向脚踏板编程……
  • 爬虫模拟登陆 SegmentFault
  • Android开发者必备:推荐一款助力开发的开源APP
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 积累各种好的链接
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (3)llvm ir转换过程
  • (3)STL算法之搜索
  • (AngularJS)Angular 控制器之间通信初探
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (ZT)薛涌:谈贫说富
  • (差分)胡桃爱原石
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (算法)硬币问题
  • (一)Docker基本介绍
  • ******IT公司面试题汇总+优秀技术博客汇总
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • .Net Core与存储过程(一)