栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot 整合 Elasticsearch

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot 整合 Elasticsearch

目录

1. 引入依赖2. 添加配置文件3. 创建ES配置类4. swagger配置类5. 消息返回体6. 创建保存文档的实体7. 索引操作service8. 创建索引controller9. 测试索引操作

9.1 创建索引9.2 判断索引是否存在9.3 删除索引 10. 文档操作service11. 创建文档controller12. 测试文档操作

12.1 插入文档12.2 查询文档12.3 更新文档12.4 删除文档 13. search操作service14. search操作controller15. 测试search接口操作

15.1 _search接口基本用法15.2 基于词项的查询15.3 基于全文的查询15.4 基于全文的模糊查询15.5 组合查询 16. 聚集操作service17. 聚集查询controller18. 测试聚集查询代码下载地址

1. 引入依赖

这里使用springboot 2.5.4 版本,es使用 7.14.0 版本可以参考es 官方文档 ,在Java REST Client 下找到对应的版本

这里使用7.14.0的 Java High Level REST Client

右下角有详细的使用说明

需要同时使用elasticsearch和elasticsearch-rest-high-level-client



    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.5.4
         
    
    com.example
    demo
    0.0.1-SNAPSHOT
    demo
    Demo project for Spring Boot
    
        1.8
    
    
        
            org.springframework.boot
            spring-boot-starter-web
        

        
        
            org.elasticsearch
            elasticsearch
            7.14.0
        

        
            org.elasticsearch.client
            elasticsearch-rest-high-level-client
            7.14.0
        

        
        
            com.alibaba
            fastjson
            1.2.57
        

        
        
            io.springfox
            springfox-swagger2
            2.9.2
        
        
            io.springfox
            springfox-swagger-ui
            2.9.2
        

        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    
                        
                            org.projectlombok
                            lombok
                        
                    
                
            
        
    



2. 添加配置文件
#es
elasticsearch.host=192.168.42.111
elasticsearch.port=9200
#jackson
spring.jackson.default-property-inclusion=non_null
3. 创建ES配置类
package com.example.demo.config;

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

@Configuration
public class ESConfig {

    @Value("${elasticsearch.host}")
    private String host;

    @Value("${elasticsearch.port}")
    private int port;

    @Bean
    public RestHighLevelClient highLevelClient() {
        HttpHost httpHost = new HttpHost(host, port, "http");
        // 如果是集群模式,可以添加HttpHost数组
        RestClientBuilder restClientBuilder = RestClient.builder(httpHost);
        return new RestHighLevelClient(restClientBuilder);
    }

}

4. swagger配置类
package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.documentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket createRestApi() {
        return new Docket(documentationType.SWAGGER_2).apiInfo(apiInfo()).select()
                .apis(RequestHandlerSelectors.basePackage("com.example.demo")).build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder().version("1.0").build();
    }

}

5. 消息返回体

用来包装返回数据

package com.example.demo.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class AjaxResult {

    private Integer code;

    private String message;

    private T data;

    public static  AjaxResult ok(T data) {
        return new AjaxResult<>(0, "success", data);
    }

    public static  AjaxResult error(T data) {
        return new AjaxResult<>(1, "error", data);
    }

}

6. 创建保存文档的实体
package com.example.demo.vo;

import lombok.Data;

@Data
public class User {

    private String firstName;

    private String secondName;

    private String content;

    private Integer age;

}
7. 索引操作service

这里对索引进行创建,判断索引是否存在和删除索引

package com.example.demo.service;

import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.support.IndicesOptions;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.IOException;

@Service
public class OperateIndex {

    @Resource
    private RestHighLevelClient restHighLevelClient;

    public boolean createIndex(String indexName) {
        boolean acknowledged = false;
        try {
            
            XContentBuilder xContentBuilder = XContentFactory.jsonBuilder()
                    .startObject()
                    .field("properties").startObject()
                    .field("firstName").startObject().field("type", "keyword").endObject()
                    .field("secondName").startObject().field("type", "keyword").endObject()
                    .field("age").startObject().field("type", "integer").endObject()
                    .field("content").startObject().field("type", "text").endObject()
                    .endObject()
                    .endObject();
            CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);
            createIndexRequest.mapping(xContentBuilder);
            CreateIndexResponse createIndexResponse =
                    restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
            acknowledged = createIndexResponse.isAcknowledged();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return acknowledged;
    }

