项目中使用的es需要迁移,之前是由亚马逊提供的服务现在改为使用运维自建库,之前AWS提供的es版本是6.3,现在运维自建的ES版本是7.6(PS:正常来说,即便是迁移,项目使用的数据库版本应该是一致的,这里我也很无奈)
代码层面
jar包
6.3版本
<!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.3.2</version>
</dependency>
7.6版本
<!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.6.1</version>
</dependency>
不要以为只需要把版本号从6.3.2改为7.6.1就万事大吉了,这俩jar包是互不兼容的
6.X的jar包都无法访问7.X的ES,在6.X版本的ES除了index外还可以用type作为条件,比如这样的搜索语句:
GET /index/type/_search?q=user:kimchy
但是在7.X以后要求搜索语句不能使用type
GET /index/_search?q=user:kimchy
如果使用包含type的搜索语句访问7.X的ES会收到type字段已废弃的异常提示,当然,如果你在6.X中没有使用type作为查询条件,那么这个坑是不会踩的
Java使用elasticsearch-rest-high-level-client必须添加RequestOptions,RequestOptions不会改变ES的搜索过程及结果,只在应用层进行一些处理,如果没什么要改的使用默认构造方法就行,如下所示
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
ES本身的配置参数
这是一个巨大的坑,公司项目都是采用容器化部署方案,使用的Kubernetes管理容器,恰好ES官方也支持这种部署模式,运维直接拿来搭建,很多配置都使用的默认参数
然而不对照官方文档,忽视了默认参数的变化
在6.X版本的ES每个索引有几个分区,几个副本都可以通过number_of_shards和number_of_replicas分别设置,分区数量默认5,副本数量默认1,但是在7.6的版本中分区数量默认为1,副本数量默认为1,每个节点的JVM heap大小默认1G
援引官方文档:If ES_JAVA_OPTS is not defined, the Elasticsearch default heap size of 1Gi will be in effect.
如果在7.6的版本中仍然使用默认参数去创建索引,数据分布在两个node且JVM堆大小分别只有1G去存储索引数据,在数据量大,且有一定并发的情况下,ES的查询速度是无法满足生产环境需求的
我们需要在es中添加一个模板,以便在新建索引的时候使用可以满足需求的配置
PUT _template/template_1
{
"index_patterns": ["te*", "bar*"],
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
}
}
index_patterns设置匹配该模板的索引名称,此模板适用于所有te和bar开头的索引,当然也可以使用"index_patterns": ["*"]来匹配所有索引
settings设置了此模板下索引的默认分区数量和副本数量,如果在创建索引时指定了分区数量和副本数量则不会使用默认参数
模板中的设置只对以后创建的索引有效,对已有索引不生效