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 Elasticsearch
    await 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 Elasticsearch
    await 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 Elasticsearch
    await 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)

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【马琴绿绮】马维衡古琴之马氏汉风 明代杉木制;周身髹朱红色漆

【马琴绿绮式】马维衡古琴之马氏汉风 明代杉木制;琴体周身髹朱红色漆,鹿角霜灰胎;形体壮硕、风格高古;音色松透、浑厚,音质纯净,按弹舒适,手感丝滑。

AI视频教程下载:如何用ChatGPT来求职找工作?

这是一个关于使用ChatGPT找工作的课程,作者分享了自己的求职经验和技巧,介绍了如何使用人工智能来改进个人资料和简历,以及如何研究公司和面试。通过细节处理职业目标、分享个人兴趣和技能、寻求导师和专业发展机会,以及在行业内建…

LLVM Cpu0 新后端 系列课程总结

想好好熟悉一下llvm开发一个新后端都要干什么,于是参考了老师的系列文章: LLVM 后端实践笔记 代码在这里(还没来得及准备,先用网盘暂存一下): 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?…

状态方程ABCD矩阵如何确定例子

状态方程ABCD矩阵如何确定 确定状态空间表示中的状态矩阵A、输入矩阵 B、输出矩阵C 和直通矩阵D,需要从系统的动力学方程出发,并将其转换为状态方程的形式。我们可以通过一个具体的物理系统(如倒立摆系统)来说明这一过程 例子:倒立摆系统 系统描述 考虑一个倒立摆系统…

车用柴油氧化安定性检测 GB 19147-2009全项检测

柴油分为轻柴油(沸点范围约180-370℃)和重柴油(沸点范围约350-410℃)两大类。柴油使用性能中最重要的是着火性和流动性,其技术指标分别为十六烷值和凝点,我国柴油现行规格中要求含硫量控制在0.5%-1.5%。 检…

Linxu: Dynamic debug 简介

文章目录 1. 前言2. 什么是 Dynamic debug (dyndbg) ?3. Dynamic debug (dyndbg) 的使用3.1 开启 Dynamic debug (dyndbg) 功能3.2 使用 Dynamic debug (dyndbg) 功能 4. Dynamic debug (dyndbg) 的实现4.1 内核接口 dynamic_pr_debug() 的实现4.2 debugfs 导出控制节点 contr…

stm32中外部中断控制Led亮灭

说明:外部中断的方式通过按键来实现,stm32的配置为江科大stm32教程中的配置。 1.内容: 通过中断的方式,按下B15按键Led亮,按下B13按键Led灭。 2.硬件设计: 3.代码: 3.1中断底层 EXTI.c #i…

Apple - Quartz 2D Programming Guide

本文翻译自:Quartz 2D Programming Guide(更新时间:2017-03-21 https://developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/Introduction/Introduction.html#//apple_ref/doc/uid/TP300010…

高考之后第一张大流量卡应该怎么选?

高考之后第一张大流量卡应该怎么选? 高考结束后,选择一张合适的大流量卡对于准大学生来说非常重要,因为假期期间流量的使用可能会暴增。需要综合考虑多个因素,以确保选到最适合自己需求、性价比较高且稳定的套餐。以下是一些建议…

Mysql(一):深入理解Mysql索引底层数据结构与算法

众所众知,MySql的查询效率以及查询方式,基本上和索引息息相关,所以,我们一定要对MySql的索引有一个具体到数据底层上的认知。 这一次也是借着整理的机会,和大家一起重新复习一下MySql的索引底层。 本节也主要有一下的…

电脑缺失msvcp110.dll文件的解决方法,总结5种靠谱的方法

在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是“找不到msvcp110.dll”。这个错误提示通常出现在运行某些软件时,那么,它究竟会造成哪些问题呢? 一,msvcp110.dll文件概述 msvcp110.dll是Mic…

【二叉树】Leetcode 103. 二叉树的锯齿形层序遍历【中等】

二叉树的锯齿形层序遍历 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 示例 1: 输入:roo…

vite常识性报错解决方案

1.导入路径不能以“.ts”扩展名结束。考虑改为导入“xxx.js” 原因:当你尝试从一个以 .ts 结尾的路径导入文件时,ESLint 可能会报告这个错误,因为它期望导入的是 JavaScript 文件(.js 或 .jsx)而不是 TypeScript 文件&…

nest入门教程

1.介绍: Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用的框架。它使用渐进式 JavaScript,构建并完全支持 TypeScript(但仍然允许开发者使用纯 JavaScript 进行编码)并结合了 OOP(面向对象编程&am…

CNCF项目全景图介绍

本文首发在个人博客上,欢迎来踩! 云原生计算基金会(CNCF)介绍 CNCF(Cloud Native Computing Foundation)官网链接:https://www.cncf.io/ 官方的介绍如下: 云原生技术有利于各组织在公有云、私有云和混合…

程序猿大战Python——流程控制——if基础语句

三大基本语句 目标:了解三大基本语句有哪些? Python中有三大基本语句,它们支撑起了程序的业务逻辑处理。 三大基本语句有: (1)顺序语句 (2)分支语句 (3)循…

【K8s源码分析(三)】-K8s调度器调度周期介绍

本文首发在个人博客上,欢迎来踩! 本次分析参考的K8s版本是v1.27.0。 K8s的整体调度框架如下图所示。 调度框架顶层函数 K8s调度器调度的核心函数schedulerone在pkg/scheduler/schedule_one.go:62,如下,这里将一些解释写在了注…

LLM大语言模型(十六):最新开源 GLM4-9B 本地部署,带不动,根本带不动

目录 前言 本机环境 GLM4代码库下载 模型文件下载:文件很大 修改为从本地模型文件启动 启动模型cli对话demo 慢,巨慢,一个字一个字的蹦 GPU资源使用情况 GLM3资源使用情况对比 前言 GLM-4-9B 是智谱 AI 推出的最新一代预训练模型 …

Java:110-SpringMVC的底层原理(上篇)

SpringMVC的底层原理 在前面我们学习了SpringMVC的使用(67章博客开始),现在开始说明他的原理(实际上更多的细节只存在67章博客中,这篇博客只是讲一点深度,重复的东西尽量少说明点) MVC 体系结…

探索LLM 在金融领域有哪些潜在应用——通过使用 GPT-4 测试金融工程、市场预测和风险管理等 11 项任务

概述 近年来,用于自然语言理解和生成的人工智能技术在自然语言处理领域取得了突破性进展,OpenAI 的 GPT 和其他大规模语言模型在该领域取得了显著进步。这些模型通过先进的计算能力和算法,展示了处理复杂任务的能力,如理解复杂语…