【SpringBoot】整合ElasticSearch


搭建环境

  1. IDEA创建一个SpringBoot项目,勾选Spring Web依赖。
  2. 需要导入的其他依赖
<!--es,版本要和所按照的ELK版本匹配-->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.6.2</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.73</version>
        </dependency>

  1. 配置信息application.properties
# 应用名称
spring.application.name=springboot-es
# 应用服务 WEB 访问端口
server.port=8080

spring.elasticsearch.rest.uris=http://XXX:9200

整合

给容器中注入一个RestHighLeveLClient
参考官方文档:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-getting-started-initialization.html

@Configuration
public class ElasticSearchConfig {

    public static final RequestOptions COMMON_OPTIONS;
    static {
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
//        builder.addHeader("Authorization", "Bearer " + TOKEN);
//        builder.setHttpAsyncResponseConsumerFactory(
//                new HttpAsyncResponseConsumerFactory
//                        .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
        COMMON_OPTIONS = builder.build();
    }
    
    @Bean
    public RestClient esRestClient(){
        RestClient restClient = RestClient.builder(
                //new HttpHost("IP地址", 9200, "http"),
                new HttpHost("192.10.10.10", 9201, "http")).build();
        return restClient;
    }
}

对ES进行操作

参考官方文档:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/_index_apis.html

  1. 测试存储数据到es
@SpringBootTest
class SpringbootEsApplicationTests {
    @Autowired
    private RestHighLevelClient client;

    @Test
    void createIndex() throws IOException {
        //在users索引下存储数据
        IndexRequest request = new IndexRequest("users");
        //request.id("1");//数据id
        User user = new User(1,"高朗","男",18);
        String jsonString = JSON.toJSONString(user);//要保存的内容
        request.source(jsonString,XContentType.JSON);
        //存储操作
        IndexResponse index = client.index(request, ElasticSearchConfig.COMMON_OPTIONS);
        System.out.println(index);

    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    class User{
        private Integer id;
        private String name;
        private String sex;
        private Integer age;
    }

}

在这里插入图片描述
在这里插入图片描述

  1. 检索
    示例一:
GET /bank/_search
{
  "query": {
    "match_phrase": {
      "address": "mill"
    }
  }
}
@SpringBootTest
class SpringbootEsApplicationTests {
    @Autowired
    private RestHighLevelClient client;

    @Test
    void search() throws IOException {
        //1. 创建索引请求
        SearchRequest searchRequest = new SearchRequest();
        //指定索引
        searchRequest.indices("bank");
        //指定DSL,检索条件
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
/*        sourceBuilder.query();
        sourceBuilder.from();
        sourceBuilder.size();
        sourceBuilder.aggregation();*/
        sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
        System.out.println(sourceBuilder.toString());


        searchRequest.source(sourceBuilder);

        //2. 执行检索
        SearchResponse search = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);

        System.out.println(search.toString());

    }

}

打印信息JSON格式化一下

{
  "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
      }
    }
  }
}

{
  "took": 1578,
  "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"
        }
      }
    ]
  }
}

示例二:

GET /bank/_search
{
  "query": {
    "match_phrase": {
      "address": "mill"
    }
  },
  "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 10
      }
    },
    "balanceAgg": {
      "avg": {
        "field": "balance"
      }
    }
  },
  "size": 0
}

@SpringBootTest
class SpringbootEsApplicationTests {
    @Autowired
    private RestHighLevelClient client;

    @Test
    void search() throws IOException {
        //1. 创建索引请求
        SearchRequest searchRequest = new SearchRequest();
        //指定索引
        searchRequest.indices("bank");
        //指定DSL,检索条件
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));

        //按照年龄的值分布进行聚合
        TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
        sourceBuilder.aggregation(ageAgg);
        //计算平均薪资
        AvgAggregationBuilder balanceAgg = AggregationBuilders.avg("balanceAgg").field("balance");
        sourceBuilder.aggregation(balanceAgg);

        sourceBuilder.size(0);

        System.out.println(sourceBuilder.toString());



        searchRequest.source(sourceBuilder);

        //2. 执行检索
        SearchResponse search = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);

        System.out.println(search.toString());

    }

}
{
  "size": 0,
  "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"
          }
        ]
      }
    },
    "balanceAgg": {
      "avg": {
        "field": "balance"
      }
    }
  }
}

{
  "took": 355,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 4,
      "relation": "eq"
    },
    "max_score": null,
    "hits": [
      
    ]
  },
  "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#balanceAgg": {
      "value": 25208.0
    }
  }
}

我们可以把检索到的数据保存到Map集合中,通过key取自己想要的信息

        Map map = JSON.parseObject(search.toString(), Map.class);

但是检索到的信息中最重要的是hits和aggregations里面的信息怎样直接获取:
在这里插入图片描述

@SpringBootTest
class SpringbootEsApplicationTests {
    @Autowired
    private RestHighLevelClient client;

    @Test
    void search() throws IOException {
        //1. 创建索引请求
        SearchRequest searchRequest = new SearchRequest();
        //指定索引
        searchRequest.indices("bank");
        //指定DSL,检索条件
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));

        //按照年龄的值分布进行聚合
        TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
        sourceBuilder.aggregation(ageAgg);
        //计算平均薪资
        AvgAggregationBuilder balanceAgg = AggregationBuilders.avg("balanceAgg").field("balance");
        sourceBuilder.aggregation(balanceAgg);

        //System.out.println(sourceBuilder.toString());


        searchRequest.source(sourceBuilder);

        //2. 执行检索
        SearchResponse search = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);

        //System.out.println(search.toString());

        //Map map = JSON.parseObject(search.toString(), Map.class);

        //Hits信息
        //第一个大Hits里面
        SearchHits searchHits = search.getHits();
        //获取hits
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            //转换成String对象
            String sourceAsString = hit.getSourceAsString();
            //String转Acount对象
            Acount acount = JSON.parseObject(sourceAsString, Acount.class);
            System.out.println(acount.toString());
        }

        //分析信息Aggregations
        Aggregations aggregations = search.getAggregations();

        Terms ageAgg1 = aggregations.get("ageAgg");
        for (Terms.Bucket bucket : ageAgg1.getBuckets()) {
            String keyAsString = bucket.getKeyAsString();
            System.out.println("年龄:"+keyAsString+"   "+bucket.getDocCount());
        }

        Avg balanceAvg = aggregations.get("balanceAgg");
        System.out.println("平均工资:"+balanceAvg.getValue());


    }


    @Data
    @ToString
    static class Acount {
        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;

    }

}

打印信息:

SpringbootEsApplicationTests.Acount(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)
SpringbootEsApplicationTests.Acount(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)
SpringbootEsApplicationTests.Acount(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)
SpringbootEsApplicationTests.Acount(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
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值