Spring Data Elasticsearch 中 ElasticsearchOperations 构建查询条件的详解

news2025/5/18 5:40:53

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:9200
    username: elastic
    password: xxxxxxxxxx
    ssl:
      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 {

    @Id
    private 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 {

    @Autowired
    private ElasticsearchOperations elasticsearchOperations;

    @Test
    public void testSaveProduct() {
        Product product = new Product();
        product.setId(1L);
        product.setName("手机");
        product.setPrice(2999.0);

        Product savedProduct = elasticsearchOperations.save(product);  // 保存到 Elasticsearch
        System.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 的文档
}

五、构建查询条件:使用 CriteriaCriteriaQuery

ElasticsearchOperations 允许我们通过 Criteria 来构建查询条件。Criteria 类可以用来构建多种查询,包括等值查询、范围查询等。你可以通过组合 Criteria 对象来创建复杂的查询。

常见查询条件

  1. 等值查询

    Criteria criteria = new Criteria("name").is("手机");
    
  2. 范围查询

    Criteria criteria = new Criteria("price").between(1000, 5000);
    
  3. 大于查询

    Criteria criteria = new Criteria("price").greaterThan(1000);
    
  4. 小于查询

    Criteria criteria = new Criteria("price").lessThan(5000);
    
  5. 模糊查询

    Criteria criteria = new Criteria("name").contains("平板");
    
  6. 集合成员查询

    • in(...)

      在字段中查找包含在给定集合或数组内的文档。

      // 等同于 terms 查询,适用于 Keyword 或不分词字段
      Criteria c = new Criteria("status").in("ACTIVE", "PENDING");
      
    • notIn(...)

      排除指定集合或数组中的值。

      // 排除 status 为 ACTIVE 或 PENDING 的文档
      Criteria c = new Criteria("status").notIn("ACTIVE", "PENDING");
      
  7. 多条件查询

    Criteria criteria1 = new Criteria("name").is("手机");
    Criteria criteria2 = new Criteria("price").greaterThan(2000);
    CriteriaQuery query = new CriteriaQuery(criteria1.and(criteria2));  // AND 查询
    
  8. 分页和排序

    分页和排序对于大数据量查询非常重要。可以使用 Pageable 来进行分页设置,使用 Sort 来进行排序。

    分页查询

    query.setPageable(PageRequest.of(0, 10));  // 获取第1页,每页10条记录
    

    排序查询

    query.addSort(Sort.by(Sort.Order.asc("price")));  // 按价格升序排序
    

    复合查询

    使用 CriteriaQuery,你可以将多个查询条件通过 andor 进行组合:

    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 {
    @Id
    private 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 中的类型、分词器等配置。它支持多种类型,如 TextKeywordDouble 等,并且可以配置分词器(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 客户端。

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

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

相关文章

【Matlab】最新版2025a发布,深色模式、Copilot编程助手上线!

文章目录 一、软件安装1.1 系统配置要求1.2 安装 二、新版功能探索2.1 界面图标和深色主题2.2 MATLAB Copilot AI助手2.3 绘图区升级2.4 simulink2.5 更多 延迟一个月&#xff0c;终于发布了&#x1f92d;。 一、软件安装 1.1 系统配置要求 现在的电脑都没问题&#xff0c;老…

uniapp,小程序中实现文本“展开/收起“功能的最佳实践

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

思维链框架:LLMChain,OpenAI,PromptTemplate

什么是思维链,怎么实现 目录 什么是思维链,怎么实现思维链(Chain of Thought)在代码中的实现方式1. 手动构建思维链提示2. 少样本思维链提示3. 自动思维链生成4. 思维链与工具使用结合5. 使用现有思维链框架:LLMChain,OpenAI,PromptTemplate思维链实现的关键要点思维链(C…

使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据(申请key教程)

使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据 目录 使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据&#x1f4cc; 简介&#x1f6e0; 插件安装方法&#x1f30d; 下载 DEM 数据步骤&#x1f511; 注册 OpenTopography 账号&#xff08;如使用 Cope…

计算机组成与体系结构:替换策略(MRU LRU PLRU LFU)

目录 &#x1f3b2; MRU&#xff08;最近最常使用&#xff09; &#x1fa9c; 操作流程&#xff1a; &#x1f3b2; LRU&#xff08;最近最少使用&#xff09; &#x1fa9c; 操作流程&#xff1a; 示例 &#x1f50d; Age Bits&#xff08;年龄位&#xff09; 核心思想…

websocket入门详解

入门websocket的基础应该掌握一下问题&#xff1a; 1、什么是握手&#xff1f; 2、什么是websocket&#xff1f; 3、websocket和http的区别&#xff0c;应用场景 4、html前端简单代码演示 5、springboot整合websocket使用 6、使用vueelementui打造简单聊天室 7、使用web…

(6)python开发经验

文章目录 1 QListWidget样式显示异常2 模块编码错误3 qtcreator开发pyqt编码错误 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发 &#x1f448;&#x1f449;python开发 &#x1f448; 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 结果查看 从本文开始&#xff0c;我们将介绍如何在超级计算机上使用科学计算、工程仿真计算软件开展计算&am…

YOLO11解决方案之距离计算探索

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

论文学习_Precise and Accurate Patch Presence Test for Binaries

摘要&#xff1a;打补丁是应对软件漏洞的主要手段&#xff0c;及时将补丁应用到所有受影响的软件上至关重要&#xff0c;然而这一点在实际中常常难以做到&#xff0c;研究背景。因此&#xff0c;准确检测安全补丁是否已被集成进软件发行版本的能力&#xff0c;对于防御者和攻击…

Ascend的aclgraph(九)AclConcreteGraph:e2e执行aclgraph

1回顾 前面的几章内容探讨了aclgraph运行过程中的涉及到的关键模块和技术。本章节将前面涉及到的模块串联起来&#xff0c;对aclgraph形成一个端到端的了解。 先给出端到端运行的代码&#xff0c;如下&#xff1a; import torch import torch_npu import torchair import log…

c++从入门到精通(四)--动态内存,模板与泛型编程

文章目录 动态内存直接管理内存Shared_ptr类Unique_ptrWeak_ptr动态数组allocator类文本查询程序 模板与泛型编程定义模板函数模板类模板模板参数成员模板控制实例化 模板实参推断重载与模板可变参数模板模板特例化 动态内存 c中动态内存的管理是通过new和delete运算符来实现的…

寻找两个正序数组的中位数 - 困难

************* Python topic: 4. 寻找两个正序数组的中位数 - 力扣&#xff08;LeetCode&#xff09; ************* 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 证书解锁安全新高度

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

【金仓数据库征文】从云计算到区块链:金仓数据库的颠覆性创新之路

目录 一、引言 二、金仓数据库概述 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 负载均衡与读写分离 …

股指期货套期保值怎么操作?

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

基于IBM BAW的Case Management进行项目管理示例

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

黑马k8s(七)

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

九、HQL DQL七大查询子句

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月15日 专栏&#xff1a;Hive教程 Apache Hive 的强大之处在于其类 SQL 的查询语言 HQL&#xff0c;它使得熟悉 SQL 的用户能够轻松地对存储在大规模分布式系统&#xff08;如 HDFS&#xff09;中的数据进行复杂的查询和分析…

RTSP 播放器技术探究:架构、挑战与落地实践

RTSP 播放器为什么至今无法被淘汰&#xff1f; 在实时视频传输领域&#xff0c;RTSP&#xff08;Real-Time Streaming Protocol&#xff09;作为最基础、最常见的协议之一&#xff0c;至今依然被广泛用于监控设备、IP Camera、视频服务器等设备中。然而&#xff0c;要构建一个稳…