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)

上面最后一个查询的结果为:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/24735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初入阿里云,上手走一波

初入阿里云,上手走一波 一阶:ECSMysqlDMS安装Mysql初始化MysqlMysql操作DMS管理Mysql 二阶:ECSOSS远程连接ECSOSS控制台其他图片服务 三阶:更多搭配操作 可以说个人在日常使用过程中,操作最多的阿里云产品就是阿里云服…

图形化红队行动辅助平台Viper使用记录

图形化红队行动辅助平台Viper使用记录 简介 Viper(炫彩蛇)是一款图形化内网渗透工具,将内网渗透过程中常用的战术及技术进行模块化及武器化. Viper(炫彩蛇)集成杀软绕过,内网隧道,文件管理,命令行等基础功能. Viper(炫彩蛇)当前已集成70个模块,覆盖初始访问/持久化/权限提升/…

【数据结构】初识数据结构之复杂度与链表

【数据结构】初识数据结构之复杂度与链表 🔥个人主页:大白的编程日记 🔥专栏:C语言学习之路 文章目录 【数据结构】初识数据结构之复杂度与链表前言一.数据结构和算法1.1数据结构1.2算法1.3数据结构和算法的重要性 二.时间与空间…

Elasticsearch 认证模拟题 - 13

一、题目 集群中有索引 task3,用 oa、OA、Oa、oA 查询结构是 4 条,使用 dingding 的查询结果是 1 条。通过 reindex 索引 task3 为 task3_new,能够使 task3_new 满足以下查询条件。 使用 oa、OA、Oa、oA、0A、dingding 查询都能够返回 6 条…

【纯血鸿蒙】——自适应布局如何实现?

界面级一多能力有 2 类: 自适应布局: 略微调整界面结构 响应式布局:比较大的界面调整 本文章先主要讲解自适应布局,响应式布局再后面文章再细讲。话不多说,开始了。 自适应布局 针对常见的开发场景,方舟开发框架提…

QT系列教程(10) QTextEdit学习

简介 QTextEdit是文本编辑器,支持富文本功能。接下来我们创建一个Qt Application 应用,然后在ui中添加一个QTextEdit插件。 运行程序后,可以在QTextEdit中输入任何文字也包括富文本。 文本块 我们在MainWindow的ui文件中添加了textedit插件…

24年江苏省教资认定报名照片要求

24年江苏省教资认定报名照片要求,速速查收!

蓝屏绿屏黑屏?别急,有它们仨【送源码】

使用Windows系统的电脑时,可能会碰到各种问题,导致系统无法正常使用。 这些问题都有一个统一的专业叫法就是bug! 系统一旦出现bug,最明显的特点就是, ①电脑蓝屏 电脑蓝屏是最经典的,从XP时代一直延续到…

STM32项目分享:智能台灯系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板及元器件图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.c…

Anaconda软件:安装、管理python相关包

Anaconda的作用 一个python环境中需要有一个解释器, 和一个包集合. 解释器: 根据python的版本大概分为2和3. python2和3之间无法互相兼容, 也就是说用python2语法写出来的脚本不一定能在python3的解释器中运行. 包集合:包含了自带的包和第三方包, 第三…

泛微开发修炼之旅--12ecology工作流常用实用性查询语句源码汇总(二)

文章链接:泛微开发修炼之旅--12ecology工作流常用实用性查询语句源码汇总(二)

图文详解Windows系统下搭建mysql开发环境——mysql Community 8 和 navicat Premium 17 的安装和使用

在正式开始学习使用MySQL之前,我们有必要先搭建一个良好的开发环境,让我们的学习和工作效率事半功倍。 本文涉及到的软件百度云盘:链接:https://pan.baidu.com/s/1jj_YajEv8adeEjMrXLhOTQ?pwd1023 提取码:1023 目录 …

Java Web学习笔记22——前端工程化

实际的前端开发: 前端工程化:是指在企业级的前端项目开发中,把前端开发所需的工具、技术、流程、经验等进行规范化、标准化。 环境准备: vue-cli: 介绍:vue-cli是Vue官方提供的一个脚手架,用于…

wx 生命周期

以下内容你不需要立马完全弄明白,不过以后它会有帮助。 下图说明了页面 Page 实例的生命周期。

【栈】1106. 解析布尔表达式

本文涉及知识点 栈 LeetCode 1106. 解析布尔表达式 布尔表达式 是计算结果不是 true 就是 false 的表达式。有效的表达式需遵循以下约定: ‘t’,运算结果为 true ‘f’,运算结果为 false ‘!(subExpr)’,运算过程为对内部表达式…

opencv 在飞行堡垒8中调用camera导致设备消失

简介 使用 OpenCV 库时, 在最后调用cv::destroyAllWindows()之后设备管理器中的摄像头设备消失了, 看看是怎么触发的, 后面再慢慢研究RootCause是什么。 步骤 设备管理器原来摄像头显示 1. 代码 main.cpp Note: 1. haarcascade_frontalface_default…

AI智能客服经验总结

AI智能客服经验总结 在使用OpenAI的API接口来构建人工智能客服系统时,prompt约束是非常重要的。它可以帮助确保生成的回复符合你的期望和需求。以下是一些关于如何设置和管理prompt约束的建议: 1. 明确客服系统的目标 首先,明确你的客服系…

R语言 | 使用最简单方法添加显著性ggpubr包

本期教程原文:使用最简单方法添加显著性ggsignif包 本期教程 获得本期教程代码和数据,在后台回复关键词:20240605 小杜的生信笔记,自2021年11月开始做的知识分享,主要内容是R语言绘图教程、转录组上游分析、转录组下游…

容声冰箱正式发布主动除菌净味白皮书,守护家人饮食健康

近日,由中国家用电器研究院指导、全国家用电器工业信息中心和容声冰箱联合编制的《冰箱主动除菌净味技术发展白皮书》(下称《白皮书》)正式发布。 《白皮书》指出,容声将IDP主动除菌技术应用到冰箱冷冻、冷藏区域,实现…

对待谷歌百度等搜索引擎的正确方式

对待百度、谷歌等搜索引擎的方式是,你要站在搜索引擎之上,保持自己的独立思想和意见。 当谷歌宣布他们将会根据一个名为“Alphabet”的新控股公司来进行业务调整时,在科技界引起了一片恐慌之声。 永远不要说这是一个公司一直在做的事情。不…