Elasticsearch5.4.3关于javaAPI相关操作

【1】获取TransportClient

public static TransportClient getTransportClient() throws Exception{
        Settings settings = Settings.builder().put("cluster.name", "my-es").build();
        //创建client
        TransportClient client = new PreBuiltTransportClient(settings).addTransportAddresses(
                new InetSocketTransportAddress(InetAddress.getByName("192.168.242.140"), 9300),
                new InetSocketTransportAddress(InetAddress.getByName("192.168.242.141"), 9300),
                new InetSocketTransportAddress(InetAddress.getByName("192.168.242.142"), 9300));
        return client;
}

【2】创建索引

public static void addQuestionXuekebao(TransportClient client,QuestionXuekubaoVo xuekubao) throws IOException {
        Date date = new Date();
        IndexResponse response = client.prepareIndex("xuekubao", "t_question_xuekebao", xuekubao.getId().toString())
                .setSource(
                        jsonBuilder()
                                .startObject()
                                .field("idOld", xuekubao.getIdOld())
                                .field("content", xuekubao.getContent())
                                .field("answer", xuekubao.getAnswer())
                                .field("solution", xuekubao.getSolution())
                                .field("course", xuekubao.getCourse())
                                .field("grade", xuekubao.getGrade())
                                .field("picExistFlag", xuekubao.getPicExistflag())
                                .field("contentExistFlag", xuekubao.getContentExistFlag())
                                .field("answerExistFlag", xuekubao.getAnswerExistFlag())
                                .field("parseExistFlag", xuekubao.getParseExistFlag())
                                .field("createTime", xuekubao.getCreateTime())
                                .endObject()
                ).get();
}

【3】往type中增加数据

public static void addQuestionXuekebao(TransportClient client,QuestionXuekubaoVo xuekubao) throws IOException {
        Date date = new Date();
        IndexResponse response = client.prepareIndex("xuekubao", "t_question_xuekebao", xuekubao.getId().toString())
                .setSource(
                        jsonBuilder()
                                .startObject()
                                .field("idOld", xuekubao.getIdOld())
                                .field("content", xuekubao.getContent())
                                .field("answer", xuekubao.getAnswer())
                                .field("solution", xuekubao.getSolution())
                                .field("course", xuekubao.getCourse())
                                .field("grade", xuekubao.getGrade())
                                .field("picExistFlag", xuekubao.getPicExistflag())
                                .field("contentExistFlag", xuekubao.getContentExistFlag())
                                .field("answerExistFlag", xuekubao.getAnswerExistFlag())
                                .field("parseExistFlag", xuekubao.getParseExistFlag())
                                .field("createTime", xuekubao.getCreateTime())
                                .endObject()
                ).get();
}

【4】查询type下的所有数据

@Test
public void getAllXuekubaoByquestion(){
    SearchRequestBuilder srb=client.prepareSearch("xuekubao").setTypes("t_question_xuekebao");
    SearchResponse sr=srb.setQuery(QueryBuilders.matchAllQuery()).execute().actionGet(); // 查询所有
    SearchHits hits=sr.getHits();
    long totalHits = hits.getTotalHits();
    System.out.println("总记录数为:"+totalHits);
    for(SearchHit hit:hits){
        System.out.println(hit.getSourceAsString());
    }
}

【5】条件查询type下的数据

    @Test
    public void testMultiGetXuekubao() throws IOException {
        long start,end;
        start=System.currentTimeMillis();
        MultiGetResponse multiGetItemResponses = client.prepareMultiGet()
                .add("xuekubao", "t_question_xuekebao","33247")
                .get();
        end=System.currentTimeMillis();
        System.out.println("查询一条数据需要时间:"+(end-start)+"ms");
        Iterator<MultiGetItemResponse> iterator = multiGetItemResponses.iterator();

        for (MultiGetItemResponse itemResponse : multiGetItemResponses) {
            GetResponse response = itemResponse.getResponse();
            if (response.isExists()) {
                String json = response.getSourceAsString();
                System.out.println(json);
            }
        }
    }


 @Test
   public void getDataXuekubaoByGrade(){
       MatchQueryBuilder builder = QueryBuilders.matchQuery("grade", "高三");
       SearchResponse response =         
        client.prepareSearch("xuekubao").setQuery(builder).get();
       SearchHits hits = response.getHits();
        long totalHits = hits.getTotalHits();
        System.out.println("总记录数为:"+totalHits);
        for(SearchHit hit:hits) {
            System.out.println(hit.getSourceAsString());
            //将获取的值转换成map的形式
            Map<String, Object> map = hit.getSourceAsMap();
            for(String key:map.keySet()) {
                System.out.println(key +" key对应的值为:" +map.get(key));
            }
        }
   }

