SpringBoot结合elasticsearch

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

01.引入依赖

2.3.7

  <properties>
        <java.version>1.8</java.version>
        <elasticsearch.version>7.4.2</elasticsearch.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>cn.sgy</groupId>
            <artifactId>sgymall-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>${elasticsearch.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

02.配置类

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class LemeiElasticSearchConfig {
    @Bean
    public RestHighLevelClient esRestClient(){
        RestClientBuilder restClientBuilder;
        RestHighLevelClient client=new RestHighLevelClient(RestClient.builder(new HttpHost("216.127.*.*",9200,"http")));
        return  client;
    }
}

03.application.yml

spring:
  application:
    name: sgymall-search
  cloud:
    nacos:
      discovery:
        server-addr: 216.127.*.*:8848

04.测试类

@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class SgymallSearchApplication {

    public static void main(String[] args) {
        SpringApplication.run(SgymallSearchApplication.class, args);
    }

}

import org.elasticsearch.client.RestHighLevelClient;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class SgymallSearchApplicationTests {

    @Autowired
    RestHighLevelClient client;
    @Test
    void contextLoads() {
        System.out.println(client);
    }

}

05.功能

1.创建索引,查询,聚合,分析,查单个


import cn.sgy.sgymallsearch.config.LemeiElasticSearchConfig;
import com.alibaba.fastjson.JSON;
import lombok.Data;
import lombok.ToString;
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.client.RequestOptions;
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.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.ws.rs.GET;
import java.io.IOException;
import java.util.Map;

@SpringBootTest
class SgymallSearchApplicationTests {

    @Data
    class User{
        private int age;
        private String username;
        private String gender;
    }


    @ToString
    @Data
    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;
    }

    @Autowired
    RestHighLevelClient client;
    //  GET user/_search
    @Test   //
    public  void createIndex() throws IOException {
        IndexRequest request = new IndexRequest("user");
        // 数据id
        request.id("1");
        request.source("userName","张三");
        User user = new User();
        user.setUsername("张三2");
        user.setAge(18);
        user.setGender("男");
        String jsonString = JSON.toJSONString(user);
        request.source(jsonString, XContentType.JSON);//要保存的数据
        IndexResponse index = client.index(request, LemeiElasticSearchConfig.COMMON_OPTIONS);
        System.out.println(index);
    }
    @Test
    public void searchData() throws IOException {
        //1、创建检索请求
        SearchRequest searchRequest = new SearchRequest();
        //指定索引
        searchRequest.indices("bank");
        //指定DsL,检索条件
        // SearchSourceBuiLder sourceBuiLde
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //1.1)、构造检索条件
//sounceBuiLder.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, LemeiElasticSearchConfig.COMMON_OPTIONS);
        //3、分析结果
        System.out.println(search.toString());

    }

    // 聚合
    @Test
    public void searchDataAgg() throws IOException {
        //1、创建检索请求
        SearchRequest searchRequest = new SearchRequest();
        //指定索引
        searchRequest.indices("bank");
        //指定DsL,检索条件
        // SearchSourceBuiLder sourceBuiLde
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //1.1)、构造检索条件
//sounceBuiLder.query ();
//sourceBuiLder.from();
//sourceBuiLder.size();
//sourceBuiLder.aggregation(
        sourceBuilder.query(QueryBuilders.matchQuery("address", "mill"));
        //聚合
        1.2)、按照年龄的值分布进行聚合
        TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age");
        sourceBuilder.aggregation(ageAgg);
        1.3)、计算平均薪资
        AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
        sourceBuilder.aggregation(balanceAvg);

        System.out.println("检索条件:"+sourceBuilder.toString());
        searchRequest.source(sourceBuilder);
        // 2、执行检索
        SearchResponse search = client.search(searchRequest, LemeiElasticSearchConfig.COMMON_OPTIONS);
        //3、分析结果
        System.out.println(search.toString());

    }


    @Test
    public void searchDataAnki() throws IOException {

        //1、创建检索请求
        SearchRequest searchRequest = new SearchRequest();
        //指定索引
        searchRequest.indices("bank");
        //指定DsL,检索条件
        // SearchSourceBuiLder sourceBuiLde
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //1.1)、构造检索条件
//sounceBuiLder.query ();
//sourceBuiLder.from();
//sourceBuiLder.size();
//sourceBuiLder.aggregation(
        sourceBuilder.query(QueryBuilders.matchQuery("address", "mill"));
        //聚合
        1.2)、按照年龄的值分布进行聚合
        TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age");
        sourceBuilder.aggregation(ageAgg);
        1.3)、计算平均薪资
        AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
        sourceBuilder.aggregation(balanceAvg);

        System.out.println("检索条件:"+sourceBuilder.toString());
        searchRequest.source(sourceBuilder);
        // 2、执行检索
        SearchResponse search = client.search(searchRequest, LemeiElasticSearchConfig.COMMON_OPTIONS);
        //3、分析结果
        System.out.println(search.toString());



        //  Map map=JSON. parseObject(searchResponse. toString(), Map.class);
        //3.1)、获取所有查到的数据
        SearchHits hits = search.getHits( );
        SearchHit[] searchHits = hits. getHits();
        for (SearchHit hit : searchHits) {
//            hit.getType();
            //  hit.getSourceAsMap()
            String sourceAsString = hit.getSourceAsString();
            System.out.println(sourceAsString);
            Account account = JSON.parseObject(sourceAsString, Account.class);
            System.out.println(account);
        }

        //3.2)、获取这次检索到的分析信息:
        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 ageAvg1 = aggregations.get("ageAvg");
        System.out.println("平均年龄:"+ageAvg1.getValue());
        Avg balanceAvg1 = aggregations.get("balanceAvg");
        System.out.println("平均薪资:"+balanceAvg1.getValue());*/



        //  指定索引信息
        GetRequest getRequest = new GetRequest(
                "bank",
                "100");
        GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
        System.out.println(getResponse);
        String index = getResponse.getIndex();
        System.out.println(index);
        String id = getResponse.getId();
        System.out.println(id);
        if (getResponse.isExists()) {
            long version = getResponse.getVersion();
            System.out.println(version);
            String sourceAsString = getResponse.getSourceAsString();
            System.out.println(sourceAsString);
            Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
            System.out.println(sourceAsMap);
            byte[] sourceAsBytes = getResponse.getSourceAsBytes();
        }
    }
}

