Spring Data Elasticsearch 中 ElasticsearchOperations 构建查询条件的详解
Spring Data Elasticsearch 中 ElasticsearchOperations 构建查询条件的详解
- 前言
- 一、引入依赖
- 二、配置 Elasticsearch
- 三、创建模型类(Entity)
- 四、使用 `ElasticsearchOperations` 进行 CRUD 操作
- 1. 保存数据(Create)
- 2. 获取数据(Read)
- 3. 更新数据(Update)
- 4. 删除数据(Delete)
- 五、构建查询条件:使用 `Criteria` 和 `CriteriaQuery`
- 六、注解配置 Elasticsearch 索引和字段映射
- 1. `@Document` 注解
- 2. `@Id` 注解
- 3. `@Field` 注解
- 4. `@Setting` 注解
- 总结
前言
在现代开发中,搜索引擎技术被广泛应用于处理大量数据和实现高效的查询。在这些技术中,Elasticsearch 是一个非常强大的工具,而 Spring Data Elasticsearch 提供了与之进行交互的便利工具。本篇文章将详细介绍如何使用 ElasticsearchOperations 进行常见查询构建操作,重点是通过 Criteria 和 Query 来构建查询条件,并演示如何使用它们进行增、删、改、查等常见操作。
一、引入依赖
首先,我们需要在 pom.xml
中添加相关的依赖,以便能够使用 Spring Data Elasticsearch 提供的功能。
<!-- Elasticsearch --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>
二、配置 Elasticsearch
在应用的 application.yaml
文件中,我们需要配置 Elasticsearch 的连接信息,通常是一个本地或远程的 Elasticsearch 。
spring:elasticsearch:uris: 127.0.0.1:9200username: elasticpassword: xxxxxxxxxxssl:verification-mode: none
这个配置将使得 Spring Data Elasticsearch 通过 ElasticsearchOperations 连接到你的 Elasticsearch 。
三、创建模型类(Entity)
在进行 Elasticsearch 操作时,通常需要一个与 Elasticsearch 索引相对应的模型类。我们以 Product 类为例:
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;
@Data
@Document(indexName = "products", createIndex = true) // 指定索引名称,并且会自动创建索引
public class Product {@Idprivate Long id; // Elasticsearch 会自动使用此字段作为文档的唯一标识@Field(type = FieldType.Text, analyzer = "standard") // 用来指定 Elasticsearch 中字段的数据类型和分词器private String name;@Field(type = FieldType.Double) // 指定字段类型为 Double 类型private Double price;}
此类将用于与 Elasticsearch 中的 products
索引进行交互。
四、使用 ElasticsearchOperations
进行 CRUD 操作
1. 保存数据(Create)
使用 ElasticsearchOperations
保存数据非常简单。你只需要创建一个 Product
对象并调用 save()
方法。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.junit.jupiter.api.Test;public class ProductServiceTest {@Autowiredprivate ElasticsearchOperations elasticsearchOperations;@Testpublic void testSaveProduct() {Product product = new Product();product.setId(1L);product.setName("手机");product.setPrice(2999.0);Product savedProduct = elasticsearchOperations.save(product); // 保存到 ElasticsearchSystem.out.println("Saved Product: " + savedProduct);}
}
这个简单的示例展示了如何通过 ElasticsearchOperations
保存一个 Product
对象。返回的 savedProduct
是保存后的对象,包含了 Elasticsearch 生成的 ID(如果没有指定的话)。
2. 获取数据(Read)
可以通过 get()
方法根据 ID 获取单个文档,或者通过 search()
方法根据查询条件获取多个文档。
获取单个文档:
@Test
public void testGetProductById() {Product product = elasticsearchOperations.get("1", Product.class); // 通过 ID 获取文档System.out.println("Retrieved Product: " + product);
}
查询多个文档:
可以通过 Criteria
来构建查询条件,然后使用 search()
方法来查询匹配的文档。
import org.springframework.data.elasticsearch.core.query.Criteria;
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
import org.springframework.data.domain.PageRequest;@Test
public void testSearchProductsByName() {// 构建查询条件Criteria criteria = new Criteria("name").is("手机");CriteriaQuery query = new CriteriaQuery(criteria);query.setPageable(PageRequest.of(0, 10)); // 设置分页// 执行查询SearchHits<Product> results = elasticsearchOperations.search(query, Product.class);results.forEach(hit -> System.out.println("Product: " + hit.getContent()));
}
展示了如何根据商品名称进行查询,并使用分页来限制返回的结果。
3. 更新数据(Update)
通常情况下,save()
方法会在 Elasticsearch 中执行插入或更新操作。如果想更新已有的文档,只需要重新保存即可。例如:
@Test
public void testUpdateProduct() {Product product = elasticsearchOperations.get("1", Product.class);product.setPrice(2599.0); // 修改价格elasticsearchOperations.save(product); // 保存会自动执行更新
}
4. 删除数据(Delete)
删除数据可以通过 delete() 方法来完成,只需要传入文档的 ID。
@Test
public void testDeleteProduct() {elasticsearchOperations.delete("1", Product.class); // 删除指定 ID 的文档
}
五、构建查询条件:使用 Criteria
和 CriteriaQuery
ElasticsearchOperations
允许我们通过 Criteria
来构建查询条件。Criteria
类可以用来构建多种查询,包括等值查询、范围查询等。你可以通过组合 Criteria
对象来创建复杂的查询。
常见查询条件
-
等值查询
Criteria criteria = new Criteria("name").is("手机");
-
范围查询
Criteria criteria = new Criteria("price").between(1000, 5000);
-
大于查询
Criteria criteria = new Criteria("price").greaterThan(1000);
-
小于查询
Criteria criteria = new Criteria("price").lessThan(5000);
-
模糊查询
Criteria criteria = new Criteria("name").contains("平板");
-
集合成员查询
-
in(...)
在字段中查找包含在给定集合或数组内的文档。
// 等同于 terms 查询,适用于 Keyword 或不分词字段 Criteria c = new Criteria("status").in("ACTIVE", "PENDING");
-
notIn(...)
排除指定集合或数组中的值。
// 排除 status 为 ACTIVE 或 PENDING 的文档 Criteria c = new Criteria("status").notIn("ACTIVE", "PENDING");
-
-
多条件查询
Criteria criteria1 = new Criteria("name").is("手机"); Criteria criteria2 = new Criteria("price").greaterThan(2000); CriteriaQuery query = new CriteriaQuery(criteria1.and(criteria2)); // AND 查询
-
分页和排序
分页和排序对于大数据量查询非常重要。可以使用 Pageable 来进行分页设置,使用 Sort 来进行排序。
分页查询
query.setPageable(PageRequest.of(0, 10)); // 获取第1页,每页10条记录
排序查询
query.addSort(Sort.by(Sort.Order.asc("price"))); // 按价格升序排序
复合查询
使用
CriteriaQuery
,你可以将多个查询条件通过and
或or
进行组合:Criteria criteria1 = new Criteria("name").is("手机"); Criteria criteria2 = new Criteria("price").greaterThan(2000); CriteriaQuery query = new CriteriaQuery(criteria1.and(criteria2)); // AND 查询
六、注解配置 Elasticsearch 索引和字段映射
1. @Document
注解
@Document
注解用于指定类对应的 Elasticsearch 索引。在索引的配置中,可以指定索引名称、是否自动创建索引等。
@Document(indexName = "products", createIndex = true) // 指定索引名称,并且会自动创建索引
public class Product {@Idprivate Long id;@Field(type = FieldType.Text, analyzer = "standard") // 用来指定 Elasticsearch 中字段的数据类型和分词器private String name;@Field(type = FieldType.Double) // 指定字段类型为 Double 类型private Double price;
}
2. @Id
注解
@Id
注解用于标识文档的唯一标识符字段。这个字段会被作为 Elasticsearch 索引文档的 _id
。
@Id
private String id;
3. @Field
注解
@Field
注解用于指定字段在 Elasticsearch 中的类型、分词器等配置。它支持多种类型,如 Text
、Keyword
、Double
等,并且可以配置分词器(analyzer
)等属性。
@Field(type = FieldType.Text, analyzer = "standard")
private String name;@Field(type = FieldType.Double)
private Double price;
4. @Setting
注解
还可以使用 @Setting
注解来配置索引的详细设置,如分片数、副本数等。
@Setting(shards = 3, replicas = 2)
@Document(indexName = "products")
public class Product {// Fields ...
}
总结
-
ElasticsearchOperations
:适合常见 CRUD 和基础查询(等值、范围、模糊、组合、分页、排序)。 -
Criteria
+CriteriaQuery
:以链式方式构建查询,无需掌握原生 DSL 语法。 -
注解映射:通过
@Document
、@Field
、@Setting
精细控制索引与字段。 -
对于聚合、高亮、异步和大批量操作等高级需求,应使用
ElasticsearchRestTemplate
或直接调用 Elasticsearch Java 客户端。
相关文章:
Spring Data Elasticsearch 中 ElasticsearchOperations 构建查询条件的详解
Spring Data Elasticsearch 中 ElasticsearchOperations 构建查询条件的详解 前言一、引入依赖二、配置 Elasticsearch三、创建模型类(Entity)四、使用 ElasticsearchOperations 进行 CRUD 操作1. 保存数据(Create)2. 获取数据&am…...
react-router基本写法
1. 创建项目并安装所有依赖 npx create-react-app react-router-pro npm i 2. 安装所有的 react router 包 npm i react-router-dom 3. 启动项目 npm run start router/index.js // 创建路由实例 绑定path elementimport Layout from "/pages/Layout"; import…...

【Matlab】最新版2025a发布,深色模式、Copilot编程助手上线!
文章目录 一、软件安装1.1 系统配置要求1.2 安装 二、新版功能探索2.1 界面图标和深色主题2.2 MATLAB Copilot AI助手2.3 绘图区升级2.4 simulink2.5 更多 延迟一个月,终于发布了🤭。 一、软件安装 1.1 系统配置要求 现在的电脑都没问题,老…...
智能语音助手的未来:从交互到融合
摘要 随着人工智能技术的不断进步,智能语音助手已经成为我们生活中不可或缺的一部分。从简单的语音指令到复杂的多模态交互,语音助手正在经历一场深刻的变革。本文将探讨智能语音助手的发展历程、当前的技术瓶颈以及未来的发展方向,特别是其在…...

uniapp,小程序中实现文本“展开/收起“功能的最佳实践
文章目录 示例需求分析实现思路代码实现1. HTML结构2. 数据管理3. 展开/收起逻辑4. CSS样式 优化技巧1. 性能优化2. 防止事件冒泡3. 列表更新处理 实际效果总结 在移动端应用开发中,文本内容的"展开/收起"功能是提升用户体验的常见设计。当列表项中包含大…...

思维链框架:LLMChain,OpenAI,PromptTemplate
什么是思维链,怎么实现 目录 什么是思维链,怎么实现思维链(Chain of Thought)在代码中的实现方式1. 手动构建思维链提示2. 少样本思维链提示3. 自动思维链生成4. 思维链与工具使用结合5. 使用现有思维链框架:LLMChain,OpenAI,PromptTemplate思维链实现的关键要点思维链(C…...
HOT100 (哈希双指针)
哈希 1.两数之和(unordered_map) 给定一个整数数组 nums 和一个整数目标值 target,返回满足条件的数组下标 思路:用umap,一边遍历,一边装; class Solution {public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,int> u…...

使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据(申请key教程)
使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据 目录 使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据📌 简介🛠 插件安装方法🌍 下载 DEM 数据步骤🔑 注册 OpenTopography 账号(如使用 Cope…...

计算机组成与体系结构:替换策略(MRU LRU PLRU LFU)
目录 🎲 MRU(最近最常使用) 🪜 操作流程: 🎲 LRU(最近最少使用) 🪜 操作流程: 示例 🔍 Age Bits(年龄位) 核心思想…...

websocket入门详解
入门websocket的基础应该掌握一下问题: 1、什么是握手? 2、什么是websocket? 3、websocket和http的区别,应用场景 4、html前端简单代码演示 5、springboot整合websocket使用 6、使用vueelementui打造简单聊天室 7、使用web…...
《数字藏品社交化破局:React Native与Flutter的创新实践指南》
NFT,这种非同质化代币,赋予了数字资产独一无二的身份标识,从数字艺术作品到限量版虚拟物品,每一件NFT数字藏品都承载着独特的价值与意义。当React Native和Flutter这两大跨平台开发框架遇上NFT数字藏品,一场技术与创意…...

(6)python开发经验
文章目录 1 QListWidget样式显示异常2 模块编码错误3 qtcreator开发pyqt编码错误 更多精彩内容👉内容导航 👈👉Qt开发 👈👉python开发 👈 1 QListWidget样式显示异常 main.py import sys from PySide6.QtWi…...

HPC软件使用之ANSYS Fluent
目录 一、软件介绍 二、脚本编写 2.1 jou文件 2.2 slurm脚本文件 三、作业提交及查看 四、案例演示 4.1 网格模型 4.2 jou脚本 4.3 slurm脚本 4.4 计算 4.5 结果查看 从本文开始,我们将介绍如何在超级计算机上使用科学计算、工程仿真计算软件开展计算&am…...

YOLO11解决方案之距离计算探索
概述 Ultralytics提供了一系列的解决方案,利用YOLO11解决现实世界的问题,包括物体计数、模糊处理、热力图、安防系统、速度估计、物体追踪等多个方面的应用。 测量两个物体之间的间距被称为特定空间内的距离计算,YOLO11使用两个边界框的中心…...

论文学习_Precise and Accurate Patch Presence Test for Binaries
摘要:打补丁是应对软件漏洞的主要手段,及时将补丁应用到所有受影响的软件上至关重要,然而这一点在实际中常常难以做到,研究背景。因此,准确检测安全补丁是否已被集成进软件发行版本的能力,对于防御者和攻击…...

Ascend的aclgraph(九)AclConcreteGraph:e2e执行aclgraph
1回顾 前面的几章内容探讨了aclgraph运行过程中的涉及到的关键模块和技术。本章节将前面涉及到的模块串联起来,对aclgraph形成一个端到端的了解。 先给出端到端运行的代码,如下: import torch import torch_npu import torchair import log…...
JSX语法介绍
文章目录 JSX介绍JSX的引入JSX的全称babel转换工具 JSX的基本语法创建组件的第一种方式创建组件父组件传值给子组件 class 关键字的介绍class的基本用法:使用class创建对象使用 class 实现 JS 中的继承 创建组件的第二种方式:使用 class 关键字父组件传值…...
增强 HTNN 服务网格功能:基于 Istio 的BasicAuth 与 ACL 插件开发实战
目录 1.引言 什么是HTNN? 为什么开发 BasicAuth 和 ACL 插件? 2.技术背景 技术栈概览 Istio 与服务网格简述 HTNN 框架与插件机制概览 3.插件开发详解:BasicAuth 与 ACL 3.1 BasicAuth插件 功能点 实现细节 3.2 ACL插件 功能点 …...

c++从入门到精通(四)--动态内存,模板与泛型编程
文章目录 动态内存直接管理内存Shared_ptr类Unique_ptrWeak_ptr动态数组allocator类文本查询程序 模板与泛型编程定义模板函数模板类模板模板参数成员模板控制实例化 模板实参推断重载与模板可变参数模板模板特例化 动态内存 c中动态内存的管理是通过new和delete运算符来实现的…...
C盘清理秘籍:快速提升系统性能
C盘清理的重要性 C盘作为系统盘,存储着操作系统和关键程序文件。随着使用时间的增加,C盘空间会逐渐被占用,导致系统运行缓慢、程序启动延迟等问题。定期清理C盘可以有效提升系统性能,延长硬盘寿命。 清理临时文件 Windows系统在…...
从 Vue3 回望 Vue2:组件设计升级——Options API vs Composition API
文章目录 从 Vue3 回望 Vue2:组件设计升级——Options API vs Composition API1、组件范式:框架设计思想的投影2、Vue2:Options API 的结构与局限结构清晰:新手友好、职责分明核心痛点:逻辑分散,难以聚合复…...

寻找两个正序数组的中位数 - 困难
************* Python topic: 4. 寻找两个正序数组的中位数 - 力扣(LeetCode) ************* Give the topic an inspection. Do the old topic will give you some new sparks. Before that, I do some really good craetive things about my logo. …...

国产密码新时代!华测国密 SSL 证书解锁安全新高度
在数字安全被提升到国家战略高度的今天,国产密码算法成为筑牢网络安全防线的关键力量。华测国密SSL证书凭借其强大性能与贴心服务,为企业网络安全保驾护航,成为符合国家安全要求的不二之选! 智能兼容,告别浏览器适配…...

【金仓数据库征文】从云计算到区块链:金仓数据库的颠覆性创新之路
目录 一、引言 二、金仓数据库概述 2.1 金仓数据库的背景 2.2 核心技术特点 2.3 行业应用案例 三、金仓数据库的产品优化提案 3.1 性能优化 3.1.1 查询优化 3.1.2 索引优化 3.1.3 缓存优化 3.2 可扩展性优化 3.2.1 水平扩展与分区设计 3.2.2 负载均衡与读写分离 …...
互联网大厂Java求职面试:AI与大模型集成的云原生架构设计
互联网大厂Java求职面试:AI与大模型集成的云原生架构设计 引言 在现代互联网企业中,AI与大模型技术的应用已经成为不可或缺的一部分。特别是在短视频平台、电商平台和金融科技等领域,如何高效地将大模型集成到现有的云原生架构中是一个巨大…...

股指期货套期保值怎么操作?
股指期货套期保值就是企业或投资者通过持有与其现货市场头寸相反的期货合约,来对冲价格风险的一种方式。换句话说,就是你在股票市场上买了股票(现货),担心股价下跌会亏钱,于是就在期货市场上卖出相应的股指…...

基于IBM BAW的Case Management进行项目管理示例
说明:使用IBM BAW的难点是如何充分利用其现有功能根据实际业务需要进行设计,本文是示例教程,因CASE Manager使用非常简单,这里重点是说明如何基于CASE Manager进行项目管理,重点在方案设计思路上,其中涉及的…...

黑马k8s(七)
1.Pod介绍 查看版本: 查看类型,这里加s跟不加s没啥区别,可加可不加 2.Pod基本配置 3.镜像拉去策略 本地没有这个镜像,策略是Never,启动失败 查看拉去策略: 更改拉去策略: 4.启动命令 运行的是nginx、busv…...

九、HQL DQL七大查询子句
作者:IvanCodes 日期:2025年5月15日 专栏:Hive教程 Apache Hive 的强大之处在于其类 SQL 的查询语言 HQL,它使得熟悉 SQL 的用户能够轻松地对存储在大规模分布式系统(如 HDFS)中的数据进行复杂的查询和分析…...
基于中心点预测的视觉评估与可视化流程
基于中心点预测的视觉评估与可视化流程 基于中心点预测的视觉评估与可视化流程一、脚本功能概览二、可视化与评分机制详解1. 真实框解析2. 调用模型处理帧3. 预测中心点与真实值的对比4. 打分策略5. 图像可视化三、目录结构要求四、运行方式五、应用场景与拓展思路六、总结七,…...