【设计模式】【第六章】【查询ElasticSearch 大量数据场景】【迭代器模式】

Elasticsearch8新特性实战:用SpringBoot构建高效查询接口的5个关键步骤 本文详细介绍了使用SpringBoot集成Elasticsearch8构建高性能查询接口的五个核心步骤。内容涵盖从官方Java API Client的配置、Bool查询等复杂DSL构建、响应结果封装、索引设计与查询性能调优,到生产环境的异常处理与监控,为开发者提供了一套从开发到部署的完整实战指南。 阅读详情

创建design-demo项目

项目代码:https://gitee.com/java_wxid/java_wxid/tree/master/demo/design-demo
项目结构如下(示例):
在这里插入图片描述

创建EsController

代码如下(示例):

package com.example.designdemo.controller;

import com.example.designdemo.service.EsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EsController {
    @Autowired
    private EsService esService;

    @PostMapping("es")
    public Boolean query(@RequestParam String query, Long fetchSize) {

        return esService.query(query, fetchSize);
    }

}

创建EsService

代码如下(示例):

package com.example.designdemo.service;

/**
 * @author zhiwei Liao
 * @Description
 * @Date create in 2022/9/12 0012 21:03
 */
public interface EsService {

    Boolean query(String query, Long fetchSize);
}

创建EsServiceimpl

代码如下(示例):

package com.example.designdemo.service.impl;

import com.example.designdemo.esquery.EsQueryProcessor;
import com.example.designdemo.service.EsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.stream.Stream;

@Service
public class EsServiceimpl implements EsService {

    @Autowired
    private EsQueryProcessor esQueryProcessor;
    
    public Boolean query(String query, Long fetchSize) {
        Stream<Map<String, Object>> mapStream = esQueryProcessor
                .scrollEsStream(query, fetchSize);
        mapStream.forEach(x -> System.out.println(x));
        return true;
    }
}

创建EsQueryProcessor

代码如下(示例):

package com.example.designdemo.esquery;

import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
/**
 * @Author: zhiwei Liao
 * @Date: 2022/9/29 21:29
 * @Description:
 */
@Component
public class EsQueryProcessor {
    //1. 我们要用stream 返回 为了节省内存
    public Stream<Map<String, Object>> scrollEsStream(String query, Long fetchSize) {
        return StreamSupport.stream(Spliterators
                .spliteratorUnknownSize(new ScrollIterator(query, fetchSize), 0), false);
    }


    //2. 我们要 迭代器
    private class ScrollIterator implements Iterator<Map<String, Object>> {
        private String scrollId;
        private List<String> columns;
        Iterator<Map<String, Object>> iterator;
        RestTemplate restTemplate = new RestTemplate(); // 真是项目中使用resttemplate的时候
        //一定是进行过我们的 bean 配置注入的。这里边直接用new关键字是为了访问我们的es 接口。

        //构造函数进行第一次查询,并且初始化我们后续需要使用的 columns 和 iterator 和 scroll
        public ScrollIterator(String query, Long fetchSize) {
            EsSqlResult esSqlResult = restTemplate.postForObject("http://localhost:9200/_sql?format=json",
                    new EsSqlQuery(query, fetchSize), EsSqlResult.class);//第一次访问的结果出来了
            this.scrollId = esSqlResult.getCursor();
            this.columns = esSqlResult.getColumns()
                    .stream().map(x->x.get("name"))
                    .collect(Collectors.toList());
            this.iterator = convert(columns, esSqlResult).iterator();
        }

        // hasNext 根据 是否 scrollId 为null进行后续的 第二次,第三次,,,的访问,直到 scrollId 为null
        @Override
        public boolean hasNext() {
            return iterator.hasNext() || scrollNext();
        }
        private boolean scrollNext() {
            if(iterator == null || this.scrollId == null) {
                return false;
            }
            EsSqlResult esSqlResult = restTemplate.postForObject("http://localhost:9200/_sql?format=json",
                    new EsSqlQuery(this.scrollId), EsSqlResult.class);//第二次访问的结果出来了
            this.scrollId = esSqlResult.getCursor();
            this.iterator = convert(columns, esSqlResult).iterator();
            return iterator.hasNext();
        }

        @Override
        public Map<String, Object> next() {
            return iterator.next();
        }
    }



    //3. 返回结果传统一点 List<map>
    private List<Map<String, Object>> convert(List<String> columns, EsSqlResult esSqlResult) {
        List<Map<String, Object>> results = new ArrayList<>();
        for(List<Object> row : esSqlResult.getRows()) {
            Map<String, Object> map = new HashMap<>();
            for(int i = 0; i < columns.size(); i++) {
                map.put(columns.get(i), row.get(i));
            }
            results.add(map);
        }
        return results;
    }
}

