• 谷粒商城学习—— P127 es整合,测试复杂检索


    官网:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-search.html

    JSON工具在线:https://www.bejson.com/

    package com.atguigu.gulimall.search;
    
    import com.alibaba.fastjson.JSON;
    import com.atguigu.gulimall.search.config.GulimallElasticSearchConfig;
    import lombok.Data;
    import lombok.ToString;
    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.client.RestHighLevelClient;
    import org.elasticsearch.common.xcontent.XContentType;
    import org.elasticsearch.index.query.QueryBuilders;
    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.aggregations.metrics.AvgAggregationBuilder;
    import org.elasticsearch.search.builder.SearchSourceBuilder;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import javax.annotation.Resource;
    import java.io.IOException;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class GulimallSearchApplicationTests {
        @Resource private RestHighLevelClient client;
    
        @Test
        public void searchData() throws IOException {
            //1.创建检索请求
            SearchRequest searchRequest=new SearchRequest();
            searchRequest.indices("bank");//指定从bank索引下检索数据
            //指定 dsl,检索条件,
            //dsl(uri+请求体的语法,程序Query DSL (domain-specific language)领域特定语言)
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            //1.1 构造检索条件
    //        searchSourceBuilder.query();
    //        searchSourceBuilder.from();
    //        searchSourceBuilder.size();
    //        searchSourceBuilder.aggregation();
            searchSourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
            //1.2 按照年龄值分布聚合
            TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
            searchSourceBuilder.aggregation(ageAgg);
            //1.3 计算平均薪资
            AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
            searchSourceBuilder.aggregation(balanceAvg);
    
    
            System.out.println("检索条件"+searchSourceBuilder.toString());
            searchRequest.source(searchSourceBuilder);
    
            //2.执行检索
            SearchResponse searchResponse = client.search(searchRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);
            //3.分析结果
            System.out.println(searchResponse.toString());
    //        Map map = JSON.parseObject(searchResponse.toString(), Map.class);
            //3.1 获取所有查到的数据
            SearchHits hits = searchResponse.getHits();
            SearchHit[] searchHits = hits.getHits();
            for (SearchHit hit : searchHits) {
               /* "_index" : "bank",
                        "_type" : "account",
                        "_id" : "970",
                        "_score" : 5.4032025,
                        "_source" : */
    //            hit.getIndex();hit.getType();hit.getId();
                String string = hit.getSourceAsString();
                Account account = JSON.parseObject(string, Account.class);
                System.out.println("account:"+account);
            }
            //3.2 获取这次检索到的分析信息
    
            Aggregations aggregations = searchResponse.getAggregations();
            Terms ageAgg1 = aggregations.get("ageAgg");
            for (Terms.Bucket bucket : ageAgg1.getBuckets()) {
                System.out.println("年龄:"+bucket.getKeyAsString()+"==>"+bucket.getDocCount());
            }
            Avg balanceAvg1 = aggregations.get("balanceAvg");
            System.out.println("平均薪资:"+balanceAvg1.getValueAsString());
        }
        /**
         * 测试存储数据到es
         */
        @Test
        public void indexData() throws IOException {
            IndexRequest indexRequest = new IndexRequest("users");//向users下存数据
            indexRequest.id("1");//不设会自动生成
    //        indexRequest.source("userName", "zhangsan","age", 18,"gender", "男");//数据内容形式,k-v形式
            User user= new User();
            user.setUserName("zhangsan");
            user.setAge(18);
            user.setGender("男");
            String jsonString = JSON.toJSONString(user);
            indexRequest.source(jsonString, XContentType.JSON);//数据内容形式,json形式
            //执行操作。索引数据不存在数据就生成,存在就更新
            IndexResponse index = client.index(indexRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);
            System.out.println(index);
        }
        @Data
        static
        class User{
            private String userName;
            private Integer age;
            private String gender;
        }
        @Test
        public void contextLoads() {
            System.out.println(client);
        }
    
        /**
         * Copyright 2021 bejson.com
         */
        @Data
        @ToString
        static
        class Account {
            private int account_number;
            private int balance;
            private String firstname;
            private String lastname;
            private int age;
            private String gender;
            private String address;
            private String employer;
            private String email;
            private String city;
            private String state;
        }
    }

    打印:

    检索条件{"query":{"match":{"address":{"query":"mill","operator":"OR","prefix_length":0,"max_expansions":50,"fuzzy_transpositions":true,"lenient":false,"zero_terms_query":"NONE","auto_generate_synonyms_phrase_query":true,"boost":1.0}}},"aggregations":{"ageAgg":{"terms":{"field":"age","size":10,"min_doc_count":1,"shard_min_doc_count":0,"show_term_doc_count_error":false,"order":[{"_count":"desc"},{"_key":"asc"}]}},"balanceAvg":{"avg":{"field":"balance"}}}}
    {"took":11,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":4,"relation":"eq"},"max_score":5.4032025,"hits":[{"_index":"bank","_type":"account","_id":"970","_score":5.4032025,"_source":{"account_number":970,"balance":19648,"firstname":"Forbes","lastname":"Wallace","age":28,"gender":"M","address":"990 Mill Road","employer":"Pheast","email":"forbeswallace@pheast.com","city":"Lopezo","state":"AK"}},{"_index":"bank","_type":"account","_id":"136","_score":5.4032025,"_source":{"account_number":136,"balance":45801,"firstname":"Winnie","lastname":"Holland","age":38,"gender":"M","address":"198 Mill Lane","employer":"Neteria","email":"winnieholland@neteria.com","city":"Urie","state":"IL"}},{"_index":"bank","_type":"account","_id":"345","_score":5.4032025,"_source":{"account_number":345,"balance":9812,"firstname":"Parker","lastname":"Hines","age":38,"gender":"M","address":"715 Mill Avenue","employer":"Baluba","email":"parkerhines@baluba.com","city":"Blackgum","state":"KY"}},{"_index":"bank","_type":"account","_id":"472","_score":5.4032025,"_source":{"account_number":472,"balance":25571,"firstname":"Lee","lastname":"Long","age":32,"gender":"F","address":"288 Mill Street","employer":"Comverges","email":"leelong@comverges.com","city":"Movico","state":"MT"}}]},"aggregations":{"lterms#ageAgg":{"doc_count_error_upper_bound":0,"sum_other_doc_count":0,"buckets":[{"key":38,"doc_count":2},{"key":28,"doc_count":1},{"key":32,"doc_count":1}]},"avg#balanceAvg":{"value":25208.0}}}
    account:GulimallSearchApplicationTests.Account(account_number=970, balance=19648, firstname=Forbes, lastname=Wallace, age=28, gender=M, address=990 Mill Road, employer=Pheast, email=forbeswallace@pheast.com, city=Lopezo, state=AK)
    account:GulimallSearchApplicationTests.Account(account_number=136, balance=45801, firstname=Winnie, lastname=Holland, age=38, gender=M, address=198 Mill Lane, employer=Neteria, email=winnieholland@neteria.com, city=Urie, state=IL)
    account:GulimallSearchApplicationTests.Account(account_number=345, balance=9812, firstname=Parker, lastname=Hines, age=38, gender=M, address=715 Mill Avenue, employer=Baluba, email=parkerhines@baluba.com, city=Blackgum, state=KY)
    account:GulimallSearchApplicationTests.Account(account_number=472, balance=25571, firstname=Lee, lastname=Long, age=32, gender=F, address=288 Mill Street, employer=Comverges, email=leelong@comverges.com, city=Movico, state=MT)
    年龄:38==>2
    年龄:28==>1
    年龄:32==>1
    平均薪资:25208.0
  • 相关阅读:
    [spring]AOP(切面)编程
    [spring]基于注解的spring配置
    [redis]redis五种数据类型和应用场景
    [redis]redis实现分页的方法
    [zookeeper]ZooInspector的使用
    [log4j]SLF4J+log4j的使用
    [zookeeper]依赖jar的问题
    导出word功能,用html代码在word中插入分页符
    jq实现千分位的转换
    oracle 创建表空间及oracle 11g表空间之最大最小
  • 原文地址:https://www.cnblogs.com/yanan7890/p/15641511.html
Copyright © 2020-2023  润新知