前言
最近公司有一个需求,就是要将网关(Java开发)的日志写入Elasticsearch中,并进行日志查询与展示,由于楼主之前没有接触过Elasticsearch,更谈不上Java Api的使用了,于是苦思良久,各种查阅资料,最后功夫不负有心人,终于完成了功能。现将过程及方法论分享如下,希望可以帮到他人。
一、相关Jar包的引入
Java使用Elasticsearch 所需要的Jar包依赖如下:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.5.4</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.5.4</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch-core</artifactId>
<version>6.5.4</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch-secure-sm</artifactId>
<version>6.5.4</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch-x-content</artifactId>
<version>6.5.4</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch-cli</artifactId>
<version>6.5.4</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>jna</artifactId>
<version>4.5.1</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>transport-netty4-client</artifactId>
<version>6.5.4</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>reindex-client</artifactId>
<version>6.5.4</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>6.5.4</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>lang-mustache-client</artifactId>
<version>6.5.4</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>percolator-client</artifactId>
<version>6.5.4</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>parent-join-client</artifactId>
<version>6.5.4</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>rank-eval-client</artifactId>
<version>6.5.4</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.0</version>
</dependency>
二、创建连接
在使用java调用Elasticsearch之前,需要先创建客户端与Elasticsearch服务器之间的连接。创建连接的代码片段如下:
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class ESUtil {
private static volatile TransportClient client;
/**
*采用双端检索机制实现客户端为单例模式
* @param clusterName 你的Elasticsearch集群名称
* @param hostName 你的Elasticsearch的主机Ip地址
* @param hostPort 你的Elasticsearch与客户端通信的端口,一般为9300
* @return TransportClient
* @throws UnknownHostException
*/
@SuppressWarnings("resource")
public static TransportClient getClient(String clusterName, String hostName, int hostPort) {
if (client == null) {
synchronized (TransportClient.class) {
try {
client = new PreBuiltTransportClient(Settings.builder().put("cluster.name", clusterName).build())
.addTransportAddress(new TransportAddress(InetAddress.getByName(hostName), hostPort));
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
return client;
}
}
三、初始化Elasticsearch中的索引模板
1、初始化索引模板相关代码如下:
/**
* 判断索引是否存在
* @param client
* @param indexName
* @return
*/
public boolean existIndex(TransportClient client,String indexName){
boolean existIndex = false;
try {
existIndex = client.admin().indices().exists(new IndicesExistsRequest().indices(new String[]{indexName}))
.actionGet().isExists();
} catch (Exception e) {
e.printStackTrace();
}
return existIndex;
}
/**
* 创建并初始化索引
*@param clazz 需要创建索引的实体类
* @param indexName 需要创建的索引名称
*/
@SuppressWarnings("rawtypes")
public void initIndex(Transpo