最近项目中使用到了elasticsearch,于是整理了一些项目中遇到的问题和常用方法。首次写,忘各位嘴下留情。。。
备注:本文档基于elasticsearch 5.4.2,且使用TransportClient客户端
一、客户端介绍
| 客户端 | 优点 | 缺点 | 连接方式 | 备注 |
|---|---|---|---|---|
| TransportClient | 1、启动速度快,轻量级,可创建多连接。2、使用Transport 接口进行通信,能够使用ES集群中的一些特性,性能最好 | 1、分发或查询数据速度较慢,不能获取指定节点数据。2、JAR包版本需与ES集群版本一致,ES集群升级,客户端也跟着升级到相同版本 | tcp 端口 9200 | 1、es逐渐会弃用此客户端 |
| Java Low Level Rest Client | 1、与ES版本之间没有关系,适用于作为所有版本ES的客户端 | 1、用户需自己编组请求JSON串,及解析响应JSON串 | http 端口 9300 | |
| Java High Level Rest Client | 1、官方推荐使用,基于Low Level Rest Client | 1、使用需与ES版本保持一致 | http 端口 9300 | |
| JestClient | 1、与ES版本之间没有关系,适用于跨版本,若ES集群使用不同的ES版本,使用原生ES API会有问题2、提供Restful API | http 端口 9300 | 开源 |
二、java客户端使用
1、pom文件中添加依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.4.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.4.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.11.Final</version>
</dependency>
2、resource目录下新建 log4j2.xml
appender.console.type = Console
appender.console.name = console
appender.console.layout.type = PatternLayout
rootLogger.level = info
rootLogger.appenderRef.console.ref = console
3、java代码
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.InetAddress;
import java.util.Arrays;
import java.util.List;
public class ESUtils {
private static final Logger logger = LoggerFactory.getLogger(ESUtils.class);
private String ips = "192.168.111.1,192.168.111.2,192.168.111.3";
private String port = "9300";
private String cluster = "cluster_name";
private String index = "index_name";
private String type = "index_name";
public TransportClient connect() {
TransportClient transportClient = null;
try {
List<String> ipList = Arrays.asList(ips.split(","));
Settings settings = Settings.builder().put("cluster.name", cluster)
//启动嗅探功能,这样只需要指定集群中的某一个节点(不一定是主节点),然后会加载集群中的其他节点,这样只要程序不停即使此节点宕机仍然可以连接到其他节点。
.put("client.transport.sniff", true)
.build();
transportClient = new PreBuiltTransportClient(settings);
for (String ip : ipList) {
transportClient.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip), Integer.parseInt(port)));
}
} catch (Exception e) {
logger.error(e.getMessage());
}
return transportClient;
}
}