springboot 整合elasticsearch 跨版本处理方式

场景

springboot 在整合elasticsearch 通常会受到elasticsearch 版本的影响,

1.一套代码可能要兼容多个elasticsearch 的情况

2.低版本的无法调用高版本一些方法(例如:delete_by_query)

实现逻辑

用高版本的去做参数封装,用restTemplate 去发送请求(草台战法)

实现代码

依赖

java 复制代码
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>5.6.14</version>
</dependency>

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>5.6.14</version>
</dependency>

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>6.2.4</version>
    <exclusions>
         <exclusion>
              <groupId>org.elasticsearch.client</groupId>
              <artifactId>elasticsearch-rest-client</artifactId>
         </exclusion>
    </exclusions>
</dependency>

示例代码

我们以_delete_by_query 为例

java 复制代码
@Autowired
private RestTemplate restTemplate;

private ResponseEntity<JSONObject> deleteByQuery2() {
        //构建查询体
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        
        //构建查询条件
        RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("create_time");
        rangeQueryBuilder.lt(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        rangeQueryBuilder.gte(LocalDateTime.now().minusDays(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        searchSourceBuilder.postFilter(rangeQueryBuilder);
        
        //打印请求体
        log.debug("请求体:{}", searchSourceBuilder);

        //发送请求
        HttpHeaders httpHeaders = new HttpHeaders();
        HttpEntity httpEntity = new HttpEntity(searchSourceBuilder.toString(), httpHeaders);
        ResponseEntity<JSONObject> resp = restTemplate.postForEntity("http://127.0.0.1:9200/order_index/_delete_by_query", httpEntity, JSONObject.class);
        if (resp.getStatusCode().equals(HttpStatus.OK)) {
            JSONObject body = resp.getBody();
            log.debug(body.toString(SerializerFeature.DisableCircularReferenceDetect));
        }
        return resp;
    }

参考这个逻辑去处理部分问题(用自带的请求(searchrequest),部分功能受到版本限制)

相关推荐
6***v4172 分钟前
搭建Golang gRPC环境:protoc、protoc-gen-go 和 protoc-gen-go-grpc 工具安装教程
开发语言·后端·golang
水痕013 分钟前
go使用cobra来启动项目
开发语言·后端·golang
用户345848285058 分钟前
python在使用synchronized关键字时,需要注意哪些细节问题?
后端
代码扳手11 分钟前
Golang 高效内网文件传输实战:零拷贝、断点续传与 Protobuf 指令解析(含完整源码)
后端·go
银河邮差16 分钟前
python实战-用海外代理IP抓LinkedIn热门岗位数据
后端·python
undsky18 分钟前
【RuoYi-Eggjs】:让 MySQL 更简单
后端·node.js
程序员西西24 分钟前
Spring Boot整合MyBatis调用存储过程?
java·后端
Elasticsearch25 分钟前
混合搜索无需头疼:使用 retrievers 简化混合搜索
elasticsearch
whltaoin38 分钟前
【 手撕Java源码专栏 】Spirng篇之手撕SpringBean:(包含Bean扫描、注册、实例化、获取)
java·后端·spring·bean生命周期·手撕源码
Elastic 中国社区官方博客1 小时前
使用 A2A 协议和 MCP 在 Elasticsearch 中创建一个 LLM agent 新闻室:第二部分
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索