Spring Boot+ElasticSearch常用的聚合搜索

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…

java讨论群:931243010

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值