栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

ES RESTClient查询、排序、高亮显示 java实现

ES RESTClient查询、排序、高亮显示 java实现


    1.8
    7.12.1


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

 

查询的基本步骤是:

1. 创建 SearchRequest 对象 2. 准备 Request.source() ,也就是 DSL 。 ① QueryBuilders 来构建查询条件 ② 传入 Request.source() 的 query() 方法 3. 发送请求,得到结果 4. 解析结果(参考 JSON 结果,从外到内,逐层解析)
    @Test
    void testMatchAllHotelIndex() throws IOException {
        // 1.创建Request对象
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().query(QueryBuilders.matchAllQuery());
        // 3.发起请求
        testFindHotelIndex(request);
    }

    @Test
    void tesMatchHotelIndex() throws IOException {
        // 1.创建Request对象
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().query(QueryBuilders.matchQuery("all","如家"));
        // 3.发起请求
        testFindHotelIndex(request);
    }

    
    
    public void testFindHotelIndex(SearchRequest request) throws IOException {
        // 3.发起请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //System.out.println(response);

        //4.解析结果
        SearchHits hits = response.getHits();
        //4.1查询总条数
        long value = hits.getTotalHits().value;
        System.out.println("es搜索到:" + value + "条数据");
        //4.2查询的结果数组
        SearchHit[] hitsHits = hits.getHits();

        for (SearchHit e : hitsHits) {
            //4.3 得到source
            String json = e.getSourceAsString();
            //4.4 打印
            System.out.println("json = " + json);

            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println("hotelDoc = " + hotelDoc.toString());
        }
    }

其它查询变化不大

    private RestHighLevelClient client;

    @BeforeEach
    void setUp() {
        this.client = new RestHighLevelClient(RestClient.builder(
           HttpHost.create("http://192.168.2.199:9200")
        ));
    }

    @AfterEach
    void tearDown() throws IOException {
        this.client.close();
    }

    @Test
    void testClient() {
        System.out.println(client);
    }

    
    @Test
    void testMatchAllHotelIndex() throws IOException {
        // 1.创建Request对象
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().query(QueryBuilders.matchAllQuery());
        // 3.发起请求
        testFindHotelIndex(request);
    }
    
    @Test
    void testMultiMatchHotelIndex() throws IOException {
        // 1.创建Request对象
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().query(QueryBuilders.multiMatchQuery("如家","name","business","brand"));
        // 3.发起请求
        testFindHotelIndex(request);
    }

    
    @Test
    void tesMatchHotelIndex() throws IOException {
        // 1.创建Request对象
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().query(QueryBuilders.matchQuery("all","如家"));
        // 3.发起请求
        testFindHotelIndex(request);
    }


    
    @Test
    void testTermHotelIndex() throws IOException {
        // 1.创建Request对象
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().query(QueryBuilders.termQuery("city","上海"));
        // 3.发起请求
        testFindHotelIndex(request);
    }

    
    @Test
    void testRangeHotelIndex() throws IOException {
        // 1.创建Request对象
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().query(QueryBuilders.rangeQuery("price").gte(100).lte(500));
        // 3.发起请求
        testFindHotelIndex(request);
    }

    
    @Test
    void testBoolHotelIndex() throws IOException {
        // 1.创建Request对象
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        // 2.1创建布尔查询
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        //2.2 添加must条件 2.3添加filter条件
        boolQuery.must(QueryBuilders.termQuery("city", "上海"))
        .filter(QueryBuilders.rangeQuery("price").lte(600));
        //boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));
        request.source().query(boolQuery);
        // 3.发起请求
        testFindHotelIndex(request);
    }


    
    @Test
    void testSortHotelIndex() throws IOException {
        int page = 1,size = 5;
        // 1.创建Request对象
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().query(QueryBuilders.matchAllQuery())
        .sort("price", SortOrder.ASC).from((page-1)*size).size(size);
        // 3.发起请求
        testFindHotelIndex(request);
    }

    
    @Test
    void testHighLightHotelIndex() throws IOException {
        // 1.创建Request对象
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().query(QueryBuilders.termQuery("city","上海"));
        //2.2 高亮查询
        request.source().highlighter(new HighlightBuilder().field("name").
        requireFieldMatch(false));
        // 3.发起请求
        testFindHotelIndex(request);
    }


   
    public void testFindHotelIndex(SearchRequest request) throws IOException {
        // 3.发起请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //System.out.println(response);

        //4.解析结果
        SearchHits hits = response.getHits();
        //4.1查询总条数
        long value = hits.getTotalHits().value;
        System.out.println("es搜索到:" + value + "条数据");
        //4.2查询的结果数组
        SearchHit[] hitsHits = hits.getHits();

        for (SearchHit e : hitsHits) {
            //4.3 得到source
            String json = e.getSourceAsString();
            //4.4 打印
            //System.out.println("json = " + json);
            //反序列化
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            //获取高亮结果
            Map highlightFields = e.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.toString());
        }
    }

算法控制实现(广告排名靠前)

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

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

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

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