elasticsearch 使用RestHighLevelClient

因公司使用ES搜索引擎,所以自己研究了几天,目前看网上的帖子五花八门,而且好多版本不用导致不能调用.

顾自己硬着头皮,看官方介绍,逐字翻译api,终于功夫不负有心人,demo可以使用了

本人用es最新版本es-7.2.0,客户端用RestHighLevelClient.还有一个客户端是transportClient客户端,但注意这个客户端将要被弃用.虽然本人开始研究的时候,是这个客户端,但为了后期,就果断放弃此客户端.

代码框架springboot2.0.X版本,springboot也有自己的封装客户端,好像是rest什么的,但底层封装的客户端是transportClient,而且和官方介绍的api差很多,boot也没有一个介绍相关调用的案列,顾没有深入研究.

废话不说,直接上代码了

 

我们是集群的配置:

配置文件:

bootstrap.yml.

firstIp: bs01 secondIp: bs02 thirdIp: bs03 firstPort: 9093 secondPort: 9093 thirdPort: 9093 clusterName: bses

创建客户端:

ESClientSpringFactory

package com.ztgx.es.config;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;

@Configuration
public class ESClientSpringFactory {

    private Logger logger  = LoggerFactory.getLogger(this.getClass());

    @Value("${elasticsearch.firstIp}")
    private String firstIp;
    @Value("${elasticsearch.secondIp}")
    private String secondIp;
    @Value("${elasticsearch.thirdIp}")
    private String thirdIp;
    @Value("${elasticsearch.firstPort}")
    private String firstPort;
    @Value("${elasticsearch.secondPort}")
    private String secondPort;
    @Value("${elasticsearch.thirdPort}")
    private String thirdPort;
    @Value("${elasticsearch.clusterName}")
    private String clusterName;


    @Bean
    public  RestHighLevelClient getrestHighLevelClient() throws IOException {
        RestHighLevelClient client = null;
        logger.info("ElasticSearch初始化开始。。");
        logger.info("要连接的节点1的ip是{},端口是{},集群名为{}" , firstIp , firstPort , clusterName);
        logger.info("要连接的节点2的ip是{},端口是{},集群名为{}" , secondIp , secondPort , clusterName);
        logger.info("要连接的节点3的ip是{},端口是{},集群名为{}" , thirdIp , thirdPort , clusterName);
        try {

            client = new RestHighLevelClient(
                    RestClient.builder(
                            new HttpHost(InetAddress.getByName(firstIp),Integer.parseInt(firstPort),"http"),
                            new HttpHost(InetAddress.getByName(firstIp),Integer.parseInt(firstPort),"http"),
                            new HttpHost(InetAddress.getByName(firstIp),Integer.parseInt(firstPort),"http")));

            logger.info("ElasticSearch初始化完成。。");
        } catch (UnknownHostException e) {
            e.printStackTrace();
            logger.error("ElasticSearch初始化失败:" +  e.getMessage(),e);
            client.close();
        }


        return client;
    }

}

直接调用demo:

package com.ztgx.es;


import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.ScoreSortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;

@Slf4j
@RestController
@RequestMapping("/test")
public class testcontroller {


    @Qualifier("getrestHighLevelClient")
    @Autowired
    private RestHighLevelClient client;

    @PostMapping("/testes")
    public SearchResponse matchQueryBuilder() throws IOException {
        try {

            //模糊查询
            MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("field", "bar");
            matchQueryBuilder.fuzziness(Fuzziness.AUTO);
            matchQueryBuilder.prefixLength(0);
            matchQueryBuilder.maxExpansions(10);

        /*QueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("user", "kimchy")
                .fuzziness(Fuzziness.AUTO)
                .prefixLength(3)
                .maxExpansions(10);*/

            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            searchSourceBuilder.query(matchQueryBuilder);


            //排序
            //Sort descending by _score (the default)
            searchSourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC));//
            //Also sort ascending by _id field
            searchSourceBuilder.sort(new FieldSortBuilder("_id").order(SortOrder.ASC));


