elasticsearch 7.9.3知识归纳整理(四)之 java实现深分页scroll

这篇具有很好参考价值的文章主要介绍了elasticsearch 7.9.3知识归纳整理(四)之 java实现深分页scroll。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

java实现深分页scroll

ES对from+size是有限制的,from和size的和不能超过1w。超过后效率十分低下。 ES查询过程:
①将用户的指定的关键字进行分词
②将词汇去分词库中进行检索,得到多个文档的id
③去各个分片中拉去数据指定的数据(耗时长)
④将数据根据score进行排序(耗时长)
⑤根据from的值将查询到的数据舍弃一部分
⑥返回结果
scroll在ES的数据查询方式:
①将用户的指定的关键字进行分词
②将词汇去分词库中进行检索,得到多个文档的id
③将文档的id存放在es的上下文
④根据指定的size去ES中检索指定的数据。拿完数据的文档id,会从上下文移除
⑤如果需要下一页数据,直接去ES的上下文中找后续数据
⑥循环第4、5步 scroll方式,不适合做适时查询:文章来源地址https://www.toymoban.com/news/detail-449637.html

1.导包

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.4.2</version>
</dependency>

2.配置

@Configuration
public class MyEsSearchConfig {
	/**
	* es在yml中的配置(这里只有ip没有端口)
	*es:
  	*	host1: es-node1
  	*	host2: es-node2
  	*	host3: es-node3
	**/
    @Value("${es.host1}")
    private String host1;
    @Value("${es.host2}")
    private String host2;
    @Value("${es.host3}")
    private String host3;

    public static final RequestOptions COMMON_OPTIONS;
    static {
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
        COMMON_OPTIONS = builder.build();
    }
    /**
     *方式二 使用账号密码连接
     **/
    @Bean
    public RestHighLevelClient esRestClient(){
        RestClientBuilder builder = RestClient.builder(
                new HttpHost(host1,9200,"http"),
                new HttpHost(host2,9200,"http"),
                new HttpHost(host3,9200,"http"));
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider .setCredentials(AuthScope.ANY,new UsernamePasswordCredentials("elastic","123456"));
        builder.setHttpClientConfigCallback(f->f.setDefaultCredentialsProvider(credentialsProvider ));
        RestHighLevelClient client = new RestHighLevelClient (builder);
        return client;
    }
}

3.实现深分页

@RestController
@RequestMapping("/esScroll")
public class EsScrollController {
    /**
     * es对from + size 是有限制的 from+size二者之和超过1w会报错
     */
    @Autowired
    private RestHighLevelClient client;

