Elasticsearch检索方案之一:使用from+size实现分页
前面两篇文章介绍了elasticsearch以及Kibana的安装,检索引擎以及可视化工具都已经安装完成,接下来介绍下如何使用golang的sdk实现简单的分页查询。
1、下载Elastic官方golang sdk
在讲解elasticsearch检索之前,需要先把golang的环境安装好,go的安装可以参考官方文档,mac、linux下的安装都非常简单,参考以下文档:
go下载地址:https://go.dev/dl/
安装说明:https://go.dev/doc/install
安装完成后,把goproxy改成国内代理,执行以下命令:
go env -w GOPROXY=https://goproxy.cn,direct
下载elasticsearch官方golang包:
go get github.com/elastic/go-elasticsearch/v8
或者直接在代码里引入该包,之后通过命令:
go mod tidy
来下载各种依赖包。
2、测试数据说明

es中一共写入了11000条数据,doc_id字段标识了数据的索引,有助于说明本文分享的使用from+size参数的检索。
3、使用from+size实现分页检索
首先定义检索结果的基础数据结构:
// 最外层数据结构
type Documents struct {Shards Shards `json:"_shards"`Hits HitOutLayer `json:"hits"`TimedOut bool `json:"timed_out"`Took int `json:"took"`
}
type Shards struct {Failed int `json:"failed"`Skipped int `json:"skipped"`Successful int `json:"successful"`Total int `json:"total"`
}
type HitOutLayer struct {Hits []Hits `json:"hits"`MaxScore float64 `json:"max_score"`Total Total `json:"total"`
}
type Hits struct {ID string `json:"_id"`Index string `json:"_index"`Score float64 `json:"_score"`Source map[string]any `json:"_source"`Type string `json:"_type"`
}
type Total struct {Relation string `json:"relation"`Value int `json:"value"`
}
连接es,es8默认是通过https进行连接,因此在连接时需要设置证书,证书的位置在es路径下的config文件夹中:
连接es的代码如下:
cert, _ := os.ReadFile("/Users/liupeng/Documents/study/elasticsearch-8.17.0/config/certs/http_ca.crt")
client, err := elasticsearch.NewClient(elasticsearch.Config{Username: "elastic",Password: "XBS=adqa799j_Aoz=A+h",Addresses: []string{"https://127.0.0.1:9200"},CACert: cert,
})
构建检索dsl,跳过前面1000个文档,检索10条文档:
dslQuery := esbuilder.NewDsl()
boolQuery := esbuilder.NewBoolQuery()
boolQuery.Filter(esbuilder.NewRangeQuery("doc_id").Gte(1))
dslQuery.SetQuery(boolQuery)
dslQuery.SetFrom(1000)
dslQuery.SetSize(3)
dslQuery.SetOrder(esbuilder.NewSortQuery("doc_id", "asc"))
dsl := dslQuery.BuildJson()
构建dsl我使用了自研的构建dsl的库:
github.com/liupengh3c/esbuilder
主打一个方便,就不用开发者自行去拼凑dsl了,开发成本降低了许多。
执行检索过程,并把检索到的内容进行打印:
search := esapi.SearchRequest{Index: []string{"new_tag_202411"},Body: strings.NewReader(dsl),
}
resp, err := search.Do(context.Background(), client)
if err != nil {fmt.Println("search err:", err.Error())return
}
json.NewDecoder(resp.Body).Decode(&docs)
strDoc, _ := json.MarshalToString(docs)
fmt.Println(strDoc)
理论上,应该打印doc_id从1001开始到1003的3条数据,打印出来的数据如下:
{"_shards": {"failed": 0,"skipped": 0,"successful": 1,"total": 1},"hits": {"hits": [{"_id": "JME17xx_adc_behavior_NOJUNCTION_STRAIGHT_1_1732982184160_1732982184860_1733030180041","_index": "new_tag_202411","_score": 0,"_source": {"adc_behavior": "NOJUNCTION_STRAIGHT","car_id": "JME17xx","create_time": "2024-12-23 21:34:51","doc_id": 1001,"end_time": 1732982184860,"rule_id": 1,"rule_priority": 1,"rule_version": "2.1.0.0","start_time": 1732982184160,"tag_additional_info": {"adc_driving_mode": "COMPLETE_MANUAL","average_speed": 0.003893,"driving_mode": 0,"end_point": {"x": 222294.311402,"y": 3373118.699096,"z": 14.721843},"start_point": {"x": 222294.312234,"y": 3373118.698359,"z": 14.721373}},"tag_name": "adc_behavior","user": "liupeng"},"_type": ""},{"_id": "JME18xx_adc_behavior_NOJUNCTION_STRAIGHT_1_1732982184140_1732982218540_1733030184257","_index": "new_tag_202411","_score": 0,"_source": {"adc_behavior": "NOJUNCTION_STRAIGHT","car_id": "JME18xx","create_time": "2024-12-23 21:34:51","doc_id": 1002,"end_time": 1732982218540,"rule_id": 1,"rule_priority": 1,"rule_version": "2.1.0.0","start_time": 1732982184140,"tag_additional_info": {"adc_driving_mode": "COMPLETE_AUTO_DRIVE","average_speed": 3.86589,"driving_mode": 1,"end_point": {"x": 219886.247841,"y": 3374513.249021,"z": 8.882025},"start_point": {"x": 219576.290596,"y": 3374298.199175,"z": 9.130117}},"tag_name": "adc_behavior","user": "liupeng"},"_type": ""},{"_id": "ARCFxx_adc_behavior_U_TURN_1_1732982184047_1732982227367_1733030187627","_index": "new_tag_202411","_score": 0,"_source": {"adc_behavior": "U_TURN","car_id": "ARCFxx","create_time": "2024-12-23 21:34:52","doc_id": 1003,"end_time": 1732982227367,"rule_id": 1,"rule_priority": 1,"rule_version": "2.1.0.0","start_time": 1732982184047,"tag_additional_info": {"adc_driving_mode": "COMPLETE_AUTO_DRIVE","average_speed": 10.146669,"driving_mode": 1,"end_point": {"x": 228474.086367,"y": 3392800.40123,"z": 8.736978},"start_point": {"x": 228502.4916,"y": 3392823.01595,"z": 8.714573}},"tag_name": "adc_behavior","user": "liupeng"},"_type": ""}],"max_score": 0,"total": {"relation": "gte","value": 10000}},"timed_out": false,"took": 2
}
结果的返回是符合预期的,perfect。
4、一个很重要的知识点
form+size的这种分页方式,是有前提的,就是只能检索10000条以内的数据,如果超过10000,那就不灵了,超过10000后,一条数据都不会返回,比如我们将设置from、size的代码改成如下:
dslQuery := esbuilder.NewDsl()
boolQuery := esbuilder.NewBoolQuery()
boolQuery.Filter(esbuilder.NewRangeQuery("doc_id").Gte(1))
dslQuery.SetQuery(boolQuery)
dslQuery.SetFrom(9998)
dslQuery.SetSize(3)
dslQuery.SetOrder(esbuilder.NewSortQuery("doc_id", "asc"))
dsl := dslQuery.BuildJson()
跳过前面9998条,检索3条数据出来,很明显,这样的检索条件是超过了10000条的,执行代码后,检索没有结果:

