Elasticsearch:ES|QL 查询 TypeScript 类型(二)

news2025/3/15 17:14:04

在我之前的文章 “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)

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

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

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

相关文章

【学习笔记】MySQL(Ⅰ)

MySQL(Ⅰ) 1、 介绍 1.1、概述 1.2、MySQL 的优缺点 1.4、关系型数据库模型2、 基础篇 —— SQL(结构化查询语言) 2.1、通用语法 2.2、SQL 语句的分类 2.3、DDL 语句 2.3.1 数据库结构相关的语法 2.3.2 数据表相关的语…

HTML跨年烟花

目录 写在前面 关于小编 HTML简介 程序设计 系列文章 写在后面 写在前面 学会了这个html烟花秀,跨年就不缺文案喽~ 关于小编 平易近人,慈眉善目,爱交朋友,舍己为人,和蔼可亲,能说会道,…

中国250米全钾(tk)含量数据

全钾是指土壤中含有的全部钾。是水溶性钾、交换性钾、非交换性钾和结构态钾的总和。土壤全钾含量为0.3%〜3.6%,一般为1%〜2%。全钾仅反映了土壤钾素的总储量.其中90%〜98%在相当长时间内是无效的,因此全钾值不能用以指导施肥。 土壤中的钾包括3种形态&am…

JVM类加载机制和双亲委派

类加载机制 java文件需要编译成字节码文件(.class文件),jvm是通过类加载机制,将.class文件加载进内存,经过验证连接->初始化直到使用该对象的过程就是类加载机制,当new对象的时候,jvm首先去常量池寻找该类的符号引用…

try…except语句

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在程序开发时,有些错误并不是每次运行都会出现。例如,实例01,只要输入的数据符合程序的要求,程序就可…

外汇天眼:Marqeta加速欧洲业务发展,华沙办公室正式开幕

Marqeta,全球现代卡发行平台,今天宣布在波兰华沙设立新办公室,以支持其长期的业务和增长战略。通过在波兰设立业务,Marqeta直接获得了进入欧盟的通道,为其在跨境增长和提供增强服务奠定了良好基础。波兰作为欧洲中心位…

代码随想录算法训练营第十三天| 102. 二叉树的层序遍历、226.翻转二叉树、101. 对称二叉树

102. 二叉树的层序遍历 题目链接&#xff1a;102. 二叉树的层序遍历 文档讲解&#xff1a;代码随想录 状态&#xff1a;dfs没写出来&#xff0c;bfs不知道如何分层 import java.util.*;public class BinaryTreeLevelOrderTraversal {// 用于存储每一层的节点值List<List<…

大数据之Schedule调度错误(一)

当我们在利用ooize发起整个任务的调度过程中,如果多个调度任务同时运行并且多个调度任务操作了相同的表,那么就会出现如下的错误关系: Invalid path hdfs://iZh5w01l7f8lnog055cpXXX:8000/user/admin/xxx: No files matching path hdfs://iZh5w01l7f8lnog055cpXXX:8000/user/ad…

MySQL—函数(介绍)—字符串函数(基础)

一、引言 提到函数&#xff0c;在SQL分类中DQL语句中有一个聚合函数&#xff0c;如COUNT()、SUM()、MAX()等等。这些都是一些常见的聚合函数&#xff0c;而聚合函数只是函数的一种&#xff0c;接下来会详细的学习和介绍一下函数的应用场景和以及 mysql 当中文件的函数有哪些。 …

JAVA小案例-用循环语句输出1-1000以内能被5整除的数,每5个一行

JAVA小案例-用循环语句输出1-1000以内能被5整除的数&#xff0c;每5个一行 直接看代码&#xff1a; public class Zhengchu {/*** 用循环语句输出1-1000以内能被5整除的数&#xff0c;每5个一行** param args*/public static void main(String[] args) {for (int i 1; i <…

HTML 转义字符(escape characters)及其对应的符号(symbols)

