1、创建index

PUT /my_index
{
  "settings":{
    "number_of_shards":1,
    "number_of_replicas":1
  },
  "mappings":{
    "properties":{
      "trans_count":{"type":"long"},
      "trans_amount":{"type":"long"},
      "trans_date":{"type":"long"},
      "team_field":{"type":"keyword"}
    }
  }
}

2、新增记录

POST my_index/_doc
{
  "trans_count": 123,
  "trans_amount": 123,
  "trans_date": 20200202,
  "team_field": "1"
}

3、修改记录

POST my_index1/_doc/id/_update
{
  "doc": {
    "cust_count": 14,
    "ret_code":"00000000"
  }
}

4、查询

GET my_index3/_search
{
  "query": {
  "match_all": {}
  },
  "aggs": {
    "group_by_place": {
      "terms": {"field": "success_name"},   //先根据success_name分组
      "aggs" : {
        "sum_price" : {
          "sum": { "field": "trans_count" }  //每一组再根据trans_count求和
        }
      }
    }
  }
}

5、java操作es查询

import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms.Bucket;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.Sum;
import org.elasticsearch.search.aggregations.metrics.SumAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;

public class Test {

public static void main(String[] args) throws Exception {
  // 1、通过QueryBuilders构造QueryBuilder,即查询条件
  QueryBuilder queryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("trans_date", "20200202"));
  // 2、构造聚合查询
  // 分组
  TermsAggregationBuilder field = AggregationBuilders.terms("group_name").field("success_name");
  // 求和
  SumAggregationBuilder sumAggr = AggregationBuilders.sum("my_sum").field("trans_count");
  field.subAggregation(sumAggr);
  // 3、通过index构造SearchRequest
  SearchRequest searchRequest = new SearchRequest("ectm_phone_trans_msg_index-2020.02.02");
  // 4、新建SearchSourceBuilder
  SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  // 5、SearchSourceBuilder添加查询条件,添加聚合条件
  searchSourceBuilder.query(queryBuilder);
  searchSourceBuilder.aggregation(field);
  searchSourceBuilder.size(10);
  // 6、SearchSourceBuilder添加到SearchRequest中
  searchRequest.source(searchSourceBuilder);
  // 7、获取客户端
  RestHighLevelClient client = getClient();
  // 8、使用客户端执行查询,获取SearchResponse
  SearchResponse res = client.search(searchRequest, RequestOptions.DEFAULT);
  System.out.println(res);
  //获取记录
  for (SearchHit hit : res.getHits()) {
    System.out.println(hit.getSourceAsMap());
  }
  //获取聚合结果
  Terms aggregation = res.getAggregations().get("group_name");
  for (Bucket bucket : aggregation.getBuckets()) {
    Sum sum = bucket.getAggregations().get("my_sum");
    System.out.println(sum.getValue());;
  }
  client.close();
}

public static RestHighLevelClient getClient() {
  final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
  credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "123456"));
  RestClientBuilder builder = null;
  builder = RestClient.builder(
    new HttpHost("10.10.49.78" , 9200 ))
    .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
      @Override
      public HttpAsyncClientBuilder customizeHttpClient(
        HttpAsyncClientBuilder httpClientBuilder) {
        return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
      }
    });
  return new RestHighLevelClient(builder);
}
}

6、一点文章引用-个人觉得还不错的入门

https://tool.lu/deck/h3/detail -- 性能与稳定并存 Elasticsearch调优实践

 

7、聚合之Cardinality

  Cardinality,基于基数聚合,能实现去重计数的功能,可以通过precision_threshold指定基数精度,但是其精度最大为40000,当去重后统计数量大于基数精度,会出现计数不准确问题。如下图所示:

  

 

  

 

posted on 2020-05-12 17:53  dysdhd  阅读(118)  评论(0)    收藏  举报