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

Spring-Data-Elasticsearch

简介

Spring Data for Elasticsearch 是 Spring Data 项目的一部分,该项目旨在为新数据存储提供熟悉且一致的基于 Spring 的编程模型,同时保留特定于存储的特性和功能。

Spring Data Elasticsearch 项目提供了与 Elasticsearch 搜索引擎的集成。Spring Data Elasticsearch 的关键功能领域是以 POJO 为中心的模型,用于与 Elastichsearch 文档交互并轻松编写存储库样式的数据访问层。

简单使用

1.创建SpringBoot项目,导入Spring Data Elasticsearch的起步依赖。

/*elasticsearch的起步依赖*/ 
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>/*lomobok起步依赖*/<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>

2.编写配置文件,连接ElasticSearch

spring:elasticsearch:uris: https://192.168.66.101:9200username: elasticpassword: 12345678

 打印日志 

logging: pattern: console: '%d{HH:mm:ss.SSS} %clr(%-5level) --- [%-15thread] %cyan(%-50logger{50}):%msg%n'

ES8 开始,访问 ES 的协议从 http 变成了 https ,访问 https 请求 需要SSL 证书,在开发环境下我们不需要配置该证书,在项目中 添加一个配置类,跳过SSL 证书检查即可。

3.创建配置类跳过SSL证书检查 

@Component
public class RestClientBuilderCustomizerImpl implements RestClientBuilderCustomizer {@Overridepublic void customize(RestClientBuilder builder) {}/*** 跳过SSL的证书检查*/@Overridepublic void customize(HttpAsyncClientBuilder builder) {SSLContextBuilder sscb = SSLContexts.custom();try {sscb.loadTrustMaterial((chain, authType) -> {return true;});} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);} catch (KeyStoreException e) {throw new RuntimeException(e);}try {builder.setSSLContext(sscb.build());} catch (KeyManagementException | NoSuchAlgorithmException e) {e.printStackTrace();}}
}

 4.创建实体类

一个实体类的所有对象都会存入 ES 的一个索引中,所以我们在创建实体类时关联ES 索引
@Document(indexName = "product",createIndex = true)  //关联名为product的索引
@Data
@AllArgsConstructor
public class Product {@Id //标记在成员变量上,标记一个字段为主键,该字段的值会同步到ES该文档的id值//标记在成员变量上,标记为文档中的域,一般有如下属性->// type域的类型,index是否创建索引,store是否单独存储,analyzer分词器,searchAnalyzer搜索分词器@Field(type = FieldType.Integer,store = true,index = true)private Integer id;@Field(type = FieldType.Text,store = true,index = true,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")private String productName;@Field(type = FieldType.Text,store = true,index = true,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")private String productDesc;
}

 5.创建Repository接口

Repository 接口继承 ElasticsearchRepository, 该接口提供了文档的增删改查方法
@Repository
public interface ProductRepository extends ElasticsearchRepository<Product,Integer> {
}

6.测试Repository接口

6.1测试保存和修改方法

@SpringBootTest
public class ProductRepositoryTest {@Autowiredprivate ProductRepository repository;//保存文档public void addProduct(){Product product = new Product(1, "今天是第一天", "第一天plus");repository.save(product);}//修改方法(当该文档已经存在,即对其进行修改)public void addProduct(){Product product = new Product(1, "今天是第first天", "第first天plus");repository.save(product);}
}

6.2查找文档方法

6.2.1根据id进行查询
@Testpublic void findById(){Optional<Product> byId = repository.findById(1);System.out.println(byId.get());}
6.2.2查询所有文档
@Testpublic void findAll(){repository.findAll().forEach(System.out::println);}

6.3测试删除方法

//根据其主键id进行删除
@Testpublic void deleteById(){repository.deleteById(1);}

7.使用DSL语句查询文档

query 后的 json 对象称为 DSL语句 ,我们可以在接口方法上使用 @Query注解自定义 DSL 语句查询。

 在Repository接口层编写方法

7.1 匹配查询

@Repository
public interface ProductRepository extends ElasticsearchRepository<Product,Integer> {//匹配查询@Query("{\n" +"    \"match\": {\n" +"      \"productDesc\": \"?0\"\n" +"    }\n" +"  }")List<Product> findByProductDescMatch(String keyword);
}

7.2模糊查询

@Repository
public interface ProductRepository extends ElasticsearchRepository<Product,Integer> {@Query(" {\n" +"    \"match\": {\n" +"      \"productDesc\":{\n" +"        \"query\": \"\\?0\",\n" +"        \"fuzziness\": 1\n" +"      }\n" +"    }\n" +"  }")List<Product> findByProductDescFuzzy(String keyword);
}

8.按照规则命名方法查询文档

 1.只需在 Repository 接口中按照一定的规则命名方法,该方法就能完成相应的查询
2. 规则:查询方法以 findBy 开头,涉及查询条件时,条件的属性用条件关键字连接。

