Elasticsearch:ES|QL 查询 TypeScript 类型(二)
在我之前的文章 “Elasticsearch:ES|QL 查询 TypeScript 类型(一)”,我们讲述了如何在 Nodejs 里对 ES|QL 进行查询。在今天的文章中,我们来使用一个完整的例子来进行详细描述。更多有关如何使用 Nodejs 来访问 Elasticsearch的知识,请参阅文章 “Elasticsearch:使用最新的 Nodejs client 8.x 来创建索引并搜索”。
在一下的演示中,我将使用 Elastic Stack 8.13.4 来进行展示。
安装
Elasticsearch 及 Kibana
如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参考如下的链接来进行安装:
- 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch
- Kibana:如何在 Linux,MacOS 及 Windows上安装 Elastic 栈中的 Kibana
在安装的时候,我们选择 Elastic Stack 8.x 来进行安装。特别值得指出的是:ES|QL 只在 Elastic Stack 8.11 及以后得版本中才有。你需要下载 Elastic Stack 8.11 及以后得版本来进行安装。
在首次启动 Elasticsearch 的时候,我们可以看到如下的输出:
我们需要记下 Elasticsearch 超级用户 elastic 的密码。
我们还可以在安装 Elasticsearch 目录中找到 Elasticsearch 的访问证书:
$ pwd
/Users/liuxg/elastic/elasticsearch-8.13.4/config/certs
$ ls
http.p12 http_ca.crt transport.p12
在上面,http_ca.crt 是我们需要用来访问 Elasticsearch 的证书。
Nodejs 依赖包
我们可以使用如下的命令来安装最新的 nodejs 客户端包:
yarn add @elastic/elasticsearch或者npm install @elastic/elasticsearch
我们可以通过如下的命令来查看安装的版本:
$ npm -v @elastic/elasticsearch
8.19.2
创建项目目录并拷贝证书
我们在电脑里创建一个目录,并拷贝相应的 Elasticsearch 访问证书到该目录下:
$ pwd
/Users/liuxg/nodejs/esql
$ cp ~/elastic/elasticsearch-8.13.4/config/certs/http_ca.crt .
$ ls http_ca.crt
http_ca.crt
我们使用如下的命令来安装:
npm install --save-dev @types/node
创建一个叫做 esql.ts 的文件
touch esql.ts
我们使用如下的命令来安装 ts-node:
npm install -g ts-node typescript '@types/node'
在下面我们将使用如下的命令来运行代码:
ts-node esql.ts
展示
连接到 Elasticsearch
我们编辑 esql.ts 如下:
import { Client } from '@elastic/elasticsearch'
import * as fs from "fs";const client = new Client({node: 'https://localhost:9200',auth: {username: 'elastic',password: '=VnaMJck+DbYXpHR1Fch'},tls: {ca: fs.readFileSync('./http_ca.crt'),rejectUnauthorized: false}})client.info().then((response) => console.log(JSON.stringify(response))).catch((error) => console.error(JSON.stringify(error)));
在上面,我们使用超级账号 elastic 来进行连接。我们使用证书来访问自签名证书的集群。你需要根据自己的 Elasticsearch 配置修改上面的代码。更多关于如何访问 Elasticsearch 的知识,请阅读文章 “Elasticsearch:使用最新的 Nodejs client 8.x 来创建索引并搜索”。 运行上面的代码,返回:
$ ts-node esql.ts
{"name":"liuxgm.local","cluster_name":"elasticsearch","cluster_uuid":"JXoZ_Xu-QnasteO4AWnVvQ","version":{"number":"8.13.4","build_flavor":"default","build_type":"tar","build_hash":"da95df118650b55a500dcc181889ac35c6d8da7c","build_date":"2024-05-06T22:04:45.107454559Z","build_snapshot":false,"lucene_version":"9.10.0","minimum_wire_compatibility_version":"7.17.0","minimum_index_compatibility_version":"7.0.0"},"tagline":"You Know, for Search"}
写入数据
esql.ts
import { Client } from '@elastic/elasticsearch'
import * as fs from "fs";const client = new Client({node: 'https://localhost:9200',auth: {username: 'elastic',password: '=VnaMJck+DbYXpHR1Fch'},tls: {ca: fs.readFileSync('./http_ca.crt'),rejectUnauthorized: false}})client.info().then((response) => console.log(JSON.stringify(response))).catch((error) => console.error(JSON.stringify(error))); async function run () {// Lets index some data into Elasticsearchawait client.indices.exists({index: "books"}).then(function (exists) {if(exists) {console.log("the index already existed")} else {console.log("the index has not been createdyet")client.helpers.bulk({datasource: [{ name: "Revelation Space", author: "Alastair Reynolds", release_date: "2000-03-15", page_count: 585 },{ name: "1984", author: "George Orwell", release_date: "1985-06-01", page_count: 328 },{ name: "Fahrenheit 451", author: "Ray Bradbury", release_date: "1953-10-15", page_count: 227 },{ name: "Brave New World", author: "Aldous Huxley", release_date: "1932-06-01", page_count: 268 },],onDocument(_doc) {return { index: { _index: "books" } }},})}})
}run().catch(console.log)
在运行完上面的代码后,我们可以在 Kibana 中进行查看:
对数据进行 ES|QL 查询
const response = await client.esql.query({ query: 'FROM books' })console.log(response)
完整的代码为:
esql.ts
import { Client } from '@elastic/elasticsearch'
import * as fs from "fs";const client = new Client({node: 'https://localhost:9200',auth: {username: 'elastic',password: '=VnaMJck+DbYXpHR1Fch'},tls: {ca: fs.readFileSync('./http_ca.crt'),rejectUnauthorized: false}})client.info().then((response) => console.log(JSON.stringify(response))).catch((error) => console.error(JSON.stringify(error))); async function run () {// Lets index some data into Elasticsearchawait client.indices.exists({index: "books"}).then(function (exists) {if(exists) {console.log("the index already existed")} else {console.log("the index has not been createdyet")client.helpers.bulk({datasource: [{ name: "Revelation Space", author: "Alastair Reynolds", release_date: "2000-03-15", page_count: 585 },{ name: "1984", author: "George Orwell", release_date: "1985-06-01", page_count: 328 },{ name: "Fahrenheit 451", author: "Ray Bradbury", release_date: "1953-10-15", page_count: 227 },{ name: "Brave New World", author: "Aldous Huxley", release_date: "1932-06-01", page_count: 268 },],onDocument(_doc) {return { index: { _index: "books" } }},})}})const response = await client.esql.query({ query: 'FROM books' })console.log(response)
}run().catch(console.log)
上面代码的完整响应为:
$ ts-node esql.ts
the index already existed
{"name":"liuxgm.local","cluster_name":"elasticsearch","cluster_uuid":"JXoZ_Xu-QnasteO4AWnVvQ","version":{"number":"8.13.4","build_flavor":"default","build_type":"tar","build_hash":"da95df118650b55a500dcc181889ac35c6d8da7c","build_date":"2024-05-06T22:04:45.107454559Z","build_snapshot":false,"lucene_version":"9.10.0","minimum_wire_compatibility_version":"7.17.0","minimum_index_compatibility_version":"7.0.0"},"tagline":"You Know, for Search"}
{columns: [{ name: 'author', type: 'text' },{ name: 'author.keyword', type: 'keyword' },{ name: 'name', type: 'text' },{ name: 'name.keyword', type: 'keyword' },{ name: 'page_count', type: 'long' },{ name: 'release_date', type: 'date' }],values: [['Alastair Reynolds','Alastair Reynolds','Revelation Space','Revelation Space',585,'2000-03-15T00:00:00.000Z'],['George Orwell','George Orwell','1984','1984',328,'1985-06-01T00:00:00.000Z'],['Ray Bradbury','Ray Bradbury','Fahrenheit 451','Fahrenheit 451',227,'1953-10-15T00:00:00.000Z'],['Aldous Huxley','Aldous Huxley','Brave New World','Brave New World',268,'1932-06-01T00:00:00.000Z']]
}
将每行返回为值数组是一个简单的默认设置,在许多情况下很有用。不过,如果你想要一个记录数组(JavaScript 应用程序中的标准结构),则需要额外的努力来转换数据。
幸运的是,在 8.14.0 中,JavaScript 客户端将包含一个新的 ES|QL 助手来为你执行此操作:
const { records } = await client.helpers.esql({ query: 'FROM books' }).toRecords()/*
Returns:
[{ name: "Revelation Space", author: "Alastair Reynolds", release_date: "2000-03-15", page_count: 585 },{ name: "1984", author: "George Orwell", release_date: "1985-06-01", page_count: 328 },{ name: "Fahrenheit 451", author: "Ray Bradbury", release_date: "1953-10-15", page_count: 227 },{ name: "Brave New World", author: "Aldous Huxley", release_date: "1932-06-01", page_count: 268 },
]
*/
截止目前为止,8.14 还没有发布。期待在正式发布后,我们再重新尝试。
更多关于 ES|QL 的查询,请详细阅读文章 “Elasticsearch:ES|QL 动手实践”。
在文章的最后,我们可以来完成另外一个查询。我们使用 Kibana 来进行查询:
POST _query?format=txt
{"query": """FROM books| WHERE release_date > "1985-06-01"| LIMIT 5"""
}
我们使用 Nodejs 来进行查询:
const query = 'FROM books | WHERE release_date > "1985-06-01" | LIMIT 5'const response1 = await client.esql.query({ query: query })console.log(response1)
esql.ts
import { Client } from '@elastic/elasticsearch'
import * as fs from "fs";const client = new Client({node: 'https://localhost:9200',auth: {username: 'elastic',password: '=VnaMJck+DbYXpHR1Fch'},tls: {ca: fs.readFileSync('./http_ca.crt'),rejectUnauthorized: false}})client.info().then((response) => console.log(JSON.stringify(response))).catch((error) => console.error(JSON.stringify(error))); async function run () {// Lets index some data into Elasticsearchawait client.indices.exists({index: "books"}).then(function (exists) {if(exists) {console.log("the index already existed")} else {console.log("the index has not been createdyet")client.helpers.bulk({datasource: [{ name: "Revelation Space", author: "Alastair Reynolds", release_date: "2000-03-15", page_count: 585 },{ name: "1984", author: "George Orwell", release_date: "1985-06-01", page_count: 328 },{ name: "Fahrenheit 451", author: "Ray Bradbury", release_date: "1953-10-15", page_count: 227 },{ name: "Brave New World", author: "Aldous Huxley", release_date: "1932-06-01", page_count: 268 },],onDocument(_doc) {return { index: { _index: "books" } }},})}})const response = await client.esql.query({ query: 'FROM books' })console.log(response)const query = 'FROM books | WHERE release_date > "1985-06-01" | LIMIT 5'const response1 = await client.esql.query({ query: query })console.log(response1)
}run().catch(console.log)
上面最后一个查询的结果为:
相关文章:
Elasticsearch:ES|QL 查询 TypeScript 类型(二)
在我之前的文章 “Elasticsearch:ES|QL 查询 TypeScript 类型(一)”,我们讲述了如何在 Nodejs 里对 ES|QL 进行查询。在今天的文章中,我们来使用一个完整的例子来进行详细描述。更多有关如何使用 Nodejs 来访问 Elasti…...
元音 (音标) 和元音字母的区别
元音 [音标] 和元音字母的区别 1. 音位 (phoneme)1.1. Correspondence between letters and phonemes 2. 元音 (vowel)3. 辅音 (consonant)3.1. Consonant sounds and consonant letters 4. 元音字母 (vowel letter)References 1. 音位 (phoneme) https://en.wikipedia.org/wi…...
SMS - 基于阿里云实现手机短信验证码登录(无需备案,非测试)
目录 SMS 环境调试 从阿里云云市场中购买第三方短信服务 调试短信验证码功能 实战开发 封装组件 对外接口 调用演示 SMS 环境调试 从阿里云云市场中购买第三方短信服务 a)进入阿里云首页,然后从云市场中找到 “短信” (一定要从 云…...
使用Python编写Ping监测程序
Ping是一种常用的网络诊断工具,它可以测试两台计算机之间的连通性; 如果您需要监测某个IP地址的连通情况,可以使用Python编写一个Ping监测程序; 本文将介绍如何使用Python编写Ping监测程序 首先,需要导入os、sys、t…...
iptables常用命令总结
1.iptables 是什么 在Linux中,iptables就是一款强大而灵活的防火墙工具,它为系统管理员提供了广泛的配置选项,可以有效地控制数据包的流动,实现网络访问的控制及安全性增强。 iptables 使用三个不同的链来允许或阻止流量&#x…...
spring 自定义注解实现
实现自定义注解,通常会结合AOP(面向切面编程)来创建一个自定义的行为。 下面创建一个名为MyCustomAnnotation的自定义注解,并使用AOP编写一个切面来处理这个注解。 1. 创建自定义注解: import java.lang.annotation…...
10.dockerfile自动构建镜像
dockerfile自动构建镜像 类似ansible剧本,大小几kb 手动做镜像:大小几百M 首先创建一个dockerfile的路径,便于在路径下存在多个路径每个路径下都是dockerfile命名的脚本 注释:文件必须为:dockerfile或者Dockerfile …...
python -- series和 DataFrame增删改数据
学习目标 知道df添加新列的操作 知道insert函数插入列数据 知道drop函数删除df的行或列数据 知道drop_duplicates函数对df或series进行数据去重 知道unique函数对series进行数据去重 知道apply函数的使用方法 1 DataFrame添加列 注意:本文用到的数据集在文章顶部 1.1 直…...
window.clearInterval(timer) 清除定时器
window.clearInterval(timer)是用来清除定时器的方法。在JavaScript中,使用定时器可以在指定的时间间隔执行一段代码。通常,使用setTimeout()方法可以在一定时间后执行一次代码,而使用setInterval()方法可以在每个时间间隔执行一次代码。 使…...
Java项目如何外发告警日志到企业微信
前言 最近领导交代了一个需求,就是有些许客户不单单满足平台告警日志外发到邮箱、短信的形式,还要以消息聊天的形式外发给企业微信。 具体操作 1、注册企业微信。 2、登录企业微信,找到应用管理,创建应用。 3、创建完之后需要记录以下图片中两个值的信息。 4、然后记录下…...
NLP--关键词
在去停用词后的文本中进行词频统计和关键词统计以及词云图显示,来进行文本的关键词提取,让人一目了然。 1.词频统计 统计文本中多次出现的词语,来寻找文章中的关键词,因为多次出现很可能就是关键内容。调用统计数量的Counter库和…...
Qt5学习笔记
一、基础知识 1、基本控件类型 水平弹簧与垂直弹簧的父类都是QSpaceItem。关于PushButton相关的控件类型: QPushButton:最基础的按钮类型。QToolButton:可以控制图片、文字任意组合的显示方式的按钮类型。QRadioButton:就像rad…...
数据结构与算法笔记:基础篇 - 散列表(下):为什么散列表和链表经常会一起使用?
概述 已经学习了这么多章节了,你有没有发现,两种数据结构,散列表和链表,经常会被放在一起使用。你还记得,前面的章节中都有哪些地方讲到散列表和链表的组合使用吗? 在链表那一节,我讲到如何用…...
读AI未来进行式笔记06自动驾驶技术
1. 跃层冲击 1.1. 每个社会其实都处于不同的楼层,往往处于更低楼层的社会,要承受来自更高楼层的社会发展带来的更大冲击 2. 驾驶 2.1. 开车时最关键的不是车,而是路 2.2. 人是比机器更脆弱的生命&am…...
SpringAOP 常见应用场景
文章目录 SpringAOP1 概念2 常见应用场景3 AOP的几种通知类型分别有什么常见的应用场景4 AOP实现 性能监控4.1 首先,定义一个切面类,用于实现性能监控逻辑:4.2 定义自定义注解4.3 注解修饰监控的方法 5 AOP实现 API调用统计5.1 定义切面类&am…...
html+css示例
HTML HTML(超文本标记语言)和CSS(层叠样式表)是构建和设计网页的两种主要技术。HTML用于创建网页的结构和内容,而CSS用于控制其外观和布局。 HTML基础 HTML使用标签来标记网页中的不同部分。每个标签通常有一个开始…...
Day51 动态规划part10+Day52 动态规划part11
LC121买卖股票的最佳时机(未掌握) 暴力:双层循环寻找最优间距,每一次都确定一个起点,遍历剩余节点当作终点 贪心:取最左最小值,不断遍历那么得到的差值最最大值就是最大利润。 动态规划 dp数组…...
Wireshark自定义Lua插件
背景: 常见的抓包工具有tcpdump和wireshark,二者可基于网卡进行抓包:tcpdump用于Linux环境抓包,而wireshark用于windows环境。抓包后需借助包分析工具对数据进行解析,将不可读的二进制数转换为可读的数据结构。 wires…...
商城项目【尚品汇】07分布式锁-2 Redisson篇
文章目录 1 Redisson功能介绍2 Redisson在Springboot中快速入门(代码)2.1 导入依赖2.2 Redisson配置2.3 将自定义锁setnx换成Redisson实现(可重入锁) 3 可重入锁原理3.1 自定义分布式锁setnx为什么不可以重入3.2 redisson为什么可…...
Adobe Illustrator 矢量图设计软件下载安装,Illustrator 轻松创建各种矢量图形
Adobe Illustrator,它不仅仅是一个简单的图形编辑工具,更是一个拥有丰富功能和强大性能的设计利器。 在这款软件中,用户可以通过各种精心设计的工具,轻松创建和编辑基于矢量路径的图形文件。这些矢量图形不仅具有高度的可编辑性&a…...
Nvidia/算能 +FPGA+AI大算力边缘计算盒子:中国舰船研究院
中国舰船研究院又称中国船舶重工集团公司第七研究院,隶属于中国船舶重工集团公司,是专门从事舰船研究、设计、开发的科学技术研究机构,是中国船舶重工集团公司的军品技术研究中心、科技开发中心;主要从事舰船武器装备发展战略研究…...
双网卡配置IP和路由总结
1.在网络适配器属性IPv4中设置默认网关(记网关地址为A),将会在本地路由表中新增一条记录: 网络号子网掩码网关地址0.0.0.00.0.0.0A 2.如果有两个网卡(假设一个连接内网,一个连接互联网)&#…...
【纯血鸿蒙】——自适应布局如何实现?
界面级一多能力有 2 类: 自适应布局: 略微调整界面结构 响应式布局:比较大的界面调整 本文章先主要讲解自适应布局,响应式布局再后面文章再细讲。话不多说,开始了。 自适应布局 针对常见的开发场景,方舟开发框架提…...
Qt5学习笔记(一):Qt Widgets Application项目初探
笔者长期使用MFC开发Windows GUI软件。随着软件向Linux平台迁移的趋势越发明朗,GUI程序的跨平台需求也越来越多。因此笔者计划重新抓一下Qt来实现跨平台GUI程序的实现。 0x01. 看看Qt Widgets Application项目结构 打开Qt5,点击“ New”按钮新建项目。…...
Linux网络编程:数据链路层协议
目录 前言: 1.以太网 1.1.以太网帧格式 1.2.MTU(最大传输单元) 1.2.1.IP协议和MTU 1.2.2.UDP协议和MTU 1.2.3.TCP协议和MTU 2.ARP协议(地址解析协议) 2.1.ARP在局域网通信的角色 2.2.ARP报文格式 2.3.ARP报文…...
企业估值的三种方法
估值模型三剑客—DCF、P/E、EV /EBITDA 三种主要估值模型的优缺点: DCF 优点:通过对自由现金流的折现计算,反映了公司内在价值的本质,是最重要与最合理的估值方法。 缺点:未来自由现金流的估计不准确,受折现率影响…...
比亚迪正式签约国际皮划艇联合会和中国皮划艇协会,助推龙舟入奥新阶段
6月5日,比亚迪与国际皮划艇联合会、中国皮划艇协会在深圳共同签署合作协议,国际皮划艇联合会主席托马斯科涅茨科,国际皮划艇联合会秘书长理查德派蒂特,中国皮划艇协会秘书长张茵,比亚迪品牌及公关处总经理李云飞&#…...
宏集Panorama SCADA:个性化定制,满足多元角色需求
前言 在考虑不同人员在企业中的职能和职责时,他们对于SCADA系统的需求可能因其角色和工作职责的不同而有所差异。在SCADA系统的设计和实施过程中,必须充分考虑和解决这种差异性。 为了满足不同人员的需求, 宏集Panorama SCADA平台具备灵活的功能和定制…...
聪明人社交的基本顺序:千万别搞反了,越早明白越好
聪明人社交的基本顺序:千万别搞反了,越早明白越好 国学文化 德鲁克博雅管理 2024-03-27 17:00 作者:方小格 来源:国学文化(gxwh001) 导语 比一个好的圈子更重要的,是自己优质的能力。 唐诗宋…...
图片和PDF展示预览、并支持下载
需求 展示图片和PDF类型,并且点击图片或者PDF可以预览 第一步:遍历所有的图片和PDF列表 <div v-for"(data,index) in parerFont(item.fileInfo)" :key"index" class"data-list-item"><downloadCard :file-inf…...
重庆网站开发建设/seo网站推广是什么
我会持续分享一些编程和机器学习相关的心得或理解,感兴趣的可以关注下^-^!!!趣闻震惊:YOLO之父宣布退出CV界:出于道德考虑,不希望算法用于军事和隐私这意味着,经过多个版本的迭代,越来越好的yolo将不会迎来…...
供需网站开发/推广方式和推广渠道
先把Tesseract的基础部分放上来。 由于对游戏的文案非常感兴趣,所以希望可以将游戏中图片截图,识别图片上的文字转成txt,基于此记录一下学习过程,简单记录。 环境说明: Mac 10.13 python 2.7 Tesseract 3.05.01github地…...
曲靖手机网站建设/网络营销专业如何
Java RMI基础Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能…...
低价网站建设推广优化/seo外包 杭州
概述: 随着电力供应商品化、市场化的发展,变配电站数量猛增。由于电站分布范围广,距离远,又多处于野外,现场情况不便于管理,因此无人值守的变电站管理模式得到广泛的推广,通过建立变电站设备运行…...
网站 ip地址是什么/链接下载
正文 此处以Quartus II 11.1和Notepad v5.9.6.2为例。 1. 使用QII自动调用Notepad来打开HDL、sdc、txt等文件;并且可以在报错的时候,Notepad可以直接高亮所报错的行(此模式下,Notepad最大化后效果最佳)。 方法…...
wordpress 用法/百度搜索榜排名
application对象 application对象负责提供应用程序在服务器中运行时的一些全局信息,常用的方法有getMimeType和getRealPath等。 运用实例:网页访问计数器。 <% page language"java" import"java.util.*" pageEncoding"UTF-8…...