记一次线上的elasticsearch查询采坑
第一次使用elasticsearch,于是从网上找轮子复制粘贴。早好轮子测试完毕,上线。可是几天下来发现接口响应时间一直都偏高(默认的超时时间是500ms),所以就不停的对代码优化,缩短时间。但是到最后代码已经不能再优化了,响应时间依然没有明显的下降趋势,甚至在高峰期会严重超时。接下来会慢慢讲解elasticsearch使用优化。
Spring Boot添加elasticsearch依赖
有很多种方案可以选择,1)添加spring的data依赖。2)使用elasticsearch提供的client依赖。3)使用jestClient依赖。前两种并没有什么区别,第三种是通过http请求访问elasticsearch的。
使用elasticsearch官方依赖
使用IDE初始化Springboot时勾选elasticsearch即可,或者你也可以直接添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>{elasticserch.version}</version>
</dependency>
或者到maven网站查找对应elasticsearch版本的依赖:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>{elasticserch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>{elasticserch.version}</version>
</dependency>
需要注意的是,一定要使用与你的elasticsearch版本一直的依赖,否则可能会出错。
elasticsearch的配置
@Configuration
public class ElasticsearchConfig {
private static final Logger logger = LoggerFactory.getLogger(ElasticsearchConfig.class);
@Value("${elasticsearch.port}")
private String port;
@Value("${elasticsearch.cluster.name}")
private String clusterName;
@Value("${elasticsearch.pool}")
private String poolSize;
@Value("${elasticsearch.ip}")
private String esHost;
@Bean(name = "transportClient")
public TransportClient transportClient() {
logger.info("Elasticsearch初始化开始。。。。。");
TransportClient transportClient = null;
try {
// 配置信息
Settings esSetting = Settings.builder()
//集群名字
.put("cluster.name", clusterName)
//增加嗅探机制,找到ES集群
.put("client.transport.sniff", true)
// .put("client.transport.ignore_cluster_name", true)
//增加线程池个数,暂时设为5
.put("thread_pool.search.size", Integer.parseInt(poolSize))
.build();
//配置信息Settings自定义
transportClient = new PreBuiltTransportClient(esSetting);
TransportAddress transportAddress = new TransportAddress(InetAddress.getByName(esHost), Integer.valueOf(port));
transportClient.addTransportAddresses(transportAddress);
logger.info("连接elasticsearch");
} catch (Exception e) {
logger.error("elasticsearch TransportClient create error!!", e);
}
return transportClient;
}
}
低版本的elasticsearch在配置setting自定义内容时会不一样。使用elasticsearch节点连接的端口是9300。</