    public boolean isIndexExists(String indexName) {
        GetIndexRequest getIndexRequest = new GetIndexRequest(indexName);
        getIndexRequest.humanReadable(true);
        boolean exists = false;
        try {
            exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return exists;
    }

    public boolean deleteIndex(String indexName) {
        DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(indexName);
        // 忽略索引不存在的情况;如果不设置,索引不存在时,会报错
        deleteIndexRequest.indicesOptions(IndicesOptions.LENIENT_EXPAND_OPEN);
        boolean acknowledged = false;
        try {
            AcknowledgedResponse delete =
                    restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
            acknowledged = delete.isAcknowledged();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return acknowledged;
    }

}

8. 创建索引controller
package com.example.demo.controller;

import com.example.demo.service.OperateIndex;
import com.example.demo.vo.AjaxResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
@RequestMapping("/index")
public class IndexController {

    @Resource
    private OperateIndex operateIndex;

    
    @PostMapping("/create")
    public AjaxResult createIndex(@RequestParam String indexName) {
        return AjaxResult.ok(operateIndex.createIndex(indexName));
    }

    
    @PostMapping("/exit")
    public AjaxResult indexExit(@RequestParam String indexName) {
        return AjaxResult.ok(operateIndex.isIndexExists(indexName));
    }

    
    @PostMapping("/delete")
    public AjaxResult deleteIndex(@RequestParam String indexName) {
        return AjaxResult.ok(operateIndex.deleteIndex(indexName));
    }
}

9. 测试索引操作 9.1 创建索引

查看是否创建成功

9.2 判断索引是否存在

9.3 删除索引

再次查看索引是否存在

10. 文档操作service
package com.example.demo.service;

import com.alibaba.fastjson.JSON;
import com.example.demo.vo.AjaxResult;
import com.example.demo.vo.User;
import org.elasticsearch.action.DocWriteResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
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.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.get.GetResult;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.Objects;

@Service
public class OperateDoc {

    @Resource
    private RestHighLevelClient restHighLevelClient;

    public AjaxResult insertDoc(User user, String indexName, String docId) {
        IndexRequest indexRequest = new IndexRequest(indexName);
        //设置文档id,如果不设置id,es会自动生成全局唯一的id
        indexRequest.id(docId);
        //设置文档数据和格式
        indexRequest.source(JSON.toJSONString(user), XContentType.JSON);
        try {
            //获取返回的response
            IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
            if (Objects.nonNull(indexResponse)) {
                String id = indexResponse.getId();
                DocWriteResponse.Result result = indexResponse.getResult();
                // 如果设置的id不存在,则新增文档;如果id已存在,则覆盖文档
                if (Objects.equals(result, DocWriteResponse.Result.CREATED)) {
                    return new AjaxResult<>(0, "新增文档成功!", id);
                } else if (Objects.equals(result, DocWriteResponse.Result.UPDATED)) {
                    return new AjaxResult<>(0, "覆盖文档成功!", id);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public AjaxResult getDoc(String indexName, String docId) {
        GetRequest getRequest = new GetRequest(indexName, docId);
        try {
            GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
            if (getResponse.isExists()) {
                return AjaxResult.ok(getResponse.getSourceAsString());
            } else {
                return AjaxResult.error("文档不存在!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public AjaxResult updateDoc(String indexName, String docId, String fieldName,String fieldValue) {
        try {
            XContentBuilder xContentBuilder = XContentFactory.jsonBuilder();
            xContentBuilder.startObject();
            xContentBuilder.field(fieldName, fieldValue);
            xContentBuilder.endObject();
            UpdateRequest updateRequest = new UpdateRequest(indexName, docId);
            updateRequest.doc(xContentBuilder);
            //id不存在则添加文档
            updateRequest.docAsUpsert(true);
            //在应答里包含当前文档的内容
            updateRequest.fetchSource(true);
            UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
            GetResult getResult = updateResponse.getGetResult();
            if (getResult.isExists()) {
                return AjaxResult.ok(getResult.sourceAsString());
            } else {
                return AjaxResult.error("更新文档失败!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public AjaxResult deleteDoc(String indexName, String docId) {
        DeleteRequest deleteRequest = new DeleteRequest(indexName, docId);
        try {
            DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
            if (Objects.equals(deleteResponse.getResult(), DocWriteResponse.Result.DELETED)) {
                return AjaxResult.ok("文档删除成功!");
            } else if (Objects.equals(deleteResponse.getResult(), DocWriteResponse.Result.NOT_FOUND)) {
                return AjaxResult.error("文档不存在");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

11. 创建文档controller
package com.example.demo.controller;

import com.example.demo.service.OperateDoc;
import com.example.demo.vo.AjaxResult;
import com.example.demo.vo.User;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
@RequestMapping("/doc")
public class DocController {

    @Resource
    private OperateDoc operateDoc;

    
    @PostMapping("/insert")
    public AjaxResult insertDoc(@RequestBody User user, @RequestParam String indexName,
                                        @RequestParam String docId) {
        return operateDoc.insertDoc(user, indexName, docId);
    }

    
    @PostMapping("/query")
    public AjaxResult getDoc(@RequestParam String indexName, @RequestParam String docId) {
        return operateDoc.getDoc(indexName, docId);
    }

    
    @PostMapping("/updata")
    public AjaxResult updateDoc(@RequestParam String indexName, @RequestParam String docId,
                                        @RequestParam String fieldName, @RequestParam String fieldValue) {
        return operateDoc.updateDoc(indexName, docId, fieldName, fieldValue);
    }

    
    @PostMapping("/delete")
    public AjaxResult deleteDoc(@RequestParam String indexName, @RequestParam String docId) {
        return operateDoc.deleteDoc(indexName, docId);
    }

}

12. 测试文档操作 12.1 插入文档


12.2 查询文档

12.3 更新文档


12.4 删除文档


13. search操作service
package com.example.demo.service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.example.demo.vo.AjaxResult;
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.unit.Fuzziness;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.FuzzyQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.IOException;

@Service
public class NormalSearch {

    @Resource
    private RestHighLevelClient restHighLevelClient;

    
    public AjaxResult send(String indexName, SearchSourceBuilder searchSourceBuilder) {
        try {
            SearchRequest searchRequest = new SearchRequest();
            searchRequest.indices(indexName);
            searchRequest.source(searchSourceBuilder);
            SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
            SearchHits hits = search.getHits();
            JSonArray jsonArray = new JSONArray();
            for (SearchHit hit : hits) {
                String src = hit.getSourceAsString();
                JSonObject jsonObject = JSON.parseObject(src);
                jsonArray.add(jsonObject);
            }
            return AjaxResult.ok(jsonArray);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    
    public AjaxResult searchExample(String indexName) {
        
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.from(0);
        searchSourceBuilder.size(5);
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        String[] includeFields = new String[]{"Origin*", "*Weather"};
        searchSourceBuilder.fetchSource(includeFields, null);
        searchSourceBuilder.sort(new FieldSortBuilder("DistanceKilometers").order(SortOrder.ASC));
        searchSourceBuilder.sort(new FieldSortBuilder("FlightNum").order(SortOrder.DESC));
        return send(indexName, searchSourceBuilder);
    }

    
    public AjaxResult termsSearch(String indexName) {
        
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("dayOfWeek", 3);
        searchSourceBuilder.query(termQueryBuilder);
        return send(indexName, searchSourceBuilder);
    }

    
    public AjaxResult matchSearch(String indexName) {
        
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.multiMatchQuery("AT", "DestCountry", "OriginCountry"));
        return send(indexName, searchSourceBuilder);
    }

    
    public AjaxResult fuzzySearch(String indexName) {
        
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("message", "firefix");
        fuzzyQueryBuilder.fuzziness(Fuzziness.ONE);
        searchSourceBuilder.query(fuzzyQueryBuilder);
        return send(indexName, searchSourceBuilder);
    }

    
    public AjaxResult boolSearch(String indexName) {
        
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(QueryBuilders.matchQuery("message", "firefox"))
                .should(QueryBuilders.termQuery("geo.src", "CN"))
                .should(QueryBuilders.termQuery("geo.dest", "CN"));
        searchSourceBuilder.query(boolQueryBuilder);
        return send(indexName, searchSourceBuilder);
    }

}

14. search操作controller
package com.example.demo.controller;

import com.alibaba.fastjson.JSONArray;
import com.example.demo.service.NormalSearch;
import com.example.demo.vo.AjaxResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
@RequestMapping("/search")
public class SearchController {

    private final static String KIBANA_SAMPLE_DATA_FLIGHTS = "kibana_sample_data_flights";

    private final static String KIBANA_SAMPLE_DATA_LOGS = "kibana_sample_data_logs";
    
    @Resource
    private NormalSearch normalSearch;

    
    @PostMapping("/example")
    public AjaxResult searchExample() {
        return normalSearch.searchExample(KIBANA_SAMPLE_DATA_FLIGHTS);
    }

    
    @PostMapping("/term")
    public AjaxResult termsSearch() {
        return normalSearch.termsSearch(KIBANA_SAMPLE_DATA_FLIGHTS);
    }

    
    @PostMapping("/match")
    public AjaxResult matchSearch() {
        return normalSearch.matchSearch(KIBANA_SAMPLE_DATA_FLIGHTS);
    }

    
    @PostMapping("/fuzzy")
    public AjaxResult fuzzySearch() {
        return normalSearch.fuzzySearch(KIBANA_SAMPLE_DATA_LOGS);
    }

    
    @PostMapping("/combination")
    public AjaxResult combinationSearch() {
        return normalSearch.boolSearch(KIBANA_SAMPLE_DATA_LOGS);
    }

}

15. 测试search接口操作

测试之前需要提前导入es提供的样例数据kibana_sample_data_flights和kibana_sample_data_logs,参考数据检索和分析 15.1 _search接口基本用法

15.2 基于词项的查询

15.3 基于全文的查询

15.4 基于全文的模糊查询

15.5 组合查询

16. 聚集操作service
package com.example.demo.service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.example.demo.vo.AjaxResult;
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.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramAggregationBuilder;
import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval;
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
import org.elasticsearch.search.aggregations.metrics.ParsedAvg;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.List;

@Service
public class AggsSearch {

    @Resource
    private RestHighLevelClient restHighLevelClient;

    
    public AjaxResult send(String indexName, SearchSourceBuilder searchSourceBuilder) {
        try {
            SearchRequest searchRequest = new SearchRequest();
            searchRequest.indices(indexName);
            searchRequest.source(searchSourceBuilder);
            SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
            SearchHits hits = search.getHits();
            JSonArray jsonArray = new JSONArray();
            //hits部分
            for (SearchHit hit : hits) {
                String src = hit.getSourceAsString();
                JSonObject jsonObject = JSON.parseObject(src);
                jsonArray.add(jsonObject);
            }
            //聚集部分
            Aggregations aggregations = search.getAggregations();
            for (Aggregation aggregation : aggregations) {
                String jsonString = JSON.toJSONString(aggregation);
                jsonArray.add(JSON.parseObject(jsonString));
                //这里可以拿到具体的桶聚集,做特殊处理
                List buckets = ((Histogram) aggregation).getBuckets();
                for (Histogram.Bucket bucket : buckets) {
                    System.out.println("--------------------------------------");
                    System.out.println(bucket.getKeyAsString());
                    System.out.println(bucket.getDocCount());
                    ParsedAvg parsedAvg = (ParsedAvg) bucket.getAggregations().getAsMap().get("avg_price");
                    System.out.println(parsedAvg.getValueAsString());
                }
            }
            return AjaxResult.ok(jsonArray);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return AjaxResult.error(null);
    }

    
    public AjaxResult aggsExampleSearch(String indexName) {
        
        // 拼接query部分
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.termQuery("OriginCountry", "CN"));

        //拼接聚集部分
        DateHistogramAggregationBuilder date_price_histogram
                = AggregationBuilders.dateHistogram("date_price_histogram");
        date_price_histogram.field("timestamp").fixedInterval(DateHistogramInterval.days(30));
        //嵌套聚集部分
        date_price_histogram.subAggregation(AggregationBuilders.avg("avg_price").field("FlightDelayMin"));
        searchSourceBuilder.aggregation(date_price_histogram);

        return send(indexName, searchSourceBuilder);
    }

}

17. 聚集查询controller
package com.example.demo.controller;

import com.alibaba.fastjson.JSONArray;
import com.example.demo.service.AggsSearch;
import com.example.demo.vo.AjaxResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
@RequestMapping("/aggs")
public class AggsController {

    private final static String KIBANA_SAMPLE_DATA_FLIGHTS = "kibana_sample_data_flights";

    @Resource
    private AggsSearch aggsSearch;

    
    @PostMapping("/query")
    public AjaxResult aggsQuery() {
        return aggsSearch.aggsExampleSearch(KIBANA_SAMPLE_DATA_FLIGHTS);
    }

}

18. 测试聚集查询

直接使用kibana查询的结果

接口调用结果

控制台打印

代码下载地址

https://gitee.com/fisher3652/es_demo

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/755428.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号