所以这种检索分页方式存在局限性,在10000条数据之内可以这么使用,但是一旦超过10000就会有问题,当然,我们也不用担心,elastic是有解决方案的,我会再单独写文章来介绍。
5、one more thing
我在自己的macbook上【在家里】安装了es,注意关键信息,是【在家里】安装的,上班的时候把自己电脑带到了公司,上班摸鱼的时候我打开了自己电脑,连接wifi,启动es、kibana,准备把公司mac上es的数据copy到自己mac上,问题来了,自己mac上kibnan启动不了了,启动不了了......,我很纳闷,啥情况?为啥启动不了了?难道是我替换了es文件夹下data的缘故吗?重新恢复为自己的data,问题依旧。
下班心想,还得把公司电脑上es的数据拷贝一份到自己mac上,以用来测试,就把公司mac带回家,连接家里的wifi,我满怀期待的打开电脑准备倒数据,结果公司电脑的kibana也启动不了,启动不了了,我的天哪,这是见鬼了吗,啥情况呢?自己电脑上的kibana能启动了,这是在外面认生吗,得回到自己家才能启动,这是问题1,这个时候我心想,公司电脑上kibana启动不了就算了,我直接用自己mac跑代码读取公司mac上es的数据,然后写入到本地的es上,问题又来了,竟然连接不上,提示证书授权的ip没有当前ip,这完蛋了,这是问题2。
于是我就停下来,大概想了一下问题的始末,大概明白了,es8的安全证书对网络加了校验,既然我通过自己mac连接不上公司mac,现在所处的网络是家里,那就说明自己mac的证书是有效的,于是就调换一下,从公司mac上跑代码,读取本机,写入到自己mac上,结果还真成了。
但是kibana更换网络无法启动的问题还未解决,这个问题不解决,也就是说只要不是在家里,kibana就打不开,es不能做的这么傻吧,于是今天到公司后,请教了elastic中国社区首席布道师刘晓国老师,刘老师非常热情的直接电话过来,解释了kibana无法打开的原因以及解决办法,在这里对刘老师的帮助表达诚挚感谢,非常感谢刘老师。推荐大家看看刘老师的博客:Elastic:开发者上手指南-CSDN博客
接下来我们说kibana无法打开的原因,还是证书问题,kibana在启动时,对本机的ip做了校验,更换网络后,ip发生变更,因此kibana无法启动,kibana的配置文件中有这么一行代码:

