You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot调用ES响应式文档API实现无模型动态JSON操作咨询

答复

问题1结论

  • Elasticsearch官方原生提供覆盖CRUDQ全场景的响应式文档操作API,Spring Boot生态可通过Spring Data Elasticsearch组件无缝集成这套API,完全不需要定义固定实体模型、不需要使用Repository组件即可完成所有文档操作。
  • 这套无实体的操作模式是官方原生支持的,并非hack实现:Elasticsearch文档本身是无固定Schema的JSON结构,客户端底层仅做JSON的序列化与反序列化处理,不强制要求将文档映射为预定义的Java POJO。

问题2结论

  • 你查阅到的ReactiveElasticsearchClient传入模型对象的示例只是官方给出的POJO映射常用场景,并非API强制约束。
  • 该客户端完全支持直接传入动态JSON结构(包括Map<String,Object>、原始JSON字符串、JacksonJsonNode等类型)完成文档创建、更新操作;查询时也可以直接指定返回类型为上述动态JSON结构,不需要提前定义对应字段的实体类即可拿到原始动态JSON结果。

实操参考

1. 依赖引入

只需要引入Spring Boot官方的Elasticsearch响应式starter即可,不需要额外引入Repository相关组件:

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

2. Service层核心实现

直接注入ReactiveElasticsearchClient即可实现全动态CRUDQ操作:

import co.elastic.clients.elasticsearch.core.GetResponse;
import co.elastic.clients.elasticsearch.core.IndexResponse;
import com.fasterxml.jackson.databind.JsonNode;
import org.springframework.data.elasticsearch.client.elc.ReactiveElasticsearchClient;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
import java.util.Map;

@Service
public class DynamicEsService {
    private final ReactiveElasticsearchClient reactiveEsClient;

    public DynamicEsService(ReactiveElasticsearchClient reactiveEsClient) {
        this.reactiveEsClient = reactiveEsClient;
    }

    // 动态写入文档,入参支持任意动态JSON结构
    public Mono<IndexResponse> insert(String indexName, String docId, Map<String, Object> dynamicDocContent) {
        return reactiveEsClient.index(reqBuilder -> reqBuilder
                .index(indexName)
                .id(docId)
                .document(dynamicDocContent) // 直接传入动态结构,无需绑定实体类
        );
    }

    // 动态查询文档,直接返回动态JSON结果
    public Mono<JsonNode> queryById(String indexName, String docId) {
        return reactiveEsClient.get(reqBuilder -> reqBuilder
                        .index(indexName)
                        .id(docId),
                JsonNode.class // 指定返回类型为动态JSON节点
        ).mapNotNull(GetResponse::source);
    }

    // 更新、删除、条件查询等其他操作逻辑完全一致:入参传动态结构、返回值指定动态JSON类型即可
}

3. Controller层实现

直接接收前端传入的动态JSON,返回动态查询结果:

import com.fasterxml.jackson.databind.JsonNode;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;
import java.util.Map;

@RestController
@RequestMapping("/dynamic-es")
public class DynamicEsController {
    private final DynamicEsService dynamicEsService;

    public DynamicEsController(DynamicEsService dynamicEsService) {
        this.dynamicEsService = dynamicEsService;
    }

    @PostMapping("/{indexName}/{docId}")
    public Mono<String> addDoc(@PathVariable String indexName, @PathVariable String docId, @RequestBody Map<String, Object> dynamicBody) {
        return dynamicEsService.insert(indexName, docId, dynamicBody)
                .map(resp -> String.format("文档创建成功,文档ID:%s", resp.id()));
    }

    @GetMapping("/{indexName}/{docId}")
    public Mono<JsonNode> getDoc(@PathVariable String indexName, @PathVariable String docId) {
        return dynamicEsService.queryById(indexName, docId);
    }
}

配置说明:只需要在application.yml中配置好Elasticsearch服务的连接地址即可,不需要添加任何实体扫描、Repository扫描相关配置。Spring Boot默认集成的Jackson会自动完成动态JSON的序列化和反序列化处理。


内容的提问来源于stack exchange,提问作者ane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:27:24