8.1单条件查询

@Repository
public interface ProductRepository extends ElasticsearchRepository<Product,Integer> {//根据规则进行查询-通过productNameList<Product> findByProductName(String productName);
}

测试:

@Testpublic void testFindByProductName(){List<Product> byProductName = repository.findByProductName("iphone");byProductName.forEach(System.out::println);}

8.2 多条件选择查询

@Repository
public interface ProductRepository extends ElasticsearchRepository<Product,Integer> {
//测试按照规则命名使用    Or 查询
List<Product> findByProductNameOrProductDesc(String productName,String productDesc);
}

测试:

@Testpublic void testFindByProductNameOrProductDesc(){repository.findByProductNameOrProductDesc("iphone","三体").forEach(System.out::println);}

8.3范围查询

@Repository
public interface ProductRepository extends ElasticsearchRepository<Product,Integer> {//测试使用命名规则进行  范围查询
List<Product> findByIdBetween(Integer start,Integer end);
}

测试:

@Testpublic void testFindByProductIdBetween(){repository.findByIdBetween(1,3).forEach(System.out::println);}

9.分页查询

在使用继承或自定义的方法时,在方法中添加 Pageable 类型的参 数,返回值为Page 类型即可进行分页查询。

9.1继承方法

@Testpublic void testFindPage(){//参数1:当前页,从0开始,参数2:每页显示多少条Pageable pageable = PageRequest.of(0,3);Page<Product> all = repository.findAll(pageable);System.out.println("总条数:"+all.getTotalElements());System.out.println("总页数:"+all.getTotalPages());System.out.println("数据:"+all.getContent());}

10.分页查询并排序

10.1继承方法

使用继承或自定义的方法时,在方法中添加 Sort 类型的参数即可进行结果排序。
 @Testpublic void testFindPage2(){//既分页,又排序Sort sort = Sort.by(Sort.Direction.DESC, "id");Pageable pageable = PageRequest.of(0,3,sort);Page<Product> all = repository.findByProductDescMatch("体",pageable);System.out.println("总条数:"+all.getTotalElements());System.out.println("总页数:"+all.getTotalPages());System.out.println("数据:"+all.getContent());}

相关文章:

Spring-Data-Elasticsearch

简介 Spring Data for Elasticsearch 是 Spring Data 项目的一部分&#xff0c;该项目旨在为新数据存储提供熟悉且一致的基于 Spring 的编程模型&#xff0c;同时保留特定于存储的特性和功能。 Spring Data Elasticsearch 项目提供了与 Elasticsearch 搜索引擎的集成。Spring…...

代码随想录二刷7.22|977.有序数组的平方

暴力解法&#xff1a; ——如果想暴力解决这个问题的话&#xff0c;可以像题目那样&#xff0c;先将每一个元素平方&#xff0c;然后再排序 双指针&#xff1a; ——从题目中找到的信息&#xff1a;这是一个非递减顺序的整数数组&#xff0c;从例子中&#xff0c;可以容易看…...

redis介绍与布署

redis remote dictionary server&#xff08;远程字典服务器&#xff09; 是一个开源的&#xff0c;使用c语言编写的非关系型数据库&#xff0c;支持内存运行并持久化&#xff0c;采用key-value的存储形式。 单进程模型意味着可以在一台服务器上启动多个redis进程&#xff0c;…...

PMON的解读和开发

提示&#xff1a;龙芯2K1000PMON相关记录 文章目录 1 PMON的发展和编译环境PMONPMON2000 2 PMON2000的目录结构3 Targets目录的组成4 PMON编译环境的建立5 PMON2000的框架6 异常向量表7 Pmon的空间分配8 PMON的汇编部分(starto.S或sbdreset.S)的解读Start.SC代码部分dbginit 9 …...

初识c++(构造函数,析构函数,拷贝构造函数,赋值运算符重载)

一、类的默认函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数。 #include<iostream> using namespace std; class Date { public:Date(){_year 1;_month 1;_day 1;cout << _year << "/" <&…...

CANoe:为什么两个VLAN接口不能设置同一个网络的IP地址呢?

经常玩CANoe的人应该配置过TCP/IP Stack中网络节点的网卡信息&#xff0c;基本的信息包含&#xff1a;MAC地址、IP地址、子网掩码、默认网关、MTU值、IPv6地址。 如果你想让发送出去的报文携带VLAN tag&#xff0c;可以在网卡上添加VLAN tag信息。 此时你就能得到两个新的网卡V…...

SpringBoot新手快速入门系列教程七:基于一个低配centoos服务器,如何通过宝塔面板部署一个SpringBoot项目

1&#xff0c;如何打包一个项目 通过IDEA自带的命令行&#xff0c;执行 ./gradlew clean build 2&#xff0c;检查生成的JAR文件 进入 build/libs 目录&#xff0c;你应该会看到一个类似 helloredis-0.0.1-SNAPSHOT.jar 的文件。 3&#xff1a;运行生成的JAR文件 你可以在…...

性能测试的流程(企业真实流程详解)(二)

性能测试的流程 1.需求分析以及需求确定(指标值&#xff0c;场景&#xff0c;环境&#xff0c;人员) 一般提出需求的人员有&#xff1a;客户&#xff0c;产品经理&#xff0c;项目组领导等 2.性能测试计划和方案制定 基准测试: 负觋测试: 压力测试: 稳定性测试: 其他:配置测试…...

使用sklearn的基本流程

scikit-learn&#xff0c;通常简称为 sklearn&#xff0c;是一个开源的Python库&#xff0c;是基于 Python 编程语言的一个非常流行的机器学习库。它建立在 NumPy 和 SciPy 这两个科学计算库之上&#xff0c;并与 Matplotlib 配合使用&#xff0c;为数据预处理、模型训练、评估…...

力扣题解(乘积为正数的最长子数组长度)

1567. 乘积为正数的最长子数组长度 已解答 中等 给你一个整数数组 nums &#xff0c;请你求出乘积为正数的最长子数组的长度。 一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。 请你返回乘积为正数的最长子数组长度。 本题要求乘积为正数&#xff0c;而整…...

PPTP、L2TP、IPSec、IPS 有什么区别?

随着互联网的发展&#xff0c;保护网络通信的安全越来越重要。PPTP、L2TP、IPSec、IPS是常见的网络安全协议和技术&#xff0c;在保护网络通信安全方面发挥着不同的作用和特点。下面介绍PPTP、L2TP、IPSec、IPS之间的区别。 点对点隧道协议&#xff08;PPTP&#xff09;是一种用…...

SpringBoot注解--11--@JSONField @JsonProperty

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一个问题&#xff1a;后端实体类isXXX开头的属性&#xff0c;传到前端后自动去掉is解决方法&#xff1a; JsonProperty和JSONField1.简介2.注解的区别2.1 底层框架不…...

C语言 | Leetcode C语言题解之第221题最大正方形

题目&#xff1a; 题解&#xff1a; int maximalSquare(char** matrix, int matrixSize, int* matrixColSize){int dp[301][301]{0};int wid0;if(matrixSize0&&matrixColSize[0]0){return 0;}for(int i0;i<matrixSize;i){for(int j0;j<matrixColSize[0];j){if(m…...

AI数据服务如何驱使AI商业化,实现在各行业落地融合

AI技术经历数十载的发展&#xff0c;正在加速向各行各业渗透。近年来深度学习加速了人工智能技术的商业化落地的同时&#xff0c;也带来了大量AI算法训练需求&#xff0c;推动AI数据服务市场的快速增长。作为AI快速发展的“基石”&#xff0c;AI数据服务AI数据服务如何驱使AI在…...

户用光伏项目开发流程

1、收集业主信息 管理业主基本信息&#xff0c;包括但不限于联系方式、地址、房屋信息等。 2、业主开卡 每户都需要办理银行卡&#xff0c;用于电费结算和划转。 3、合同签约 业主开卡完成之后&#xff0c;平台方发起签约&#xff08;支持线上签约&#xff09;&#xff0c…...

C++ 函数返回值是引用类型使用场景

目录 1、希望返回函数内部的局部静态变量或全局变量 2、希望通过函数返回一个对象的成员变量 3、希望实现链式操作 4、避免对象的拷贝 5、需要注意的事项 在C中&#xff0c;函数的返回值可以是引用类型的情况主要有以下几种&#xff1a; 1、希望返回函数内部的局部静态变…...

CUDA原子操作

代码 #include <cuda_runtime.h> #include <stdio.h>__global__ void atomicAddAndGet(int *result, int *valueToAdd) {// 原子加法int addedValue atomicAdd(result, *valueToAdd);// 通过原子操作后读取值&#xff0c;确保是加法后的值addedValue *valueToAd…...

08.C2W3.Auto-complete and Language Models

往期文章请点这里 目录 N-Grams: OverviewN-grams and ProbabilitiesN-gramsSequence notationUnigram probabilityBigram probabilityTrigram ProbabilityN -gram probabilityQuiz Sequence ProbabilitiesProbability of a sequenceSequence probability shortcomingsApproxi…...

【linux】log 保存和过滤

log 保存 ./run.sh 2>&1 | tee -a /home/name/log.txt log 过滤 import os import re# Expanded regular expression to match a wider range of error patterns error_patterns re.compile(# r(error|exception|traceback|fail|failed|fatal|critical|warn|warning…...

GeoTrust ——适合企业使用的SSL证书!

GeoTrust是一家全球知名的数字证书颁发机构&#xff08;CA&#xff09;&#xff0c;其提供的SSL证书非常适合企业使用。GeoTrust的SSL证书为企业带来了多重优势&#xff0c;不仅在验证级别、加密强度、兼容性、客户服务等方面表现出色&#xff0c;而且其高性价比和灵活的证书选…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...