ElasticSearch是一款开源的并且非常优秀的搜索引擎,常用于网站全文检索、日志分析等、本文将介绍一些基于日志的常用的聚合操作
Transport Client 与 Node Client
-
如果你使用的是 Java,你可能想知道何时使用传输客户端(注:Transport Client,下同)与节点客户端(注:Node Client,下同)。 在书的开头所述, 传输客户端作为一个集群和应用程序之间的通信层。它知道 API 并能自动帮你在节点之间轮询,帮你嗅探集群等等。但它是集群 外部的 ,和 REST 客户端类似。
-
另一方面,节点客户端,实际上是一个集群中的节点(但不保存数据,不能成为主节点)。因为它是一个节点,它知道整个集群状态(所有节点驻留,分片分布在哪些节点,等等)。 这意味着它可以执行 APIs 但少了一个网络跃点。
这里有两个客户端案例的使用情况:
-
如果要将应用程序和 Elasticsearch 集群进行解耦,传输客户端是一个理想的选择。例如,如果您的应用程序需要快速的创建和销毁到集群的连接,传输客户端比节点客户端”轻”,因为它不是一个集群的一部分。
-
类似地,如果您需要创建成千上万的连接,你不想有成千上万节点加入集群。传输客户端( TC )将是一个更好的选择。
-
另一方面,如果你只需要有少数的、长期持久的对象连接到集群,客户端节点可以更高效,因为它知道集群的布局。但是它会使你的应用程序和集群耦合在一起,所以从防火墙的角度,它可能会构成问题。
1、Spring boot(1.5.9)整合ElasticSearch
- POM
<!-- ElasticSearch client api -->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.2.4</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.2.4</version>
</dependency>
- application.yml
elasticsearch:
host: you host
port: yout port
cluster-name: you cluster
pool: 5
- 连接ES初始化连接对象
@Configuration
public class EsConfig{
@Value("${elasticsearch.host}")
private String host;
........
// 创建私有对象
@Bean()
public TransportClient client(){
TransportClient transportClient = null;
try {
// 设置client.transport.sniff为true来使客户端去嗅探整个集群的状态,把集群中其它机器的ip地址加到客户端中,
Settings settings = Settings.builder()
.put("cluster.name",clusterName)
.put("client.transport.sniff", true)
.put("thread_pool.search.size", poolSize!= null?Integer.parseInt(poolSize):5)//增加线程池个数
.build();
transportClient = new PreBuiltTransportClient(settings);
TransportAddress transportAddress = new TransportAddress(InetAddress.getByName(host), port!= null?Integer.valueOf(port):9300);
transportClient.addTransportAddresses(transportAddress);
} catch (Exception e) {
log.error("elasticsearch transportClient create fail",e);
}
return transportClient;
}
}
- 如何使用?
@Autowired
private TransportClient esClient; //注入es连接实例
//例子一(查询一段时间内出现的不重复的总用户量)
//相当于SQL select * from table where TIME_KEY>10 and TIME_KEY<20 范围查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery(TIME_KEY)
.gte(gte)
.lte(lte)
.format(TIME_FORMAT));
SearchRequestBuilder request = esClient.prepareSearch(index)
.setQuery(boolQueryBuilder)
.setSize(0)
//按照FIELD_CLIENTID聚合,表示不重复FIELD_CLIENTID出现的次数
.addAggregation(AggregationBuilders.cardinality(AGGREGATION_CARDINALITY)
.field(FIELD_CLIENTID)
);
还有后续 持续更新ing…