    @PostMapping("/getEsScroll")
    public R getEsScroll(){
        List<Map<String,Object>> list = new ArrayList<>();
        list.clear();
        String indexName = "esIndexAccessControl";
        //1、创建SearchRequest
        SearchRequest request = new SearchRequest(indexName);
        //2、指定scroll的生存时间
        request.scroll(TimeValue.timeValueMinutes(2L));

        SearchSourceBuilder builder = new SearchSourceBuilder();
        ///3、指定每页查询条数
        builder.size(20);
        //3.1、排序
        builder.sort("createTimeMilliss", SortOrder.DESC);
        //3.2、查询全部
        builder.query(QueryBuilders.matchAllQuery());
        request.source(builder);

        try {
            //4、获取返回结果 scrollId,source
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            String scrollId = response.getScrollId();
            for(SearchHit hit:response.getHits().getHits()){
                //4.1、首页数据
                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
                list.add(sourceAsMap);
            }
            while(true){
                // 5、循环创建SearchScrollRequest
                SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
                //6、再指定scroll的生存时间,若不指定它会归零
                scrollRequest.scroll(TimeValue.timeValueMinutes(2L));
                //7、执行查询获取结果
                SearchResponse scrollResp = client.scroll(scrollRequest, RequestOptions.DEFAULT);
                //8、判断是否查询到了数据输出
                SearchHit[] hits = scrollResp.getHits().getHits();
                if(hits != null && hits.length>0){
                    for(SearchHit hit : hits){
                        //循环输出
                        Map<String, Object> sourceAsMap = hit.getSourceAsMap();
                        list.add(sourceAsMap);
                    }
                }else {
                    //9、若无数据则退出
                    break;
                }
            }
            //10、创建ClearScrollRequest
            ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
            //11、指定scrollId
            clearScrollRequest.addScrollId(scrollId);
            //12、删除scrollId
            ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
           //13、根据它返回判断删除成功没
            boolean succeeded = clearScrollResponse.isSucceeded();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return R.ok("查询成功",list);
    }

到了这里,关于elasticsearch 7.9.3知识归纳整理(四)之 java实现深分页scroll的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ES多种分页方案以及深分页处理

    ElasticSearch 是一个实时的分布式搜索与分析引擎,常用于大量非结构化数据的存储和快速检索场景,具有很强的扩展性。纵使其有诸多优点,在搜索领域远超关系型数据库,但依然存在与关系型数据库同样的深度分页问题,本文将介绍ES的多种分页方式以及深分页的处理。 f

    2024年04月17日
    浏览(28)
  • 什么是limit 深分页问题?怎么解决?

    什么是limit 深分页问题?怎么解决? select * from table order by key limit 10; select * from table order by key limit 9999, 10; 我们想到给这个要排序的字段加上索引,但是加上索引之后,查询的速度依旧很慢。 当深分页的时候,优化器都不会选择走key这个辅助索引了,而是选择type = All,全表

    2024年02月06日
    浏览(31)
  • 千万级数据深分页查询SQL性能优化实践

    如何在Mysql中实现上亿数据的遍历查询?先来介绍一下系统主角:关注系统,主要是维护京东用户和业务对象之前的关注关系;并对外提供各种关系查询,比如查询用户的关注商品或店铺列表,查询用户是否关注了某个商品或店铺等。但是最近接到了一个新需求,要求提供查

    2024年02月11日
    浏览(46)
  • 《Java SE》网络编程基础知识归纳。

    目录 一、网络基本介绍 1、什么是网络通信? 2、网络 3、IP地址 4、域名 5、网络通信协议 6、Socket 二、TCP网络通信编程  1、应用实例1(字节流) 2、应用实例2(字节流) 3、应用实例3(字符流) 4、netstat 指令 三、UDP网络通信编程  1、基本介绍 2、基本流程 3、应用实例  

    2024年01月20日
    浏览(39)
  • ES es Elasticsearch 十三 Java api 实现搜索 分页查询 复杂查询 过滤查询 ids查询 等

    目录 Java api 实现搜索 Pom.xml 建立链接 搜索全部记录 增加规则值查某些字段 搜索分页 全代码 Ids 搜索 搜索Match搜索 multi_match 搜索 多字段搜索 复杂查询 bool查询 filter  bool 复杂查询增加过滤器查询 复杂擦好像加排序 日志 思路 参考 api 写法 写Java代码 请求条件构建层次

    2024年02月04日
    浏览(42)
  • 【ElasticSearch】使用 Java 客户端 RestClient 实现对文档的查询操作,以及对搜索结果的排序、分页、高亮处理

    在 Elasticsearch 中,通过 RestAPI 进行 DSL 查询语句的构建通常是通过 HighLevelRestClient 中的 resource() 方法来实现的。该方法包含了查询、排序、分页、高亮等所有功能,为构建复杂的查询提供了便捷的接口。 RestAPI 中构建查询条件的核心部分是由一个名为 QueryBuilders 的工具类提供

    2024年01月16日
    浏览(50)
  • 各类通信协议归纳整理(偏硬件)

    本文主要用于学习,资料及图片多来源于网络,若存在侵权请联系作者删除,若存在错误,请批评指正。 通信一般有三个步骤:编码、传输和解码。 可分为同步通信和异步通信: 同步 :需要时钟信号 异步 :一般有起始和终止信号。 可分为电平信号和差分信号: 电平 :信

    2024年01月18日
    浏览(22)
  • Elasticsearch集群搭建与相关知识点整理

    前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章参考网上的课程,介绍Elasticsearch集群的搭建,以及Elasticsearch集群相关知识点整理。 如果文章有什么需要改进的地方还请大佬不吝赐教 👏👏。 小威在此先感谢各位大佬啦~~🤞🤞 🏠个人主页:小威要

    2023年04月22日
    浏览(25)
  • Java Elasticsearch分页查询

    核心代码 分页查询示例

    2024年02月13日
    浏览(26)
  • 30个ElasticSearch 调优知识点,都给你整理好了

    ES官方调优指南 第一部分:调优索引速度 第二部分:调优搜索速度 第三部分:通用的一些建议 ES发布时带有的默认值,可为es的开箱即用带来很好的体验。全文搜索、高亮、聚合、索引文档 等功能无需用户修改即可使用,当你更清楚的知道你想如何使用es后,你可以作很多的

    2023年04月08日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包