            //查询指定字段   不查询指定字段
            //该方法还接受一个由一个或多个通配符模式组成的数组,以控制以更细粒度的方式包含或排除哪些字段:
//        searchSourceBuilder.fetchSource(false);
//        String[] includeFields = new String[]{"field"};
//        String[] excludeFields = Strings.EMPTY_ARRAY;
//        searchSourceBuilder.fetchSource(includeFields, excludeFields);


            SearchRequest searchRequest = new SearchRequest();
            searchRequest.indices("posts");
            searchRequest.source(searchSourceBuilder);
            SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
            System.out.println(search);
            return search;

        }catch(Exception e){
            client.close();
        e.getStackTrace();
            try {
                client.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }finally {
            client.close();
        }
        return null;
    }
}

 

pom文件:



    
        bigdataservice
        com.ztgx.bigdataservice
        1.0-SNAPSHOT
    
    4.0.0

    bigdataservice-web-es

    

        
        
            junit
            junit
            4.12
        
        
            org.elasticsearch
            elasticsearch
            7.2.0
        
        
            org.elasticsearch.client
            elasticsearch-rest-high-level-client
            7.2.0
        

        
            org.springframework.boot
            spring-boot-configuration-processor
            true
        



    


 

上面的直接就可以实现了,挺简单的.

本人不才,自己有写了几个测试api,如有需要可以看一看.

package com.ztgx.es.config;


import org.apache.http.HttpHost;
import org.elasticsearch.action.DocWriteResponse;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.fieldcaps.FieldCapabilities;
import org.elasticsearch.action.fieldcaps.FieldCapabilitiesRequest;
import org.elasticsearch.action.fieldcaps.FieldCapabilitiesResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.ShardSearchFailure;
import org.elasticsearch.action.support.IndicesOptions;
import org.elasticsearch.action.support.replication.ReplicationResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.script.Script;
import org.elasticsearch.script.ScriptType;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.Avg;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.ScoreSortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;

import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import static java.util.Collections.singletonMap;


public class ESbean {

    RestHighLevelClient client = new RestHighLevelClient(
            RestClient.builder(
                    new HttpHost("ip1", 9093, "http"),//此处写你自己的ip,如果是单机版本,删掉其他两个就好了
                    new HttpHost("ip2", 9093, "http"),
                    new HttpHost("ip3", 9093, "http")));
//@Qualifier("getrestHighLevelClient")
//@Autowired
//private RestHighLevelClient client;


    /**
     * 创建索引
     *
     * @throws IOException
     */
    @Test
    public void creatIndex() throws IOException {


        // IndexRequest request = new IndexRequest("posts");
     /*   Map jsonMap = new HashMap<>();
        jsonMap.put("user", "kimchy");
        jsonMap.put("postDate", new Date());
        jsonMap.put("message", "trying out Elasticsearch");
        IndexRequest indexRequest = new IndexRequest("posts")
                .id("1").source(jsonMap);*/

        //以映射形式提供的文档源,该映射将自动转换为JSON格式
        /*XContentBuilder builder = XContentFactory.jsonBuilder();
        builder.startObject();
        {
            builder.field("user", "kimchy");
            builder.timeField("postDate", new Date());
            builder.field("message", "trying out Elasticsearch");
        }
        builder.endObject();
        IndexRequest indexRequest = new IndexRequest("posts")
                .id("1").source(builder);*/

        //文档源作为XContentBuilder对象提供,Elasticsearch内置助手生成JSON内容
        IndexRequest indexRequest = new IndexRequest("posts")
                .id("1")
                .source("user", "kimchy",
                        "postDate", new Date(),
                        "message", "trying out Elasticsearch");

        //同步执行
        //当以下列方式执行索引请求时,客户端在继续执行代码之前等待返回索引响应:
        IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
        System.out.println(indexResponse);

        String index = indexResponse.getIndex();
        String id = indexResponse.getId();

        if (indexResponse.getResult() == DocWriteResponse.Result.CREATED) {
            //处理(如果需要)第一次创建文档的情况

        } else if (indexResponse.getResult() == DocWriteResponse.Result.UPDATED) {
            //处理(如果需要)将文档重写为已经存在的情况

        }
        ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo();
        if (shardInfo.getTotal() != shardInfo.getSuccessful()) {
            //处理成功碎片的数量少于总碎片的情况

        }
        if (shardInfo.getFailed() > 0) {
            for (ReplicationResponse.ShardInfo.Failure failure :
                    shardInfo.getFailures()) {
                String reason = failure.reason();
                //处理潜在的故障
            }
        }
    }