2. 批量添加

/**
     * bulk批量添加
      */
    public static void batchAddDocuments(){
        try {
            RestHighLevelClient client = getClient();
 
            Map<String, Object> jsonMap = new HashMap<String, Object>();
            jsonMap.put("id", "01209");
            jsonMap.put("title", "紅樓夢");
            jsonMap.put("author", "曹雪芹");
            jsonMap.put("classification", "小說");
            IndexRequest request = new IndexRequest("book")
                    .id("2").source(jsonMap);
 
            jsonMap.put("id", "01210");
            jsonMap.put("title", "水滸傳");
            jsonMap.put("author", "施耐庵");
            jsonMap.put("classification", "小說");
            IndexRequest request1 = new IndexRequest("book")
                    .id("3").source(jsonMap);
 
            BulkRequest bulkRequest = new BulkRequest();
            bulkRequest.add(request);
            bulkRequest.add(request1);
 
            BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
            for (BulkItemResponse bulkItemResponse : bulkResponse) {
                DocWriteResponse itemResponse = bulkItemResponse.getResponse();
                switch (bulkItemResponse.getOpType()) {
                    case INDEX:
                        break;
                    case CREATE:
                        IndexResponse indexResponse = (IndexResponse) itemResponse;
                        System.out.println("新增文档成功!");
                        break;
                    case UPDATE:
                        UpdateResponse updateResponse = (UpdateResponse) itemResponse;
                        System.out.println("更新文档成功!");
                        break;
                    case DELETE:
                        DeleteResponse deleteResponse = (DeleteResponse) itemResponse;
                        System.out.println("删除文档成功!");
                        break;
                    default:
                }
            }
            client.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

3.根据索引id删除

/**
     * 根据索引id删除
     */
    public static void deleteDocument(){
        try {
            RestHighLevelClient client = getClient();
            DeleteRequest request = new DeleteRequest(
                    "ancientbook",
                    "2607");
            DeleteResponse deleteResponse = client.delete(
                    request, RequestOptions.DEFAULT);
            System.out.println(deleteResponse.getResult());
            client.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值