elasticsearch简单操作

1、Index API

public void indexData() throws IOException {

        IndexRequest indexRequest = new IndexRequest("users");
        indexRequest.id("1");   //数据的id

        // indexRequest.source("userName","zhangsan","age",18,"gender","男");

        User user = new User();
        user.setUserName("zhangsan");
        user.setAge(18);
        user.setGender("男");

        String jsonString = JSON.toJSONString(user);
        indexRequest.source(jsonString, XContentType.JSON);  //要保存的内容

        //执行操作
        IndexResponse index = client.index(indexRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);

        //提取有用的响应数据
        System.out.println(index);

    }

    @Getter
    @Setter
    class User {
        private String userName;
        private String gender;
        private Integer age;
    }

2、GET API

    @Test
    public void getData() throws IOException {
        GetRequest request = new GetRequest("users", "1");
       // request.fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE);
        GetResponse getResponse = client.get(request,GulimallElasticSearchConfig.COMMON_OPTIONS);
        if (getResponse.isExists()){
            System.out.println(getResponse.getSource());
        }
    }

3、DEL API

    public void delData() throws IOException {
        DeleteRequest request = new DeleteRequest("users", "1");
        // request.fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE);
        request.timeout(TimeValue.timeValueSeconds(2));
        DeleteResponse delete = client.delete(request,GulimallElasticSearchConfig.COMMON_OPTIONS);
        if (delete.getResult() == DocWriteResponse.Result.DELETED) {
            System.out.println(delete.status());
        }

    }

4、复杂检索:在bank中搜索address中包含mill的所有人的年龄分布以及平均年龄,平均薪资

    public void searchData() throws IOException {
        //1. 创建检索请求
        SearchRequest searchRequest = new SearchRequest();

        //1.1)指定索引
        searchRequest.indices("bank");
        //1.2)构造检索条件
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.matchQuery("address", "Mill"));


        //1.2.1)按照年龄分布进行聚合
        TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
        sourceBuilder.aggregation(ageAgg);

        //1.2.2)计算平均年龄
        AvgAggregationBuilder ageAvg = AggregationBuilders.avg("ageAvg").field("age");
        sourceBuilder.aggregation(ageAvg);
        //1.2.3)计算平均薪资
        AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
        sourceBuilder.aggregation(balanceAvg);

        System.out.println("检索条件:" + sourceBuilder);
        searchRequest.source(sourceBuilder);
        //2. 执行检索
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println("检索结果:" + searchResponse);

        //3. 将检索结果封装为Bean
        SearchHits hits = searchResponse.getHits();
        SearchHit[] searchHits = hits.getHits();
        for (SearchHit searchHit : searchHits) {
            String sourceAsString = searchHit.getSourceAsString();
            Account account = JSON.parseObject(sourceAsString, Account.class);
            System.out.println(account);

        }

        //4. 获取聚合信息
        Aggregations aggregations = searchResponse.getAggregations();

        Terms ageAgg1 = aggregations.get("ageAgg");

        for (Terms.Bucket bucket : ageAgg1.getBuckets()) {
            String keyAsString = bucket.getKeyAsString();
            System.out.println("年龄:" + keyAsString + " ==> " + bucket.getDocCount());
        }
        Avg ageAvg1 = aggregations.get("ageAvg");
        System.out.println("平均年龄:" + ageAvg1.getValue());

        Avg balanceAvg1 = aggregations.get("balanceAvg");
        System.out.println("平均薪资:" + balanceAvg1.getValue());
    }

5 查询条件

 public List<Product> queryEsList(@RequestBody SearchDto dto) throws IOException {
        //QueryBuilder queryBuilder = QueryBuilders.termQuery("name", dto.getName());
        //QueryBuilder queryBuilder = QueryBuilders.rangeQuery("price").gt(0).lte(9000);
        //QueryBuilder queryBuilder = QueryBuilders.matchQuery("name", dto.getName());
        QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("手机", "name", "lv");
        return getProducts(queryBuilder);
    }

    private List<Product> getProducts(QueryBuilder queryBuilder) throws IOException {
        // 1.query 精准查询 查询会计算文档得分 并根据得分返回
        // 2. filter query 过滤查询 用来在大量数据查询中筛选出本地查询相关数据 不会计算得分 会对结果进行缓存
        SearchRequest request = new SearchRequest("product");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //高亮处理
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.requireFieldMatch(false).field("name").field("price").postTags("<a>").preTags("</a>");
        //指定返回字段
        String[] include = {"name", "price", "type"};
        searchSourceBuilder
                .query(queryBuilder)
                .from(0)
                .size(10)
                .fetchSource(include, new String[]{"createTime"})
                //排序
                .sort("price", SortOrder.DESC)
                //指定过滤条件
                .postFilter(QueryBuilders.matchQuery("name","手机"))
                .highlighter(highlightBuilder);
        request.source(searchSourceBuilder);
        SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        List<Map<String, Object>> mapList = Lists.newArrayListWithCapacity(response.getHits().getHits().length);
        Arrays.stream(response.getHits().getHits()).forEach(his -> mapList.add(his.getSourceAsMap()));
        List<Product> userList = new ArrayList<>();
        if (!CollectionUtils.isEmpty(mapList)) {
            userList = JSONArray.parseArray(JSON.toJSONString(mapList), Product.class);
        }
        SearchHit[] hits = response.getHits().getHits();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            if (highlightFields.containsKey("name")) {
                System.out.println(highlightFields.get("name").fragments()[0]);
            }
        }
        return userList;
    }

开发文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元气满满@WJW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值