    /**
     * 获取文档中的数据
     */
    @Test
    public void getApi() throws IOException {


        //GetRequest()方法第一个参数是索引的名字,第二个参数是文档的id
        GetRequest getRequest = new GetRequest("posts", "1");

        //查询特定字段,包含和不包含的字段
        String[] includes = new String[]{"message", "*Date", "user"};//查询的字段
        String[] excludes = new String[]{};//不查询的字段
        FetchSourceContext fetchSourceContext =
                new FetchSourceContext(true, includes, excludes);
        getRequest.fetchSourceContext(fetchSourceContext);


        //为特定的存储字段配置检索(要求字段在映射中单独存储)
        getRequest.storedFields("message");
        GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
        System.out.println(getResponse);

        String index = getResponse.getIndex();
        String id = getResponse.getId();
        if (getResponse.isExists()) {
            long version = getResponse.getVersion();
            //将结果封装成String   或者map类型  或者bytes类型
            String sourceAsString = getResponse.getSourceAsString();
            Map sourceAsMap = getResponse.getSourceAsMap();
            byte[] sourceAsBytes = getResponse.getSourceAsBytes();

            // 获取结果集中某个字段的数据
            String message = (String) getResponse.getSource().get("message");
            System.out.println(message);
        } else {

            // 处理没有找到文档的场景。注意,虽然返回的响应有404状态代码,但是返回的是有效的GetResponse,
            // 而不是抛出异常。这样的响应不包含任何源文档,并且它的isExists方法返回     }

        }
    }


    @Test
    public void deleteApi() throws IOException {

        //索引   以及id
        DeleteRequest request = new DeleteRequest("posts", "1");
        DeleteResponse deleteResponse = client.delete(request, RequestOptions.DEFAULT);

        //异步删除
        //client.deleteAsync(request, RequestOptions.DEFAULT, listener);

        String index = deleteResponse.getIndex();
        String id = deleteResponse.getId();
        long version = deleteResponse.getVersion();
        ReplicationResponse.ShardInfo shardInfo = deleteResponse.getShardInfo();
        if (shardInfo.getTotal() != shardInfo.getSuccessful()) {

        }
        if (shardInfo.getFailed() > 0) {
            for (ReplicationResponse.ShardInfo.Failure failure :
                    shardInfo.getFailures()) {
                String reason = failure.reason();
            }
        }
    }

    /**
     * 更新
     *
     * @throws IOException
     */
    public void updateApi() throws IOException {

        UpdateRequest request = new UpdateRequest("posts", "1");

        Map parameters = singletonMap("count", 4);

        Script inline = new Script(ScriptType.INLINE, "painless",
                "ctx._source.field += params.count", parameters);
        request.script(inline);

        //更新特定字段
        String[] includes = new String[]{"updated", "r*"};
        String[] excludes = Strings.EMPTY_ARRAY;
        request.fetchSource(
                new FetchSourceContext(true, includes, excludes));

        UpdateResponse updateResponse = client.update(
                request, RequestOptions.DEFAULT);

    }

