es的java客户端版本过低什么意思,JAVA客户端兼容Elasticsearch 6.8与7.8服务器的方案...

1. 问题背景

目前项目中所使用的Elasticsearch(一下简称ES)的服务器版本是6.8.1,但将来有升级到7.8.1版本的计划。这样对于相同的应用软件版本而言,可能会在有的地方搭配6.8.1版本使用,有的地方搭配7.8.1版本使用。

对于应用软件而言,作为ES服务器的JAVA客户端,需要使用一套代码来兼容6.8.1版本和7.8.1版本的ES服务器。

2. 设计思路

Java High Level REST Client(以下简称High Level)是ES官方推荐的JAVA客户端,具有即时同步ES服务器版本,功能特性齐全等特点,因此项目选用High Level作为视信通应用服务的ES客户端。

根据High Level的官方文档,对于兼容性有如下说明:

图1

由官方文档可以看到,High Level具有向前兼容的特性,即老的High Level客户端可以被新版本的服务器兼容。

根据这一特性,应用软件决定使用6.8.1版本的6.8.1客户端来兼容6.8.1和7.8.1的服务器。

分析ES服务器6和7版本之间的差别,最大差别在于6中每个索引存储数据时需要指定Type,而7中不需要指定Type,即一个索引对应一个Mapping。

目前项目的应用软件中使用6的客户端索引建立规则为:一个索引对应一个Type, 索引名与Type名相同,在升级ES的服务器版本到7之后,目前的这种索引创建模式需要修改,否则在服务器版本升级到7之后无法运行。

3. 设计方案

3.1. 索引模型兼容

为兼容6.8.1与7.8.1的ES服务器,应用软件在创建索引时不指定Type。目前High Level 6.8.1的API中创建索引可以不指定Type参数,创建的索引默认Type为“_doc”,而7.8.1的服务器支持对于Type为“_doc”的DSL查询。

应用软件的JAVA客户端使用High Level 6.8.1在创建索引时不指定Type,对于查询、聚合的API需要填入Type的情况,使用默认Type值“_doc”。

3.2. 封装ES操作

为避免应用软件不同的服务使用High Level出现姿势不一样的情况。视信通将对ES的操作封装到一个公共工具类中,对于各应用服务而言,不再关注ES的实现细节,运行方式也都一致,更便于扩展与维护。

3.3. 使用High Level与LOW Level结合的方式兼容ES操作

尽管官方宣称High Level的向前兼容性,但是在语法格式上还有一些细微差别。如对于查询返回结果的总数字段(Total):

在6.8.1服务器中,查询返回命中结果如下:

{

"took": 0,

"timed_out": false,

"_shards": {

"total": 5,

"successful": 5,

"skipped": 0,

"failed": 0

},

"hits": {

"total": 0,

"max_score": null,

"hits": []

}

}

请注意,这里total字段为一个整型。

但在7.8.1的服务器中,查询返回命中结果如下:

{

"took": 6,

"timed_out": false,

"_shards": {

"total": 1,

"successful": 1,

"skipped": 0,

"failed": 0

},

"hits": {

"total": {

"value": 0,

"relation": "eq"

},

"max_score": null,

"hits": []

}

}

若使用6.8.1的High Level去查询7.8.1的服务器,会出现API解析total字段不正确的情况(始终返回为0)。

针对这种情况,在视信通的ES封装函数中首先使用Java Low Level REST Client执行该查询,然后针对返回的结果JSON解析total字段是一个整型还是JSON对象来获取正确的total值。

3.4. 数据迁移

由于老的应用软件版本中ES索引模式为ES索引名与Type名相同,这种方式不适用于兼容方案。

因而在使用ES兼容方案后,应用软件升级时需要重新创建索引(兼容索引),可使用ES的reindex命令,示例如下:

POST http://172.16.249.177:9200/_reindex

{

"source": {

"index": "vline_event_recorder_exception",

"type":"vline_event_recorder_exception"

},

"dest": {

"index": "vline_event_recorder_exception_test",

"type": "_doc"

}

}

附录:ES客户端封装函数

import lombok.extern.slf4j.Slf4j;

import org.apache.http.HttpHost;

import org.apache.http.util.EntityUtils;

import org.elasticsearch.action.DocWriteResponse;

import org.elasticsearch.action.admin.indices.settings.put.UpdateSettingsRequest;

import org.elasticsearch.action.bulk.BulkRequest;

import org.elasticsearch.action.bulk.BulkResponse;

import org.elasticsearch.action.index.IndexRequest;

import org.elasticsearch.action.index.IndexResponse;

import org.elasticsearch.action.search.SearchRequest;

import org.elasticsearch.action.search.SearchResponse;

import org.elasticsearch.action.search.SearchScrollRequest;

import org.elasticsearch.action.support.master.AcknowledgedResponse;

import org.elasticsearch.action.update.UpdateRequest;

import org.elasticsearch.action.update.UpdateResponse;

import org.elasticsearch.client.Request;

import org.elasticsearch.client.RequestOptions;

import org.elasticsearch.client.Response;

import org.elasticsearch.client.RestClient;

import org.elasticsearch.client.RestClientBuilder;

import org.elasticsearch.client.RestHighLevelClient;

import org.elasticsearch.client.indices.CreateIndexRequest;

import org.elasticsearch.client.indices.CreateIndexResponse;

import org.elasticsearch.client.indices.GetIndexRequest;

import org.elasticsearch.client.indices.PutMappingRequest;

import org.elasticsearch.common.unit.TimeValue;

import org.elasticsearch.common.xcontent.XContentBuilder;

import org.elasticsearch.common.xcontent.XContentType;

import org.elasticsearch.index.query.QueryBuilder;

import org.elasticsearch.index

你可能感兴趣的:(es的java客户端版本过低什么意思,JAVA客户端兼容Elasticsearch 6.8与7.8服务器的方案...)