创建EsSqlQuery

代码如下(示例):

package com.example.designdemo.esquery;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
/**
 * @Author: zhiwei Liao
 * @Date: 2022/9/29 21:29
 * @Description:
 */
@JsonIgnoreProperties
public class EsSqlQuery {
    private String query;
    private Long fetchSize;
    private String cursor;

    public EsSqlQuery(String cursor) {
        this.cursor = cursor;
    }

    public EsSqlQuery(String query, Long fetchSize) {
        this.query = query;
        this.fetchSize = fetchSize;
    }

    public String getQuery() {
        return query;
    }

    public void setQuery(String query) {
        this.query = query;
    }

    public Long getFetchSize() {
        return fetchSize;
    }

    public void setFetchSize(Long fetchSize) {
        this.fetchSize = fetchSize;
    }

    public String getCursor() {
        return cursor;
    }

    public void setCursor(String cursor) {
        this.cursor = cursor;
    }
}

创建EsSqlResult

代码如下(示例):

package com.example.designdemo.esquery;

import java.util.List;
import java.util.Map;
/**
 * @Author: zhiwei Liao
 * @Date: 2022/9/29 21:29
 * @Description:
 */
public class EsSqlResult {
    private List<Map<String, String>> columns;
    private List<List<Object>> rows;
    private String cursor;

    public List<Map<String, String>> getColumns() {
        return columns;
    }

    public void setColumns(List<Map<String, String>> columns) {
        this.columns = columns;
    }

    public List<List<Object>> getRows() {
        return rows;
    }

    public void setRows(List<List<Object>> rows) {
        this.rows = rows;
    }

    public String getCursor() {
        return cursor;
    }

    public void setCursor(String cursor) {
        this.cursor = cursor;
    }
}

Elasticsearch加速SparkSQL查询-李振炜 20161210Elastic{ON} Dev China 2016 立即下载

相关推荐

第 3 天:Actor 是什么?创建你的第一个游戏对象!

本文详细介绍 Actor 在 Unreal Engine 5 中的作用,并通过 C++ 创建你的第一个游戏对象。你将学习 Actor 的生命周期(BeginPlay、Tick)、如何添加组件(Static Mesh),并让 Actor 在游戏世界中运作。同时提供 常见问题解决方案,助你快速上手 UE5 C++ 开发!🎮 跟随本教程,构建属于你的第一个游戏对象!

m0_37643873的博客 2633

elasticsearch http接口查询

2. Request Body Search:这种方式以 JSON 格式在请求体中指定查询条件,支持 POST 和 GET 请求。此外,Elasticsearch 还支持多种查询参数,如 from 和 size 用于分页, sort 用于排序, _source 用于指定返回的字段等。1. URL Search:这种方式类似于 HTTP 的 GET 请求,将查询参数放在 URL 中。hits :查询结果集,包括文档的索引、类型、ID、相关性分数等信息。这种方式更加灵活,支持复杂的查询条件和操作。

leijmdas的专栏 692

79.ScottPlot的MVVM实现 C#例子 WPF例子

在你的 WPF 窗口的 XAML 文件中,定义一个,并将其Content属性绑定到 ViewModel 中的属性。这样可以将WpfPlot控件动态绑定到 ViewModel。

S13461120713的博客 2572

ElasticSearch全文搜索引擎之查询API篇

一、 二、 (二)、 简单搜索数据 PUT /index4/type4/1 { "name": "张三", "age": 20 } PUT /index4/type4/2 { "name": "李四", "age": 20 } PUT /index4/type4/3 { "name": "王五", "age": 20 } 最简单的搜索其实就是:GET /index4/type4/1,获取一条数据,如下图所示: 下面来看一个带简单条件的查询: GET /..

weixiaohuai的博客 2862

S32K系列之PDB框图详解及PDB触发ADC

可编程延迟模块PDB,PDB可提供从内部或外部触发或可编程间隔信号到ADC硬件触发输入的可控制延迟。 PDB可以选择提供脉冲输出,用作CMP块中的采样窗口。 S32K系列的PDB资源如下表: PDB功能框图 在下图中,以下字母表示的意义: N:PDB通道的总数 n:PDB通道号,范围从0到N-1 M:每个PDB通道的总可用预触发 m:预触发编号,范围从0到M-1 Y:脉冲输出的总数 y:脉冲数...

