分布式搜索引擎ElasticSearch——搜索功能
作者:mmseoamin日期:2024-01-19

分布式搜索引擎ElasticSearch——搜索功能

文章目录

  • 分布式搜索引擎ElasticSearch——搜索功能
    • DSL查询文档
      • DSL查询分类
      • 全文检索查询
      • 精确查询
      • 地理查询
      • 复合查询
        • Function Score Query
        • Boolean Query
        • 搜索结果处理
          • 排序![在这里插入图片描述](upload/website_attach/202401/1_QE3ANSEFKBC4RCX6.jpeg)
          • 分页
          • 高亮
          • RestClient查询文档
            • 快速入门
            • match,term,range,bool查询
            • 排序和分页
            • 高亮显示
            • 黑马旅游案例
              • 基本的搜索和分页
              • 条件过滤
              • 找周边的酒店
              • 广告置顶

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第1张

                DSL查询文档

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第2张

                DSL查询分类

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第3张

                DSL官方文档

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第4张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第5张

                全文检索查询

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第6张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第7张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第8张

                精确查询

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第9张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第10张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第11张

                地理查询

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第12张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第13张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第14张

                复合查询

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第15张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第16张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第17张

                Function Score Query

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第18张

                function score query

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第19张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第20张

                Boolean Query

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第21张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第22张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第23张

                搜索结果处理

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第24张

                排序分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第25张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第26张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第27张

                分页

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第28张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第29张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第30张

                官方文档

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第31张

                高亮

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第32张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第33张

                RestClient查询文档

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第34张

                快速入门

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第35张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第36张

                public class HotelSearchTest {
                    private RestHighLevelClient client;
                    @Test
                    void testMatchAll() throws IOException {
                        // 1. 准备Request
                        SearchRequest request = new SearchRequest("hotel");
                        // 2. 准备DSL
                        request.source().query(QueryBuilders.matchAllQuery());
                        // 3. 发送请求
                        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
                        // 4. 解析响应
                        SearchHits searchHits = response.getHits();
                        // 4.1 获取总条数
                        long total = searchHits.getTotalHits().value;
                        System.out.println("共搜索到" + total + "条数据");
                        // 4.2 文档数组
                        SearchHit[] hits = searchHits.getHits();
                        // 4.3 遍历
                        for (SearchHit hit : hits) {
                            // 获取文档source
                            String json = hit.getSourceAsString();
                            // 反序列化
                            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
                            System.out.println("hotelDoc = " + hotelDoc);
                        }
                        System.out.println(response);
                    }
                    @BeforeEach
                    void setUp(){
                        this.client = new RestHighLevelClient(RestClient.builder(
                                HttpHost.create("http://192.168.10.88:9200")
                        ));
                    }
                    @AfterEach
                    void tearDown() throws IOException {
                        this.client.close();
                    }
                }
                

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第37张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第38张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第39张

                match,term,range,bool查询

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第40张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第41张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第42张

                  // 全文检索查询
                    @Test
                    void testMatch() throws IOException {
                        // 1. 准备Request
                        SearchRequest request = new SearchRequest("hotel");
                        // 2. 准备DSL
                        request.source().query(QueryBuilders.matchQuery("all","皇冠"));
                        // 3. 发送请求
                        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
                        handleResponse(response);
                        System.out.println(response);
                    }
                    // bool查询
                    @Test
                    void testBool() throws IOException {
                        // 1. 准备Request
                        SearchRequest request = new SearchRequest("hotel");
                        // 2. 准备DSL
                        // 2.1 准备BooleanQuery
                        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
                        // 2.2 添加term
                        boolQuery.must(QueryBuilders.termQuery("city","杭州"));
                        // 2.3 添加range
                        boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));
                        request.source().query(boolQuery);
                        // 3. 发送请求
                        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
                        handleResponse(response);
                        System.out.println(response);
                    }
                    // 抽取解析的代码
                    private static void handleResponse(SearchResponse response) {
                        // 4. 解析响应
                        SearchHits searchHits = response.getHits();
                        // 4.1 获取总条数
                        long total = searchHits.getTotalHits().value;
                        System.out.println("共搜索到" + total + "条数据");
                        // 4.2 文档数组
                        SearchHit[] hits = searchHits.getHits();
                        // 4.3 遍历
                        for (SearchHit hit : hits) {
                            // 获取文档source
                            String json = hit.getSourceAsString();
                            // 反序列化
                            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
                            System.out.println("hotelDoc = " + hotelDoc);
                        }
                    }
                

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第43张

                排序和分页

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第44张

                // 排序和分页
                    @Test
                    void testPageAndSort() throws IOException {
                        // 页码。每页大小
                        int page  = 2, size  = 5;
                        // 1. 准备Request
                        SearchRequest request = new SearchRequest("hotel");
                        // 2. 准备DSL
                        // 2.1 query
                        request.source().query(QueryBuilders.matchAllQuery());
                        // 2.2 配许sort
                        request.source().sort("price", SortOrder.ASC);
                        // 2.3 分页from, size
                        request.source().from((page-1)*size).size(5);
                        // 3. 发送请求
                        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
                        // 4. 解析响应
                        handleResponse(response);
                    }
                

                高亮显示

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第45张

                 // 高亮
                    @Test
                    void testHighlight() throws IOException {
                        // 1. 准备Request
                        SearchRequest request = new SearchRequest("hotel");
                        // 2. 准备DSL
                        // 2.1 query
                        request.source().query(QueryBuilders.matchQuery("all","如家"));
                        // 2.2 高亮
                        request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
                        // 3. 发送请求
                        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
                        // 4. 解析响应
                        handleResponse(response);
                    }
                

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第46张

                就是在前面抽取的解析代码中进一步添加关于高亮的解析部分,因为highlight和source是同级目录的,所以采用的方法类似。

                  // 抽取解析的代码
                    private static void handleResponse(SearchResponse response) {
                        // 4. 解析响应
                        SearchHits searchHits = response.getHits();
                        // 4.1 获取总条数
                        long total = searchHits.getTotalHits().value;
                        System.out.println("共搜索到" + total + "条数据");
                        // 4.2 文档数组
                        SearchHit[] hits = searchHits.getHits();
                        // 4.3 遍历
                        for (SearchHit hit : hits) {
                            // 获取文档source
                            String json = hit.getSourceAsString();
                            // 反序列化
                            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
                            // 获取高亮结果
                            Map highlightFields = hit.getHighlightFields();
                            if(!CollectionUtils.isEmpty(highlightFields)){
                                // 根据字段名获取高亮结果
                                HighlightField highlightField = highlightFields.get("name");
                                if(highlightField != null){
                                    //  获取高亮值
                                    String name = highlightField.getFragments()[0].string();
                                    // 覆盖非高亮结果
                                    hotelDoc.setName(name);
                                }
                            }
                            System.out.println("hotelDoc = " + hotelDoc);
                        }
                    }
                

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第47张

                黑马旅游案例

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第48张

                基本的搜索和分页

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第49张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第50张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第51张

                @RestController
                @RequestMapping("/hotel")
                public class HotelController {
                    @Autowired
                    private IHotelService hotelService;
                    @PostMapping("/list")
                    public PageResult search(@RequestBody RequestParams params){
                        return hotelService.search(params);
                    }
                }
                

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第52张

                @Service
                public class HotelService extends ServiceImpl implements IHotelService {
                    @Autowired
                    private RestHighLevelClient client;
                    @Override
                    public PageResult search(RequestParams params) {
                        try {// 1. 准备Request
                            SearchRequest request = new SearchRequest("hotel");
                            // 2. 准备DSL
                            // 2.1 query
                            String key = params.getKey();
                            if (key == null || "".equals(key)) {
                                request.source().query(QueryBuilders.matchAllQuery());
                            } else {
                                request.source().query(QueryBuilders.matchQuery("all", key));
                            }
                            // 2.2 分页
                            int page = params.getPage();
                            int size = params.getSize();
                            request.source().from((page - 1) * size).size(size);
                            // 3. 发送请求
                            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
                            // 4. 解析响应
                            return handleResponse(response);
                        }catch (IOException e){
                            throw new RuntimeException(e);
                        }
                    }
                    // 抽取解析的代码
                    private PageResult handleResponse(SearchResponse response) {
                        // 4. 解析响应
                        SearchHits searchHits = response.getHits();
                        // 4.1 获取总条数
                        long total = searchHits.getTotalHits().value;
                        // 4.2 文档数组
                        SearchHit[] hits = searchHits.getHits();
                        // 4.3 遍历
                        List hotels = new ArrayList<>();
                        for (SearchHit hit : hits) {
                            // 获取文档source
                            String json = hit.getSourceAsString();
                            // 反序列化
                            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
                            hotels.add(hotelDoc);
                        }
                        // 4.4 封装返回
                        return new PageResult(total,hotels);
                    }
                }
                

                条件过滤

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第53张分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第54张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第55张

                @Override
                    public PageResult search(RequestParams params) {
                        try {// 1. 准备Request
                            SearchRequest request = new SearchRequest("hotel");
                            // 2. 准备DSL
                            // 2.1 query
                            // 构建BooleanQuery
                            buildBasicQuery(params, request);
                            // 2.2 分页
                            int page = params.getPage();
                            int size = params.getSize();
                            request.source().from((page - 1) * size).size(size);
                            // 3. 发送请求
                            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
                            // 4. 解析响应
                            return handleResponse(response);
                        }catch (IOException e){
                            throw new RuntimeException(e);
                        }
                    }
                    private static 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));
                        }
                        // 条件过滤
                        // 城市
                        if(params.getCity() !=  null && !"".equals(params.getCity())){
                            boolQuery.filter(QueryBuilders.termQuery("city", params.getCity()));
                        }
                        // 品牌
                        if(params.getBrand() !=  null && !"".equals(params.getBrand())){
                            boolQuery.filter(QueryBuilders.termQuery("brand", params.getBrand()));
                        }
                        // 星级
                        if(params.getStarName() !=  null && !"".equals(params.getStarName())){
                            boolQuery.filter(QueryBuilders.termQuery("starName", params.getStarName()));
                        }
                        // 价格——范围过滤
                        if(params.getMinPrice() != null && params.getMaxPrice() != null){
                            boolQuery.filter(QueryBuilders.rangeQuery("price").gte(params.getMinPrice()).lte(params.getMaxPrice()));
                        }
                        request.source().query(boolQuery);
                    }
                

                找周边的酒店

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第56张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第57张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第58张

                广告置顶

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第59张

                分布式搜索引擎ElasticSearch——搜索功能,在这里插入图片描述,第60张

                        // 2.  算分控制
                        FunctionScoreQueryBuilder functionScoreQuery =
                                QueryBuilders.functionScoreQuery(
                                        // 原始查询,相关性算分的查询
                                        boolQuery,
                                        // function score的数组
                                        new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
                                                //  其中的一个function score元素
                                                new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                                                        // 过滤条件
                                                        QueryBuilders.termQuery("isAD",true),
                                                        // 算分函数
                                                        ScoreFunctionBuilders.weightFactorFunction(10)
                                                )
                                        });