• elasticsearch11-实战搜索和分页


    请添加图片描述
    个人名片:

    博主酒徒ᝰ.
    个人简介沉醉在酒中,借着一股酒劲,去拼搏一个未来。
    本篇励志三人行,必有我师焉。

    请添加图片描述
    本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

    【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 点击观看

    四、黑马旅游案例

    Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,其在DB-Engines"兵器"排行榜中长期位列第一。除了搜索领域外,Elasticsearch与Kibana、Logstash组成的ELK系统还可以应用到日志采集、分析、监控等领域。Elasticsearch具有以下优势:

    • 高可用性:能够以多种搜索方式执行及合并多种类型的搜索(结构化数据、非结构化数据、地理位置、指标)。
    • 高扩展性:能够水平扩展,每秒钟可处理海量事件,同时能够自动管理索引和查询在集群中的分布方式。
    • 访问速度快:能够快速查询大数据,访问速度极快。
    • 安全性好:支持安全性和可靠性。

    注意事项:

    1. 数据集分类:基本上,可以在Elasticsearch中索引(即存储)想要的任何数据,但实际上有两类:静态数据和时间序列数据。
    2. 数据集建模方式:根据存储的数据类型,应该以不同的方式为集群建模。对于静态数据,应该选择固定数量的索引和分片。对于时间序列数据,应该选择基于时间的滚动索引。
    3. 搜索评分:对于每个搜索查询,Elasticsearch都会计算相关性分数。该分数基于tf-idf算法,该算法代表词项频率-反向文档频率。

    直接启动HotelDemoApplication,进入浏览器输入相应的ip地址和端口号(localhost:8089);
    在这里插入图片描述
    分析:
    /list地址,
    POST方式
    在这里插入图片描述
    请求参数:
    key, page, size, sortBy

    返回值:分页查询,需要返回分页结果PageResult,包含两个属性
    total: 总条数
    List : 当前页数据

    建立PageResult和RequestParams
    在这里插入图片描述
    PageResult 代码示例:

    package cn.itcast.hotel.pojo;
    
    import lombok.Data;
    
    import java.util.List;
    
    @Data
    public class PageResult {
        private Long total;
        private List<HotelDoc> hotels;
    
        public PageResult() {
        }
    
        public PageResult(Long total, List<HotelDoc> hotels) {
            this.total = total;
            this.hotels = hotels;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    RequestParams 代码示例:

    package cn.itcast.hotel.pojo;
    
    import lombok.Data;
    
    @Data
    public class RequestParams {
        private String key;
        private Integer page;
        private Integer size;
        private String sortBy;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    1. 酒店搜索和分页

    创建HotelController
    在这里插入图片描述
    代码示例:

    @RestController
    @RequestMapping("/hotel")
    public class HotelController {
        @Autowired
        private IHotelService hotelService;
    
        @PostMapping("/list")
        public PageResult search1(@RequestBody RequestParams params) {
            return hotelService.search(params);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在IHotelService中

    PageResult search(RequestParams params);
    
    • 1

    在IHotelService中

    @Service
    public class HotelService extends ServiceImpl<HotelMapper, Hotel> implements IHotelService {
    
        @Bean
        public RestHighLevelClient client() {
            return new RestHighLevelClient(RestClient.builder(
                    HttpHost.create("http://192.168.179.128:9200")
            ));
        }
    
        private PageResult handleResponse(SearchResponse response) {
            SearchHits hits = response.getHits();
            long total = hits.getTotalHits().value;
            System.out.println("数据总条数:" + total + "条");
            SearchHit[] hitsHits = hits.getHits();
            List<HotelDoc> list = new ArrayList<>();
            for (SearchHit hit : hitsHits) {
                String json = hit.getSourceAsString();
                HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
                list.add(hotelDoc);
            }
            return new PageResult(total, list);
        }
        @Override
        public PageResult search(RequestParams params) {
            try{
                SearchRequest request = new SearchRequest("hotel");
    
                buildBasicQuery(params, request);
    
                SearchResponse response = client().search(request, RequestOptions.DEFAULT);
                return handleResponse(response);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    
        private void buildBasicQuery(RequestParams params, SearchRequest request) {
            BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
    
            String key = params.getKey();
            if (key == null || "".equals(key)) {
                boolQuery.must(QueryBuilders.matchAllQuery());
            }else {
                boolQuery.must(QueryBuilders.matchQuery("all", key));
            }
            request.source().query(boolQuery);
            
             int page = params.getPage(), size = params.getSize();
    		 request.source().from((page-1)*page).size(size);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
  • 相关阅读:
    DSP篇--C6678功能调试系列之DDR3调试
    threadlocal详解
    《Python3 网络爬虫开发实战》:便于高效检索的 Elasticsearch 存储
    [重庆思庄每日技术分享]-ORA-16525 dg broker不可用
    GC垃圾回收
    什么是网络存储服务器
    Bert性能提升14.8%,MindSpore算子自动生成技术详解
    一、初识 Robot Framework
    【python】python进行debug操作
    多重视窗管理程序 screen
  • 原文地址:https://blog.csdn.net/m0_65144570/article/details/132928165