zz56z56的博客 1万+

【详细图解】华为认证考试报名步骤解析(手把手操作)

华为认证报考流程

yuyeconglong的博客 1万+

elasticsearch(es)高级查询api

elasticsearch高级查询api

qq_19891197的博客 2856

C-Lodop打印服务系统存在任意文件读取

C-Lodop打印服务系统存在任意文件读取

weixin_43567873的博客 2877

python操作elasticsearch

一、基本查询 from elasticsearch import Elasticsearch # 建立连接 es = Elasticsearch( hosts={'192.168.0.120', '192.168.0.153'}, # 地址 timeout=3600 # 超时时间 ) es.search(index='pv23') # index:选择数据库 此方法是默认查询,由于没有任何筛选条件,会默认显示前10条数据的所有信息 二、filter_path 添加过滤路径。通

Python热爱者的博客 2955

Python 爬虫实战:就业市场趋势数据抓取与行业洞察

在当今竞争激烈的就业市场中,了解行业趋势和就业形势对于求职者、学生以及人力资源专业人士来说至关重要。通过获取和分析就业市场数据,我们可以深入了解不同行业的招聘需求、薪资水平、技能要求等关键信息,从而为职业规划和人才发展提供有力支持。

yansideyucsdn的博客 1407

ubuntu下编译qtwebengine

ubuntu qtwebengine

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 1463

Searchkit查询构建器:从基础到高级的完整教程

Searchkit是一个强大的Elasticsearch查询构建器,专为构建现代化搜索界面而设计。这个开源工具让开发者能够轻松创建功能丰富的搜索体验,同时兼容Algolia的Instantsearch和Autocomplete组件。无论你是新手还是经验丰富的开发者,本教程都将带你全面掌握Searchkit的核心功能。 ## 🔍 什么是Searchkit查询构建器? Searchkit查询构建

gitblog_00592的博客 935

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第1套模块A:网络构建 & (五)无线网络配置+(六)出口网络配置-命令配置

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第1套模块A:网络构建 & (五)无线网络配置+(六)出口网络配置-命令配置

君逍遥o 409

ES|QL(Elasticsearch 查询语言)入门

ES|QL(Elasticsearch 查询语言)是 Elastic® 全新的创新管道查询语言,旨在通过提供强大的计算和聚合功能来加速数据分析和调查流程。轻松高效地应对识别正在发生的网络攻击或查明生产问题的复杂性。ES|QL 不仅简化了海量数据集的搜索、聚合和可视化,还为用户提供了查找(lookup)和实时处理等高级功能,所有这些都可以在 Discover 的单个屏幕上完成。你可以迭代粘贴的 ES|QL 查询,并通过单击 “Test query” 对其进行测试。这将为你提供表格中结果的预览。

Elastic 中国社区官方博客 1287

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

ElasticSearch:大数据时代的搜索利器

本文详细介绍了Elasticsearch的核心概念、安装部署、基础操作、高级查询、集群搭建及优化等内容。主要内容包括: 基础概念:解释了Elasticsearch作为分布式全文搜索引擎的特点,及其与Lucene的关系。 安装配置:提供了Windows和Linux系统下的详细安装步骤,包括Elasticsearch和Kibana的安装与配置。 基本操作:通过Postman和Kibana演示了索引、文档的CRUD操作及映射管理。 高级查询:介绍了条件查询、分页、排序、聚合等复杂查询方式。 集群管理:讲解了单机和

油墨香^-^的博客 1899

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Elasticsearch:ESQL 简介 — 一种用于灵活、迭代分析的新查询语言

长期以来,Elastic Platform 一直被视为搜索用例和机器生成数据的分析系统。分析专注于处理摄入的数据,其中重要的思想是如何在 Elasticsearch 中索引数据时优化结构数据。Kibana 公开 Elasticsearch 聚合并使用它们来创建交互式仪表板、可视化和警报。

Elastic 中国社区官方博客 3070

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【玩转ElasticSearch】横向对比ElasticSearch与Sphinx

打算写几篇ElasticSearch使用心得。第一篇,先从ElasticSearch与Sphinx的横向对比开始。横向对比是反应优点和暴露问题的好方法。我是Sphinx阵营转向ElasticSearch阵营的,两者都是成熟的开源搜索引擎,各有优劣,这篇文章也可以给纠结使用哪套方案的同学提供一些选择的依据。• 导入MySQL数据生成索引 ElasticSe...

weixin_33979203的博客 524

导入es数据_面对es搜索引擎的快速迭代,我们应该如何选择合适的版本?

