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
相关产品推荐
相关产品推荐