    /**
     * 批量添加  删除
     */
    @Test
    public void bulkRequest() throws IOException {
        //添加
        BulkRequest request = new BulkRequest();
        request.add(new IndexRequest("posts").id("5")
                .source(XContentType.JSON, "user", "赵琦水岸城1", "name", "赵琦水岸城1"));
        request.add(new IndexRequest("posts").id("7")
                .source(XContentType.JSON, "user", "张三红包2", "name", "马六红包2"));
        request.add(new IndexRequest("posts").id("8")
                .source(XContentType.JSON, "user", "王五红包3", "name", "王五红包3"));
        request.add(new IndexRequest("posts").id("9")
                .source(XContentType.JSON, "user", "王五", "name", "zhangsan红包4"));
        request.add(new IndexRequest("posts").id("10")
                .source(XContentType.JSON, "user", "李四红包5", "name", "李四红包5"));
        request.add(new IndexRequest("posts").id("6")
                .source(XContentType.JSON, "user", "张三红包6", "name", "张三红包6"));
//
//        删除
//        BulkRequest request1 = new BulkRequest();
//        request1.add(new DeleteRequest("posts", "3"));
//        request1.add(new UpdateRequest("posts", "2")
//                .doc(XContentType.JSON,"other", "test"));
//        request1.add(new IndexRequest("posts").id("4")
//                .source(XContentType.JSON,"field", "baz"));

        BulkResponse bulkResponse = client.bulk(request, RequestOptions.DEFAULT);
    }

    /**
     * SearchRequest用于与搜索文档、聚合、建议有关的任何操作,还提供了请求突出显示结果文档的方法。
     */
    @Test
    public void SearchRequest() throws IOException {

        //创建SeachRequest。如果没有参数,则运行所有索引。
       /* SearchRequest searchRequest = new SearchRequest();

        //大多数搜索参数都添加到SearchSourceBuilder中。它为进入搜索请求体的所有内容提供setter。
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //向SearchSourceBuilder添加一个match_all查询。
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        searchRequest.source(searchSourceBuilder);
        */

        //查询具体得到索引下的数据
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //设置查询。可以是任何类型
        sourceBuilder.query(QueryBuilders.termQuery("name", "王五"));

        //分页
        sourceBuilder.from(0);
        sourceBuilder.size(5);

        //设置一个可选的超时,控制允许搜索花费的时间。
        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("posts");
        searchRequest.source(sourceBuilder);
        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
        //getProfileResults
        System.out.println(search);
        System.out.println(search.getProfileResults().get("name"));


    }

    /**
     * 模糊查询
     *
     * @throws IOException
     */
    @Test
    public void matchQueryBuilder() throws IOException {

        //QueryBuilder matchQueryBuilder = QueryBuilders.termQuery("user", "3").//也是模糊查询,但对中文不兼容
        // QueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("user", "王五").//模糊查询
//                .fuzziness(Fuzziness.AUTO)
//                .prefixLength(3)
//                .maxExpansions(10);*/

        //模糊查询
         MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("user.keyword", "李四");//加上.keyword就是精确查找
        matchQueryBuilder.fuzziness(Fuzziness.AUTO);
        matchQueryBuilder.prefixLength(0);// 在匹配查询上设置前缀长度选项
        matchQueryBuilder.maxExpansions(1);// 设置最大扩展选项以控制查询的模糊过程

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(matchQueryBuilder);

        //排序
        //Sort descending by _score (the default)
        searchSourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC));//
        //Also sort ascending by _id field
        searchSourceBuilder.sort(new FieldSortBuilder("_id").order(SortOrder.ASC));


        //查询指定字段   不查询指定字段
        //该方法还接受一个由一个或多个通配符模式组成的数组,以控制以更细粒度的方式包含或排除哪些字段:
