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

<properties>
    <java.version>1.8</java.version>
    <elasticsearch.version>7.12.1</elasticsearch.version>
</properties>
<dependencies>
    <!--elasticsearch依赖包-->
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>7.12.1</version>
    </dependency>
</dependencies>

 

查询的基本步骤是:

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);
    }

    
    /**
     * @description ES通用数据查询
     * @param 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);
    }

    /**
     * @description matchAll 查询所有
     */
    @Test
    void testMatchAllHotelIndex() throws IOException {
        // 1.创建Request对象
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().query(QueryBuilders.matchAllQuery());
        // 3.发起请求
        testFindHotelIndex(request);
    }
    /**
     * @description  multiMatch多字段查询
     */
    @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);
    }

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


    /**
     * @description 精确查询常见的有term查询和range查询,同样利用QueryBuilders实现
     * term 词条查询
     * range 范围查询
     */
    @Test
    void testTermHotelIndex() throws IOException {
        // 1.创建Request对象
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().query(QueryBuilders.termQuery("city","上海"));
        // 3.发起请求
        testFindHotelIndex(request);
    }

    /**
     * @description 精确查询常见的有term查询和range查询,同样利用QueryBuilders实现
     * term 词条查询
     * range 范围查询
     */
    @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);
    }

    /**
     * @description DSL查询语法-bool查询 复合查询
     */
    @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);
    }


    /**
     * @description Sort size from分页查询
     */
    @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);
    }

    /**
     * @description 高亮显示
     * term 词条查询
     * range 范围查询
     */
    @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);
    }


   /**
     * @description ES通用数据查询
     * @param 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<String, HighlightField> 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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值