ES(Elasticsearch)+SpringBoot实现分页查询

时间:2025-04-26 08:15:26

介绍

  ES作为一个搜索工具,寄托于Lucene之上,提供了方便的数据存储和搜索服务,一般的用它来作为网页数据索引以及存储用户画像(即用户标签)数据,可以提供复具有复杂的查询条件的服务。例如在网页索引中,通过倒排的方式索引的方式,对文档进行分词存储,可以很快的定位关键字所在的文档,从而达到毫秒级的搜索效率;而在用户画像存储中,ES既可以作为标签宽表,提供类似HIVE宽表的特性,又可以达到传统关系型数据库或者HBase的实时查询的要求,所以在一般的用户画像存储中也是不二之选。

2.引入依赖

        <dependency>
            <groupId></groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId></groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.8.0</version>
        </dependency>

3.配置客户端进行连接

package ;

import ;
import ;
import ;
import ;
import ;

@Configuration
public class RestClientConfig {


    //配置RestHighLevelClient依赖到spring容器中待用
    @Bean
    public RestHighLevelClient restHighLevelClient(){
        RestHighLevelClient client = new RestHighLevelClient(
                (
                        //绑定本机,端口,协议,如果是ES集群,就配置多个
                        new HttpHost("127.0.0.1",9200,"http")));
        return client;
    }
}

4.编写接口并实现分页查询

    @ApiOperation("ES快搜")
    @GetMapping("/wen")
    public Result<Map<String,Object>> getProblemList(@RequestParam(value = "wenti") String wenti,
                                                @RequestParam(value = "pageNo",required = false) Integer pageNo,
                                                @RequestParam(value = "pageSize") Integer pageSize) throws IOException {

        SearchRequest searchRequest = new SearchRequest("problem");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        (("wenti", wenti).analyzer("ik_max_word"));

        //过滤查询
        String[] excludes = {};
        String[] includes = {"wenti","lab","id"};
        (includes, excludes);

        (pageNo);
        (pageSize);

        (searchSourceBuilder);

        SearchResponse response = (searchRequest,);
        SearchHits hits = ();
        List<Problem> problemList=new ArrayList<>();
        Map<String,Object> data = new HashMap<>();

        for (SearchHit hit : hits) {
            (((),));
            (());
        }

        ("total",());
        ("rows",problemList);
        return (data);
    }