//        searchSourceBuilder.fetchSource(false);
//        String[] includeFields = new String[]{"name"};
//        String[] excludeFields = Strings.EMPTY_ARRAY;
//        searchSourceBuilder.fetchSource(includeFields, excludeFields);


        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("posts");
        searchRequest.source(searchSourceBuilder);
        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);

        System.out.println(search);

    }

    /**
     * 聚合查询
     * 通过首先创建适当的AggregationBuilder,然后将其设置在SearchSourceBuilder上,
     * 可以将聚合添加到搜索中。在下面的示例中,我们创建了一个基于公司名称的术语聚合,其中包含一个关于公司员工平均年龄的子聚合
     * terms相当于是别名
     */

     /**
     * 聚合查询
     * 通过首先创建适当的AggregationBuilder,然后将其设置在SearchSourceBuilder上,
     * 可以将聚合添加到搜索中。在下面的示例中,我们创建了一个基于公司名称的术语聚合,其中包含一个关于公司员工平均年龄的子聚合
     * terms相当于是别名
     */
    @Test
    public void Aggregations() throws IOException {

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //查询条件
        QueryBuilder query = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("area.keyword", "阳原县"));
        //统计条件
        TermsAggregationBuilder serviceLineAgg = AggregationBuilders.terms("serviceline_count").field("area.keyword").size(30);
        TermsAggregationBuilder appNameAgg = AggregationBuilders.terms("appName_count").field("company_org_type.keyword").size(30);

        searchSourceBuilder.query(query).size(0);
       searchSourceBuilder.aggregation(serviceLineAgg.subAggregation(appNameAgg)).size(0);


        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("company");
        searchRequest.source(searchSourceBuilder);
        System.out.println(searchRequest);
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
       System.out.println(response);

        Map serviceLineMap = response.getAggregations().asMap();
        ParsedStringTerms serviceLineTerms = (ParsedStringTerms) serviceLineMap.get("serviceline_count");
        List serviceLists = serviceLineTerms.getBuckets();
        for (Object serviceList : serviceLists) {
            ParsedStringTerms.ParsedBucket serviceListObj = (ParsedStringTerms.ParsedBucket) serviceList;
            String serviceLine = serviceListObj.getKeyAsString();
            Map appNameMap = serviceListObj.getAggregations().asMap();
            ParsedStringTerms appNameTerms = (ParsedStringTerms) appNameMap.get("appName_count");
            List appNameLists = appNameTerms.getBuckets();
            for (Object appNameList : appNameLists) {
                ParsedStringTerms.ParsedBucket appNameObj = (ParsedStringTerms.ParsedBucket) appNameList;
                String appName = appNameObj.getKeyAsString();
                Long count = appNameObj.getDocCount();
                System.out.println(serviceLine );
                System.out.println(appName);
                System.out.println(count);
            }
        }


    }
 /**
     * 按月统计总数
     * @throws IOException
     */
    @Test
    public void Aggregations12() throws IOException {

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //查询条件
      //  QueryBuilder query = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("area.keyword", "阳原县"));
        QueryBuilder query = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("updatetime").gte("2019-04-19T01:00:00.000").lt("2019-08-19T00:00:00.000"));
        //TermsAggregationBuilder aggregation = AggregationBuilders.terms("by_company").field("company_org_type.keyword");
        AggregationBuilder  aggregation1 = AggregationBuilders.dateHistogram("group_by_day").
                field("updatetime").calendarInterval(DateHistogramInterval.MONTH).minDocCount(0).
                        format("yyyy-MM-dd HH:mm:ss").extendedBounds( new ExtendedBounds("2019-01-19 00:00:00","2019-08-19 00:00:00"));//这句话可以返回里其中的空文档

        //aggregation.subAggregation(aggregation1);
        searchSourceBuilder.aggregation(aggregation1).size(0);
        searchSourceBuilder.query(query).size(0);

        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("company");
        searchRequest.source(searchSourceBuilder);
        System.out.println(searchRequest);
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println("返回结果:"+response);


        Map serviceLineMap = response.getAggregations().asMap();
        ParsedDateHistogram serviceLineTerms = (ParsedDateHistogram) serviceLineMap.get("group_by_day");
        List serviceLists = serviceLineTerms.getBuckets();
        for (Object serviceList : serviceLists) {
            ParsedDateHistogram.ParsedBucket serviceListObj = (ParsedDateHistogram.ParsedBucket) serviceList;
            String serviceLine = serviceListObj.getKeyAsString();
            Map appNameMap = serviceListObj.getAggregations().asMap();
           // ParsedDateHistogram appNameTerms = (ParsedDateHistogram) appNameMap.get("group_by_day");
           System.out.println(serviceLine);
//            List appNameLists = appNameTerms.getBuckets();
//            for (Object appNameList : appNameLists) {
//                ParsedDateHistogram.ParsedBucket appNameObj = (ParsedDateHistogram.ParsedBucket) appNameList;
//                String appName = appNameObj.getKeyAsString();
//                Long count = appNameObj.getDocCount();
//                System.out.println(serviceLine);
//                System.out.println(appName);
//                System.out.println(count);
//            }
        }


    }
}


 /**
     * 按天统计  请求的人数
     *
     * @throws IOException
     */
    @Test
    public void Aggregations12() throws IOException {

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().trackTotalHits(true);
        QueryBuilder query = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("startTime.keyword").gte("2020-04-20 15:10:55").lte("2020-04-24 15:10:55")).must(QueryBuilders.termQuery("interfaceName.keyword", "/X/X/X/login/X"));//.must(QueryBuilders.termQuery("appId.keyword","1156082838098079746"));
        AggregationBuilder aggregation1 = AggregationBuilders.dateHistogram("group_by_day").
                field("endTime_UTC").calendarInterval(DateHistogramInterval.DAY).minDocCount(0).format("yyyy-MM-dd HH:mm:ss").extendedBounds(new ExtendedBounds("2020-04-19 00:00:00", "2020-04-24 00:00:00"))
                .subAggregation(AggregationBuilders.terms("requestParam").field("requestParam.keyword"));
        searchSourceBuilder.aggregation(aggregation1).size(0);//全局
        searchSourceBuilder.query(query).size(0);
        searchSourceBuilder.fetchSource(new String[]{"userId", "startTime", "appId"}, new String[]{});
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("log_index");
        searchRequest.source(searchSourceBuilder);
        System.out.println(searchRequest);
        SearchResponse response = AccountUserLogin.client().search(searchRequest, RequestOptions.DEFAULT);
        System.out.println("返回结果:" + response);

        Map serviceLineMap = response.getAggregations().asMap();
        ParsedDateHistogram serviceLineTerms = (ParsedDateHistogram) serviceLineMap.get("group_by_day");

        List buckets = (List) serviceLineTerms.getBuckets();

        Map map=new HashMap<>();
        JSONObject jsonObject=new JSONObject();

        for (int i = 0; i < buckets.size(); i++) {
            ParsedDateHistogram.ParsedBucket bucket = buckets.get(i);
            ZonedDateTime timestamp = (ZonedDateTime) bucket.getKey();
            System.out.println(timestamp);
            ParsedStringTerms lt = bucket.getAggregations().get("requestParam");
            List bucketList = (List) lt.getBuckets();
            HashSet hashSet = new HashSet<>();
            for (ParsedStringTerms.ParsedBucket item : bucketList) {
                String deliveryId = (String) item.getKey();
                JSONObject json= JSONObject.parseObject(deliveryId);
                hashSet.add(json.get("phone"));
            }
            jsonObject.put(timestamp+"",hashSet);
        }
        System.out.println(jsonObject);
    }



    /**
     * 多个索引之间查询
     */
    public void moreIndexs() throws IOException {

        FieldCapabilitiesRequest request = new FieldCapabilitiesRequest()
                .fields("user")
                .indices("posts", "authors", "contributors");

        request.indicesOptions(IndicesOptions.lenientExpandOpen());
        FieldCapabilitiesResponse response = client.fieldCaps(request, RequestOptions.DEFAULT);
        Map userResponse = response.getField("user");
        FieldCapabilities textCapabilities = userResponse.get("keyword");

        boolean isSearchable = textCapabilities.isSearchable();
        boolean isAggregatable = textCapabilities.isAggregatable();

        String[] indices = textCapabilities.indices();
        String[] nonSearchableIndices = textCapabilities.nonSearchableIndices();
        String[] nonAggregatableIndices = textCapabilities.nonAggregatableIndices();


    }

    /**
     *
     * 具体代码  可参考:https://blog.csdn.net/majun_guang/article/details/81103623
     * 根据多条件组合与查询
     *
     * 多条件或查询
     * must 就像sql里的and   相较于sql  select * from accounts.person where title='JAVA开发工程师' and age=30
     *
     *
     * should 就像sql里的or  SortBuilder 的作用不言而喻就是用来排序
     * 以上代码相较于sql  select * from   accounts.person where user='kimchy14' or  user='kimchy15'   ;
     *
     *
     * 范围查询rangeQuery.from(30,true)方法是大于30  后面的参数是是否包含 为true的话就是大于等于30 to就相当于小于
     * 如果也有包含参数为true的话就是小于等于  gt 是大于 gte是大于等于   lt是小于 lte是小于等于  第一句的builder就相当于 select * from accounts.person where age >=30 and age<=30; 
     *
     *
     * 包含查询使用termsQuery 可以传列表 也可以传多个参数 或者数组 setFetchSource有两个参数
     * 第一个参数是包含哪些参数 第二个参数是排除哪些参数   
     * 以上这段代码就相当于sql  select age from accounts.person where user in ('kimchy14','kimchy15','kimchy16');
     *
     *
     * 通配符查询像我们sql里的like 但是还不一样 like的百分号可以加到前后   
     * elasticsearch技术解析与实战中有一句话 是这么说的 为了避免极端缓慢的通配符查询
     * 通配符索引词不应该以一个通配符开头 通配符查询应该避免以通配符开头 
     *
     *
     常见统计  统计分为指标 和 桶 桶就是我们统计的样本  指标就是我们平时所查的count  sum  与sql不一样的是 我们还可以将统计的样本拿到 就是response.getHits

     */


    public void moretermQuery(){

//        QueryBuilder qb=QueryBuilders.termQuery("user","kimchy14");
//        QueryBuilder qb1=QueryBuilders.termQuery("user","kimchy15");
//
//        SortBuilder sortBuilder= SortBuilders.fieldSort("age");
//        sortBuilder.order(SortOrder.DESC);
//        QueryBuilder s=QueryBuilders.boolQuery().should(qb).should(qb1);//.must(qb5);
//        SearchRequestBuilder sv=client.prepareSearch("accounts").setTypes("person").setQuery(s).addSort(sortBuilder).setFrom(0)
//                .setSize(100);
//        logger.log(Level.INFO,sv.toString());
//        SearchResponse response=  sv.get();
//        SearchHits searchHits =  response.getHits();
//        for(SearchHit hit:searchHits.getHits()){
//            logger.log(Level.INFO , hit.getSourceAsString());
//        }
//
//        }


        //范围查询
        // RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").from(30,true).to(30,true);
//        // RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").gt(30 );
//        RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").gte(30 );
//        QueryBuilder s=QueryBuilders.boolQuery().must(rangeQueryBuilder);//.must(qb5);
//        SearchRequestBuilder sv=client.prepareSearch("accounts").setTypes("person").setQuery(s).setFrom(0)
//                .setSize(100);
//        logger.log(Level.INFO,sv.toString());
//        SearchResponse response=  sv.get();
//        SearchHits searchHits =  response.getHits();
//        for(SearchHit hit:searchHits.getHits()){
//            logger.log(Level.INFO , hit.getSourceAsString());
        }

    }

 

经过了挺大的心血,研究的差不多了,也能够用了.如有疑问,可以提问.

你可能感兴趣的:(java服务端)