我们只要这行代码更改为以下即可:
elasticsearch.hosts: ['https://localhost:9200']
es8的证书除了对本机的实际ip做了校验,也对localhost做了验证,因此,只要改成localhost问题就会解决,即使更换网络,localhost是不会改变的。
另外再更换网络的情况下,如果要通过未更换网络的机器连接更换网络的机器,只有一个办法,那就是在当前网络下更新证书,除此别无他法。
6、所有代码
package mainimport ("context""fmt""os""strings""time""github.com/elastic/go-elasticsearch/v7/esapi""github.com/elastic/go-elasticsearch/v8"jsoniter "github.com/json-iterator/go""github.com/liupengh3c/esbuilder"
)// 最外层数据结构
type Documents struct {Shards Shards `json:"_shards"`Hits HitOutLayer `json:"hits"`TimedOut bool `json:"timed_out"`Took int `json:"took"`
}
type Shards struct {Failed int `json:"failed"`Skipped int `json:"skipped"`Successful int `json:"successful"`Total int `json:"total"`
}
type HitOutLayer struct {Hits []Hits `json:"hits"`MaxScore float64 `json:"max_score"`Total Total `json:"total"`
}
type Hits struct {ID string `json:"_id"`Index string `json:"_index"`Score float64 `json:"_score"`Source map[string]any `json:"_source"`Type string `json:"_type"`
}
type Total struct {Relation string `json:"relation"`Value int `json:"value"`
}func main() {SearchFromSize()
}func SearchFromSize() {st := time.Now()defer func() {fmt.Println("cost:", time.Since(st).Milliseconds(), "ms")}()var json = jsoniter.ConfigCompatibleWithStandardLibrarydocs := Documents{}cert, _ := os.ReadFile("/Users/liupeng/Documents/study/elasticsearch-8.17.0/config/certs/http_ca.crt")client, err := elasticsearch.NewClient(elasticsearch.Config{Username: "elastic",Password: "xpE4DQGWE9bCkoj7WXYE",Addresses: []string{"https://127.0.0.1:9200"},CACert: cert,})if err != nil {fmt.Println("create client err:", err.Error())return}dslQuery := esbuilder.NewDsl()boolQuery := esbuilder.NewBoolQuery()boolQuery.Filter(esbuilder.NewRangeQuery("doc_id").Gte(1))dslQuery.SetQuery(boolQuery)dslQuery.SetFrom(9998)dslQuery.SetSize(3)dslQuery.SetOrder(esbuilder.NewSortQuery("doc_id", "asc"))dsl := dslQuery.BuildJson()search := esapi.SearchRequest{Index: []string{"new_tag_202411"},Body: strings.NewReader(dsl),}resp, err := search.Do(context.Background(), client)if err != nil {fmt.Println("search err:", err.Error())return}json.NewDecoder(resp.Body).Decode(&docs)strDoc, _ := json.MarshalToString(docs)fmt.Println(strDoc)
}
最后祝各位同学圣诞节快乐~~~~~~~~~~~~~
相关文章:
Elasticsearch检索方案之一:使用from+size实现分页
前面两篇文章介绍了elasticsearch以及Kibana的安装,检索引擎以及可视化工具都已经安装完成,接下来介绍下如何使用golang的sdk实现简单的分页查询。 1、下载Elastic官方golang sdk 在讲解elasticsearch检索之前,需要先把golang的环境安装好&…...
知识图谱+大模型:打造全新智慧城市底层架构
在数字化时代,智慧城市的建设正迎来新一轮的变革。本文将探讨如何结合知识图谱和大模型技术,构建智慧城市的全新底层架构,以应对日益增长的数据量和复杂性,提升城市管理的智能化水平。 知识图谱:智慧城市的知识库 知识…...
Flutter开发HarmonyOS 鸿蒙App的好处、能力以及把Flutter项目打包成鸿蒙应用
Flutter开发HarmonyOS的好处: Flutter是谷歌公司开发的一款开源、免费的UI框架,可以让我们快速的在Android和iOS上构建高质量App。它最大的特点就是跨平台、以及高性能。 目前 Flutter 已经支持 iOS、Android、Web、Windows、macOS、Linux 的跨平台开发…...
vscode安装fortran插件配置
本章教程,主要介绍如何在vscode上安装fortran插件,以便于使用vscode运行fortran编写的程序。 一、安装插件 首先在插件商店安装这个扩展插件 然后再把Code Runner扩展插件装上 二、下载mingw64 通过网盘分享的文件:mingw64 链接: https://pan.baidu.com/s/1fwS-CwC7dgI...
容器化平台Docker初识
Docker 是一个容器化平台,可以让你打包、分发和运行应用程序。它的核心思想是通过容器技术,让应用程序在任何环境下都能以一致的方式运行。 通俗易懂的理解 快餐盒的比喻: 假设你做了一顿饭(开发了一个应用程序)&#…...
【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 1、输入数值 2、选择结构语句 3、计算结果并输出 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务:编写一个程序,该程序需输入个人数据,进而预测其成年后的身高。 相关知识 为了完成本…...
简单两步使用ssh配置内网穿透
解决问题:内网主机没有公网IP,无法从外网登录 流程 首先去阿里云租一台最便宜的服务器作为中转服务器 登录中转服务器(cloudserver) ssh [cloudserver] # 开放对应中转服务 ufw allow [remote_port] #remote_port 2222 vim /etc/ssh/sshd_config将对…...
M系列芯片切换镜像源并安装 openJDK17
1. 查找openjdk版本 执行:brew search openjdk,注意:执行命令后,如果得到的结果中没有红框内容,则需要更新一下 brew 更新 brew 分别执行以下命令: cd "$(brew --repo)" export HOMEBREW_API_D…...
图像处理-Ch6-彩色图像处理
Ch6 彩色图像处理 无广告更易阅读,个人博客点此进入<– 文章目录 Ch6 彩色图像处理彩色基础彩色模型(Color models)RGB(red, green, blue)CMY & CMYK(cyan, magenta, yellow/and black)HSI(hue, saturation, intensity)HSV(hue, saturation, value) 颜色空…...
Redis可视化工具 RDM mac安装使用
第一步:https://pan.baidu.com/s/10vpdhw7YfDD7G4yZCGtqQg?at1673701651004将dmg下载 第二部:点击下载的dmg文件进行安装、mac可能会提示: 无法验证此App不包含恶意软件 解决方法: 打开系统偏好设置>安全性与隐私>通用&am…...
单元测试/系统测试/集成测试知识总结
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、单元测试的概念 单元测试是对软件基本组成单元进行的测试,如函数或一个类的方法。当然这里的基本单元不仅仅指的是一个函数或者方法࿰…...
多目标应用(一):多目标麋鹿优化算法(MOEHO)求解10个工程应用,提供完整MATLAB代码
一、麋鹿优化算法 麋鹿优化算法(Elephant Herding Optimization,EHO)是2024年提出的一种启发式优化算法,该算法的灵感来源于麋鹿群的繁殖过程,包括发情期和产犊期。在发情期,麋鹿群根据公麋鹿之间的争斗分…...
机器学习和深度学习中的种子设置
一、常见的随机数生成器及其对应的设置方法: Python内置的随机数生成器: import random random.seed(manual_seed)NumPy的随机数生成器: import numpy as np np.random.seed(manual_seed)PyTorch的随机数生成器: import torch tor…...
[手机Linux] 七,NextCloud优化设置
安装完成后在个人设置里发现很多警告,一一消除。 只能一条一条解决了。 关于您的设置有一些错误。 1,PHP 内存限制低于建议值 512 MB。 设置php配置文件: /usr/local/php/etc/php.ini 把里面的: memory_limit 128M 根据你自…...
Ruby+Selenium教程
什么是 Minitest? Minitest 是 Ruby 的测试框架,提供一整套测试工具。它运行速度快,支持 TDD、BDD、模拟和基准测试 以下是使用Ruby、Selenium WebDriver和Minitest 的脚本,用于断言 Restful Booker Platform 的“页面标题”等于…...
【论文阅读笔记】Learning to sample
Learning to sample 前沿引言方法问题声明S-NET匹配ProgressiveNet: sampling as ordering 实验分类检索重建 结论附录 前沿 这是一篇比较经典的基于深度学习的点云下采样方法 核心创新点: 首次提出了一种学习驱动的、任务特定的点云采样方法引入了两种采样网络&…...
边缘计算收益稳定
要使自己的PCDN(Personal Content Delivery Network,个人内容分发网络)收益更稳定,可以从以下几个方面进行努力: 一、选择合适的PCDN平台 平台稳定性:选择技术成熟、稳定性高的PCDN平台,确保内…...
域名和服务器是什么?域名和服务器是什么关系?
在互联网的生态系统中,域名和服务器是两个至关重要的组成部分。它们共同构成了我们访问网站和使用在线服务的基础。那么域名和服务器是什么?域名和服务器是什么关系? 1、域名的概念 域名是互联网中用于标识特定地址的一种文字形式。它是用户访问网站时输入的易记…...
IBatis和MyBatis在细节上的不同有哪些
iBatis 和 MyBatis 都是流行的 Java 持久化框架,用于简化数据库交互。MyBatis 是从 iBatis 演化而来,MyBatis 在 iBatis 的基础上做了很多改进和优化,因此两者在设计和功能上存在一些差异。以下是它们在细节上的主要区别: 1. 框架…...
使用Python获取PDF文本和图片的精确位置
在处理和分析PDF文档时,获取文本和图片在页面上的精确位置是一个重要的操作。通过确定这些元素的具体坐标,我们可以实现对PDF内容的更精细控制和理解,这对于自动化文档处理、信息提取以及内容重组等工作流程尤为关键。通过Python编程语言&…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