作者:点火三周链接:https://blog.youkuaiyun.com/u013613428/article/details/103317806Elasticsearch不只是全文检索引擎的领头羊,现在也是各个大厂标配的大数据平台之一,被广泛用于搜索加速,用户标签、画像系统、向量搜索等领域,它不是传统的关系型数据库,但这个信息爆炸,数据堆积的时代,我们获取知识的方式已经极大的改变,搜索、提问成了获取知识的...

weixin_39906878的博客 200

Elasticsearch 5.x 性能

Elasticsearch的默认配置项是比较全面的,在不做太多配置的情况下可以使用es的全文检索,高亮显示,聚合,和数据的索引。但是在比较了解es的情况下,可以对很对配置进行优化。 一、一般建议   1、不要返回太大的结果集     Es的本质是搜索引擎,所以它的工作机制是查询文件的匹配度,而不是像数据库那些的完全匹配,若需要使用类似于此的查询方式,请使用Scroll API。   2 、

it_lihongmin的博客 4053

ElasticSearch高级篇

注:该文档是网上资源,该文档通俗易懂,我已经按照文档学习完了,后期我会加入自己的实践内容。0.学习目标 独立安装Elasticsearch 会使用Rest的API操作索引 会使用Rest的API查询数据 会使用Rest的API聚合数据 掌握Spring Data Elasticsearch使用 1.Elasticse...

XieKunBlog 1854

ElasticSearch的使用

ElasticSearch 概念:简称es,是一个开源的高扩展的分布式全文检索引擎,可以近乎实时的存储、检索数据。 ES对比Solr: Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能; Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式; Solr 官方提供的功能更多,而 Elasticsearch...

weixin_45947530的博客 256

elasticSearch搜索引擎安装使用,SprignBoot整合Spring Data Elasticsearch,百度云 Elasticsearch安装包

1.Elasticsearch介绍和安装 本文章所有安装包百度云链接: https://pan.baidu.com/s/1jRmA2n164EfLSQgPeOrJDA 提取码:6okn 1.1.简介 1.1.1.Elastic Elastic官网:https://www.elastic.co/cn/ Elastic有一条完整的产品线:Elasticsearch、Kibana、Logstash等...

偷得浮生半日闲 7495

ES(五)迭代器和for-of循环

一 Iterator(遍历器)的概念 (1)Iterator的作用有三个: 一是为各种数据结构,提供一个统一的、简单的访问接口;二是使得数据结构的成员能够按照某种次序排列三是ES6创造了一种新的遍历命令for...of循环,Iterator 接口主要供for..of 消费 (2)Iterator 的遍历过程是这样的 创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象

木馏雕金 1377

Elasticsearch6.0

Elasticsearch60 稀疏性Doc Values支持 滚动升级 序列ID 索引排序 Elasticsearch60安装 Elasticsearch6.0 2017-11-14 Elasticsearch6.0发布,改进了不少地方,个人觉得最大的改进亮点在于“稀疏性Doc Values支持”,“滚动升级”,“序列ID”,“索引排序”。特别是稀疏性Doc Values支持和序列ID,他吸引我去

不懂 3826

Elasticsearch - 自定义分析器

全文搜索引擎会用某种算法对要建索引的文档进行分析, 从文档中提取出若干Token(词元), 这些算法称为Tokenizer(分词器), 这些Token会被进一步处理, 比如转成小写等, 这些处理算法被称为Token Filter(词元处理器), 被处理后的结果被称为Term(词), 文档中包含了几个这样的Term被称为Frequency(词频)。 引擎会建立Term和原文档的Inverted In

上善若水,水善利万物而不争。 2万+

告别规则黑盒:基于JVS-Rules的风控规则治理实践——可视化决策编排+血缘追踪+版本快照

可读’——通过决策流图谱与业务语义节点,让非技术人员理解逻辑;‘可溯’——依赖规则版本快照与执行日志,实现任意交易的全链路回放;‘可担责’——基于血缘追踪与权限基线,清晰界定业务定义、技术实现、合规验证三方责任。这三者共同构成风控规则治理的三角支柱,将隐性经验转化为可版本化、可审计、可协同的组织级数字资产。

weixin_42054392的博客 447
上一篇: 【安装配置RocketMQ】
下一篇: 【你觉得这些技术值多少钱?】
Java程序员廖志伟
Java程序员廖志伟 优质创作者: Java技术领域 优质创作者: Java技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄8年 2万+粉丝 1902原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java程序员廖志伟

赏我包辣条呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值