【6】分页查询

@Test
    public void searchPagingXuekubao() {
        SearchRequestBuilder srb=client.prepareSearch("xuekubao").setTypes("t_question_xuekebao");
        SearchResponse sr=srb.setQuery(QueryBuilders.matchAllQuery()).setFrom(0).setSize(100).execute().actionGet();
        SearchHits hits=sr.getHits();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
}

【7】聚合查询

/**
     * https://elasticsearch.cn/article/102
     *
     * select team, count(*) as player_count from player group by team;
     */
    @Test
    public void testAgg1() {

        //指定索引和type
        SearchRequestBuilder builder = client.prepareSearch("player_info").setTypes("player");
        //按team分组然后聚合,但是并没有指定聚合函数
        TermsAggregationBuilder teamAgg = AggregationBuilders.terms("player_count").field("team");
        //添加聚合器
        builder.addAggregation(teamAgg);
        //触发
        SearchResponse response = builder.execute().actionGet();
        //System.out.println(response);
        //将返回的结果放入到一个map中
        Map<String, Aggregation> aggMap = response.getAggregations().getAsMap();
//        Set<String> keys = aggMap.keySet();
//
//        for (String key: keys) {
//            System.out.println(key);
//        }

//        //取出聚合属性
        StringTerms terms = (StringTerms) aggMap.get("player_count");


        //
        //依次迭代出分组聚合数据
//        for (Terms.Bucket bucket : terms.getBuckets()) {
//            //分组的名字
//            String team = (String) bucket.getKey();
//            //count,分组后一个组有多少数据
//            long count = bucket.getDocCount();
//            System.out.println(team + " " + count);
//        }

        Iterator<Terms.Bucket> teamBucketIt = terms.getBuckets().iterator();
        while (teamBucketIt .hasNext()) {
            Terms.Bucket bucket = teamBucketIt.next();
            String team = (String) bucket.getKey();

            long count = bucket.getDocCount();

            System.out.println(team + " " + count);
        }

    }

    /**
     * select team, position, count(*) as pos_count from player group by team, position;
     */
    @Test
    public void testAgg2() {
        SearchRequestBuilder builder = client.prepareSearch("player_info").setTypes("player");
        //指定别名和分组的字段
        TermsAggregationBuilder teamAgg = AggregationBuilders.terms("team_name").field("team");
        TermsAggregationBuilder posAgg= AggregationBuilders.terms("pos_count").field("position");
        //添加两个聚合构建器
        builder.addAggregation(teamAgg.subAggregation(posAgg));
        //执行查询
        SearchResponse response = builder.execute().actionGet();
        //将查询结果放入map中
        Map<String, Aggregation> aggMap = response.getAggregations().getAsMap();
        //根据属性名到map中查找
        StringTerms teams = (StringTerms) aggMap.get("team_name");
        //循环查找结果
        for (Terms.Bucket teamBucket : teams.getBuckets()) {
            //先按球队进行分组
            String team = (String) teamBucket.getKey();
            Map<String, Aggregation> subAggMap = teamBucket.getAggregations().getAsMap();
            StringTerms positions = (StringTerms) subAggMap.get("pos_count");
            //因为一个球队有很多位置,那么还要依次拿出位置信息
            for (Terms.Bucket posBucket : positions.getBuckets()) {
                //拿到位置的名字
                String pos = (String) posBucket.getKey();
                //拿出该位置的数量
                long docCount = posBucket.getDocCount();
                //打印球队,位置,人数
                System.out.println(team + " " + pos + " " + docCount);
            }


        }
    }


    /**
     * select team, max(age) as max_age from player group by team;
     */
    @Test
    public void testAgg3() {
        SearchRequestBuilder builder = client.prepareSearch("player_info").setTypes("player");
        //指定安球队进行分组
        TermsAggregationBuilder teamAgg = AggregationBuilders.terms("team_name").field("team");
        //指定分组求最大值
        MaxAggregationBuilder maxAgg = AggregationBuilders.max("max_age").field("age");
        //分组后求最大值
        builder.addAggregation(teamAgg.subAggregation(maxAgg));
        //查询
        SearchResponse response = builder.execute().actionGet();
        Map<String, Aggregation> aggMap = response.getAggregations().getAsMap();
        //根据team属性,获取map中的内容
        StringTerms teams = (StringTerms) aggMap.get("team_name");
        for (Terms.Bucket teamBucket : teams.getBuckets()) {
            //分组的属性名
            String team = (String) teamBucket.getKey();
            //在将聚合后取最大值的内容取出来放到map中
            Map<String, Aggregation> subAggMap = teamBucket.getAggregations().getAsMap();
            //取分组后的最大值
            InternalMax ages = (InternalMax)subAggMap.get("max_age");
            double max = ages.getValue();
            System.out.println(team + " " + max);
        }
    }

    /**
     * select team, avg(age) as avg_age, sum(salary) as total_salary from player group by team;
     */
    @Test
    public void testAgg4() {
        SearchRequestBuilder builder = client.prepareSearch("player_info").setTypes("player");
        //指定分组字段
        TermsAggregationBuilder termsAgg = AggregationBuilders.terms("team_name").field("team");
        //指定聚合函数是求平均数据
        AvgAggregationBuilder avgAgg = AggregationBuilders.avg("avg_age").field("age");
        //指定另外一个聚合函数是求和
        SumAggregationBuilder sumAgg = AggregationBuilders.sum("total_salary").field("salary");
        //分组的聚合器关联了两个聚合函数
        builder.addAggregation(termsAgg.subAggregation(avgAgg).subAggregation(sumAgg));
        SearchResponse response = builder.execute().actionGet();
        Map<String, Aggregation> aggMap = response.getAggregations().getAsMap();
        //按分组的名字取出数据
        StringTerms teams = (StringTerms) aggMap.get("team_name");
        for (Terms.Bucket teamBucket : teams.getBuckets()) {
            //获取球队名字
            String team = (String) teamBucket.getKey();
            Map<String, Aggregation> subAggMap = teamBucket.getAggregations().getAsMap();
            //根据别名取出平均年龄
            InternalAvg avgAge = (InternalAvg)subAggMap.get("avg_age");
            //根据别名取出薪水总和
            InternalSum totalSalary = (InternalSum)subAggMap.get("total_salary");
            double avgAgeValue = avgAge.getValue();
            double totalSalaryValue = totalSalary.getValue();
            System.out.println(team + " " + avgAgeValue + " " + totalSalaryValue);
        }
    }


    /**
     * select team, sum(salary) as total_salary from player group by team order by total_salary desc;
     */
    @Test
    public void testAgg5() {
        SearchRequestBuilder builder = client.prepareSearch("player_info").setTypes("player");
        //按team进行分组,然后指定排序规则
        TermsAggregationBuilder termsAgg = AggregationBuilders.terms("team_name").field("team").order(Terms.Order.aggregation("total_salary ", true));
        SumAggregationBuilder sumAgg = AggregationBuilders.sum("total_salary").field("salary");
        builder.addAggregation(termsAgg.subAggregation(sumAgg));
        SearchResponse response = builder.execute().actionGet();
        Map<String, Aggregation> aggMap = response.getAggregations().getAsMap();
        StringTerms teams = (StringTerms) aggMap.get("team_name");
        for (Terms.Bucket teamBucket : teams.getBuckets()) {
            String team = (String) teamBucket.getKey();
            Map<String, Aggregation> subAggMap = teamBucket.getAggregations().getAsMap();
            InternalSum totalSalary = (InternalSum)subAggMap.get("total_salary");
            double totalSalaryValue = totalSalary.getValue();
            System.out.println(team + " " + totalSalaryValue);
        }
    }

【8】删除

@Test
    public void testDeleteXuekubao() {
        DeleteResponse response = client.prepareDelete("xuekubao", "t_question_xuekebao", "1").get();
        System.out.println(response);
}


以下为curl删除某个type下的语句

curl -XPOST 'http://192.168.242.140:9200/xuekubao/t_question_xuekebao/_delete_by_query?conflicts=proceed&pretty' -H 'Content-Type: application/json' -d'
{
  "query": {
    "match_all": {}
  }
}
';

其他的操作后续再加吧

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值