以下是常见的 HTML 转义字符及其对应的符号&#xff0c;这些可以用于在 HTML 或 JSX 中避免解析错误和特殊字符的冲突&#xff1a; 空格 ( ): 或 引号: 单引号&#xff08;&#xff09;&#xff1a;&apos;、&lsquo;、、&rsquo;双引号&#xff08;"&#x…

GPS定位器专用可编程晶振SG-8018CB

随着全球定位系统&#xff08;GPS&#xff09;技术的普及&#xff0c;GPS定位器在各种领域中得到了广泛应用&#xff0c;如车辆跟踪、个人定位、资产管理和户外活动等。为了确保GPS定位器的高精度和可靠性&#xff0c;选择合适的时钟源至关重要。SG-8018CB可编程晶振作为一款高…

Linux:基本指令

文章目录 ls指令pwd指令cd指令touch指令mkdir指令rmdir指令 && rm指令cp指令man指令echo指令输出重定向追加重定向 cat指令输入重定向 mv指令which指令alias指令more && less指令head && tail指令事件相关的指令date显示时间戳 cal指令find指令grep指令…

十三、resultMap解析

分为两部分&#xff1a;解析和使用 解析 1.解析XML的时候单独解析所有的resultMap标签&#xff0c;封装成ResultMap对象存入configuration中 2.解析XML中的SQL语句&#xff0c;封装MappedStatement对象&#xff0c;这里会根据SQL的返回类型是resultMap还是resultType做处理。如…

乡村振兴与乡村旅游品牌化:打造具有地方特色的乡村旅游品牌,提升乡村旅游吸引力,促进美丽乡村建设

目录 一、引言 二、乡村旅游品牌化的重要性 &#xff08;一&#xff09;增强乡村旅游的辨识度 &#xff08;二&#xff09;提升乡村旅游的附加值 &#xff08;三&#xff09;促进乡村文化的传承与创新 三、打造具有地方特色的乡村旅游品牌 &#xff08;一&#xff09;明…

人工智能与能源约束的矛盾能否化解

以下文章来源&#xff1a;澎湃新闻 人工智能技术在台前展示的是比特世界的算力、算法和数据&#xff0c;但其“轻盈的灵魂”背后则是土地、能源和水等物理世界“沉重的肉身”。根据本文三种情境的模拟测算&#xff0c;未来人工智能发展需要可持续的巨量能源支撑&#xff0c;能源…

使用 NVIDIA NIM 部署生成式 AI 的简单指南

使用 NVIDIA NIM 部署生成式 AI 的简单指南 无论您是在本地还是在云端工作&#xff0c;NVIDIA NIM 推理微服务都可以为企业开发人员提供来自社区、合作伙伴和 NVIDIA 的易于部署的优化 AI 模型。作为 NVIDIA AI Enterprise 的一部分&#xff0c;NIM 提供了一条安全、简化的前进…

Excel 每 N 行拼成一行

F列每四行对应一条记录&#xff1a; ABCDEF1NameAddressCityShort IDCompany 122222 al street3Blue cheese415Company 261111 arm rd7Ranch829Company 3103333 raindrop drive11Peanut123 需要把F列整理成规范表格&#xff0c;按行写入A-D&#xff1a; ABCDEF1NameAddressC…

python中return语句的用法

一、了解函数的标准格式 def 函数名(参数1, 参数2, ...&#xff0c;参数n):函数体第一行代码函数体第二行代码函数体第三行代码...return 语句变量 函数名(参数1&#xff0c;参数2&#xff0c;...&#xff0c;参数n) python遇到return语句时&#xff0c;会结束整个函数调用&a…

VS2017配置OpenCV4.5.1

VS2017配置OpenCV 一、下载OpenCV二、配置OpenCV的电脑环境变量三、配置visual Studio添加路径复制文件到C盘 四、如何使用注意运行时选择Debug x64 五、报错&#xff1a;VSOpencv出现&#xff1a;xxx处有未经处理的异常: Microsoft C 异常: cv::Exception&#xff0c;位于内存…