Elasticsearch集群版本特性差异
版本特性 |
5.x版本 |
6.x版本 |
7.x版本 |
---|---|---|---|
多type支持情况 |
一个index里面支持包含多个type,每个type名称可以自定义。 |
一个index里面只支持有一个type,type名称可以自定义。 |
一个index里面只支持有一个type,type名称是固定的,_doc不能自定义。 |
客户端接入 |
支持TransportClient,可以同时使用tcp和http进行连接请求。 |
支持TransportClient,可以同时使用tcp和http进行连接请求。建议使用Java High Level REST Client。 |
只支持RestClient,只支持使用http进行连接请求。建议使用Java High Level REST Client。 |
Elasticsearch 5.x版本使用TransportClient接入Elasticsearch集群的样例: // 初始化客户端,连接9300端口 TransportClient client = new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300)) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300)); // 关闭客户端 client.close(); |
Elasticsearch 6.x版本、7.x版本中使用Java High Level REST Client接入集群的样例: // 初始化客户端,连接9200端口 RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost("localhost", 9200, "http"), new HttpHost("localhost", 9201, "http"))); // 关闭客户端 client.close(); |
||
模板配置 |
Elasticsearch 5.x版本中创建模板使用的是template字段。 Elasticsearch 5.x版本样例: PUT _template/template_1 { "template": "te*", "settings": { "number_of_shards": 1 } } |
Elasticsearch 6.x及以上版本开始使用index_pattern字段。 Elasticsearch 6.x及以上版本样例: PUT _template/template_1 { "index_patterns": ["te*"], "settings": { "number_of_shards": 1 } } |
|
boolean类型解析变化 |
在Elasticsearch 5.x版本中,true、false、on、off、yes、no、0和1的值都可以被解析成boolean。 |
Elasticsearch 6.x及以上版本只接受true/false,其他值会发生异常错误。 以下语句在Elasticsearch 5.x版本不会报错,在Elasticsearch 6.x/7.x版本会直接报错: GET data1/_search { "profile": "noprofile", "query": { "match_all": {} } } |
|
JSON格式校验 |
Elasticsearch 5.x中允许JSON中存在重复的key,后台会自动去掉。 |
Elasticsearch 6.x及以上版本不允许JSON存在重复的key,会直接报解析错误。 以下语句在Elasticsearch 5.x版本不会报错,在Elasticsearch 6.x/7.x版本中会报错: POST data1/doc { "isl": 0, "isl": 1 } |
|
DELETE文档变化 |
Elasticsearch 5.x中,执行DELETE index1/doc/1,如果index1不存在,会将index1创建出来。 |
Elasticsearch 6.x及以上版本,如果执行删除文档的索引不存在,会报错索引不存在。 |
|
_alias API校验 |
Elasticsearch 5.x中,_alias API允许在index字段中指定为别名,能正常解析。 类似的,Elasticsearch 5.x版本中允许使用别名删除一个索引。 |
Elasticsearch 6.x版本中,_alias API中的index字段只能指定为索引名,不允许是别名。 Elasticsearch 6.x版本中不再允许,必须使用索引名进行删除。 |
|
如以下示例,在Elasticsearch 5.x版本中能正常工作,但是在Elasticsearch 6.x版本/7.x版本中会报错。 PUT log-2023.11.11 POST _aliases { "actions": [ { "add": { "index": "log-2023.11.11", "alias": "log" } } ] } POST _aliases { "actions": [ { "remove": { "index": "log", "alias": "log" } } ] } 报错信息: { "error" : { "root_cause" : [ { "type" : "illegal_argument_exception", "reason" : "The provided expression [log] matches an alias, specify the corresponding concrete indices instead." } ], "type" : "illegal_argument_exception", "reason" : "The provided expression [log] matches an alias, specify the corresponding concrete indices instead." }, "status" : 400 } |
|||
默认配置变化 |
新建索引默认分片数为5。 |
新建索引默认分片数为1。 |
|
默认routing变化 |
Elasticsearch 5.x版本/6.x版本使用以下公式计算文档应该落在哪个shard。 shard_num = hash(_routing) % num_of_primary_shards |
Elasticsearch 7.x版本使用以下公式计算文档应该落在哪个shard。 routing_factor = num_routing_shards / num_primary_shards shard_num = (hash(_routing) % num_routing_shards) / routing_factor 其中num_routing_shards可以由以下配置指定。 index.number_of_routing_shards 如果不显式指定,则Elasticsearch会自动计算该值,以达到对索引进行split的能力。 |
|
Refresh时机变化 |
默认定期每秒钟执行refresh。 |
Elasticsearch 7.x版本中如果没有显式的指定index.refresh_interval,并且索引长时间没有search请求,这里的长时间是由配置index.search.idle.after指定,默认30秒,Elasticsearch就不会再定期的进行refresh,而是等到有新的search请求进来时再进行refresh,这时候进行的search请求会等待,直到下一轮refresh完成才进行检索并返回,所以第一次search请求一般耗时会相对较长。 |
|
父熔断器变化 |
父熔断器是在多个子熔断器中内存统计之和超限的情况下触发,超限阈值为70%。 |
父熔断器会在堆内存超限的情况下触发,默认超限阈值为95%。 |
|
Field Data熔断器阈值变化 |
Field Data熔断器超限阈值indices.breaker.fielddata.limit默认为60%。 |
Field Data熔断器超限阈值indices.breaker.fielddata.limit默认为40%。 |
|
_all字段支持情况 |
支持_all字段。 |
_all字段被废弃。 |
已删除_all字段,不再支持。 |
search API返回中hits.total |
Elasticsearch 5.x版本/6.x版本中,search API返回中,hits.total为数字,表示命中条数: { "took": 0, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 4, "max_score": 1, } } |
Elasticsearch 7.x版本中,hits.total不再是数字: { "took" : 76, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 4, "relation" : "eq" }, "max_score" : 1.0 } } 其中: value表示命中的条数。 relation表示value参数中的命中条数是否是准确值。 eq表示是准确值。 gte表示命中条数大于等于value参数。 |
|
_cache/clear API |
_cache/clear API支持POST/GET方式。 |
_cache/clear API只支持POST方式,不再支持GET方式。 |