Elasticsearch:ES|QL 动手实践

在我之前的文章 “Elasticsearch:ES|QL 查询语言简介”,我对 Elasticsearch 的最新查询语言 ES|QL 做了一个简单的介绍。在今天的文章中,我们详细来使用一些例子来展示 ES|QL 强大的搜索与分析功能。

安装

如果你还没有安装好自己的 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 的密码。

写入数据

首先,我们在 Kibana 中打入如下的命令来创建一个叫做 nyc_taxis 的索引:

PUT nyc_taxis
{"mappings": {"dynamic": "strict","_source": {"mode": "stored"},"properties": {"cab_color": {"type": "keyword"},"dropoff_datetime": {"type": "date","format": "yyyy-MM-dd HH:mm:ss"},"dropoff_location": {"type": "geo_point"},"ehail_fee": {"type": "scaled_float","scaling_factor": 100},"extra": {"type": "scaled_float","scaling_factor": 100},"fare_amount": {"type": "double"},"improvement_surcharge": {"type": "scaled_float","scaling_factor": 100},"mta_tax": {"type": "scaled_float","scaling_factor": 100},"passenger_count": {"type": "integer"},"payment_type": {"type": "keyword"},"pickup_datetime": {"type": "date","format": "yyyy-MM-dd HH:mm:ss"},"pickup_location": {"type": "geo_point"},"rate_code_id": {"type": "keyword"},"store_and_fwd_flag": {"type": "keyword"},"surcharge": {"type": "scaled_float","scaling_factor": 100},"tip_amount": {"type": "double"},"tolls_amount": {"type": "scaled_float","scaling_factor": 100},"total_amount": {"type": "scaled_float","scaling_factor": 100},"trip_distance": {"type": "scaled_float","scaling_factor": 100},"trip_type": {"type": "keyword"},"vendor_id": {"type": "keyword"},"vendor_name": {"type": "text"}}}
}

接着,我们可以在地址 GitHub - liu-xiao-guo/esql 下载数据集文件 esql.json。 我们可以使用如下的命令来写入数据:

curl --cacert /Users/liuxg/elastic/elasticsearch-8.11.0/config/certs/http_ca.crt -u elastic:o6G_pvRL=8P*7on+o6XH -s -H "Content-Type: application/x-ndjson" -XPOST https://localhost:9200/nyc_taxis/_bulk --data-binary @esql.json

你需要根据自己的安装目录改写上面的证书 http_ca.crt 的路径。你需要根据 elastic 用户的密码做相应的调整。

运行完上面的命令后:

GET nyc_taxis/_count

上面的命令返回:

{"count": 100,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0}
}

我们可以看到 100 个数据。我们为这个数据创建一个 data view:

这样我们就为 nyc_taxis 创建好了一个 index pattern。

ES|QL 动手实践 

首先我们来做一个简单的练习。

查询数据

我们选定好时间范围,再选择 Try ES|QL

我们发现在默认的情况下,在 Query bar 里的查询语句是这样的:

from nyc_taxis | limit 10

这个相当于:

GET nyc_taxis/_search?size=10

为了方便展示,我们把编辑框放大:

这样我们的内容更容易看的清楚一些。

我们做如下的查询:

from nyc_taxis 
| limit 100
| project pickup_datetime, total_amount

在上面,我们使用 project 来返回我们想要的字段。当然我们可以使用 keep 来做同样的事情:

from nyc_taxis 
| limit 100
| keep pickup_datetime, total_amount

我们也可以在 Kibana 的 Dev Tools 中打入如下的命令:

POST /_query?format=json
{"query": """from nyc_taxis | limit 100| keep pickup_datetime, total_amount"""
}

我们也可以改变它的输出格式:

POST /_query?format=txt
{"query": """from nyc_taxis | limit 100| keep pickup_datetime, total_amount"""
}

我们可以通过 sort 来对结果进行排序:

我们可以看到结果是按照 total_amount 进行降序排列的。

在上面,我们可以看到针对 nyc_taxis 这个索引,它没有 @timestamp 时间字段。那我们该怎么办呢?我们可以通过字段 alias 来实现这个。我们执行如下的命令:

PUT nyc_taxis/_mapping
{"properties": {"@timestamp": {"type": "alias","path": "pickup_datetime"}}
}

执行完上面的命令后,我们再次刷新页面:

可能有人想问,这个相应的 DSL 查询的语句是什么呢?如果大家对 DSL 很熟悉的话,上面的语句和下面的查询的结果是一样的:

GET nyc_taxis/_search?filter_path=**.hits
{"size": 100,"_source": false,"fields": ["pickup_datetime","tolls_amount"],"sort": [{"total_amount": {"order": "desc"}}]
}

接下来,我们来查询 fare_amount 大于 20 的结果:

from nyc_taxis 
| where fare_amount > 20

from nyc_taxis 
| where fare_amount > 20
| where payment_type == "1"

上面显示的结果不是很清楚,我们可以使用 keep 来进行查看:

from nyc_taxis 
| where fare_amount > 20
| where payment_type == "1"
| keep fare_amount, payment_type

我们可以加入更多的过滤器:

from nyc_taxis 
| where fare_amount > 20
| where payment_type == "1"
| where tip_amount > 5
| keep fare_amount, payment_type, tip_amount

我们可以通过 limit 来限制前面的 5 个结果(在上面有6个结果显示):

在上面我有有意把 limit 写成大写的 LIMIT。我们可以看出来,它实际上是没有任何的影响。也就是说关键词和大小写无关。我们还可以针对结果进行排序:

from nyc_taxis 
| where fare_amount > 20
| where payment_type == "1"
| where tip_amount > 5
| LIMIT 5 | Sort tip_amount desc
| keep fare_amount, payment_type, tip_amount

上面的查询和下面的 DSL 查询是一样的:

GET nyc_taxis/_search
{"size": 5,"_source": ["fare_amount","payment_type","tip_amount"],"query": {"bool": {"filter": [{"range": {"fare_amount": {"gt": 20}}},{"term": {"payment_type": "1"}},{"range": {"tip_amount": {"gt": 5}}}]}},"sort": [{"tip_amount": {"order": "desc"}}]
}

很显然,我们的 ES|QL 语法更为简单明了。更重要的是,它的执行速度还更快!

接下来,我们来通过现有的字段来生成新的字段。这个也就是我们之前讲过的运行时字段(runtime fields)。我们想计算出来每英里的费用是多少:

from nyc_taxis 
| eval cost_per_mile = total_amount/trip_distance
| keep total_amount, trip_distance, cost_per_mile

如果我们使用之前的 runtime fields 来实现,也就是这样的:

GET nyc_taxis/_search?filter_path=**.hits{"_source": false, "runtime_mappings": {"cost_per_mile": {"type": "double","script": {"source": "emit(doc['total_amount'].value/doc['trip_distance'].value)"}}},"fields": ["total_amount","trip_distance","cost_per_mile"]}

从上面的比较我们可以看出来,ES|QL 是非常简洁的,而且易于理解。

针对上面的查询,我们还可以添加过滤器来进行过滤:

from nyc_taxis 
| eval cost_per_mile = total_amount/trip_distance
| where trip_distance > 10
| keep total_amount, trip_distance, cost_per_mile

我们接下来针对生成的字段 cost_per_mile 更进一步过滤:

from nyc_taxis 
| eval cost_per_mile = total_amount/trip_distance
| where trip_distance > 10
| keep total_amount, trip_distance, cost_per_mile
| where cost_per_mile > 3.5

从显示的结果中,我们可以看出来,我们只有两个结果。

我们可更进一步进行排序:

from nyc_taxis 
| eval cost_per_mile = total_amount/trip_distance
| where trip_distance > 10
| keep total_amount, trip_distance, cost_per_mile
| where cost_per_mile > 3.5
| sort cost_per_mile desc

我们接下来针对数据进行聚合:

聚合数据

我们想知道每个 payment_type 的最多 passenger_count 的数值是多少。我们可以使用 stats 来完成:

from nyc_taxis 
| stats max_passengers=max(passenger_count) by payment_type
| keep payment_type, max_passengers

这个和如下我们以前的 DSL 相似:

GET nyc_taxis/_search?filter_path=aggregations
{"size": 0,"aggs": {"max_passengers": {"terms": {"field": "payment_type"},"aggs": {"max_count": {"max": {"field": "passenger_count"}}}}}
}

上面命令返回的结果是:

{"aggregations": {"max_passengers": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [{"key": "1","doc_count": 71,"max_count": {"value": 6}},{"key": "2","doc_count": 27,"max_count": {"value": 5}},{"key": "3","doc_count": 1,"max_count": {"value": 1}},{"key": "4","doc_count": 1,"max_count": {"value": 1}}]}}
}

很显然,我们的 ES|QL 查询会简单明了很多。

我们还可以添加其他的聚合,比如我们想得到每个 max_passengers 里支付种类 payment_type 的数量:

from nyc_taxis 
| stats max_passengers=max(passenger_count) by payment_type
| keep payment_type, max_passengers
| stats type_count=count(payment_type) by max_passengers

如上所示,在显示区了,它只显示最近的一次的聚会情况。

我们还可以针对时间来做 date_histogram 聚合:

from nyc_taxis 
| eval bucket=AUTO_BUCKET(@timestamp, 12, "2014-12-22T00:00:00.00Z", "2015-11-26T00:00:00.00Z")
| stats count(*) by bucket

这个和我们之前的如下 DSL 相似:

GET nyc_taxis/_search?filter_path=aggregations
{"size": 0,"aggs": {"monthly_count": {"date_histogram": {"field": "@timestamp","fixed_interval": "30d"}}}
}

我们可以针对 payment_types 进行统计:

from nyc_taxis 
| stats payment_types = count(*) by payment_type
| sort payment_types desc

这个和 DSL 的如下统计类似:

GET nyc_taxis/_search?filter_path=aggregations
{"size":0,"aggs": {"payment_types": {"terms": {"field": "payment_type"}}}
}

在 Kibana 中进行可视化

我们也可以使用 ES|QL 在 可视化中进行使用:

我们可以自己在 Discover 中生成相应的可视化。点击上面的保存图标:

这样就很方便地生成了我们的可视化。

我们还可以对它进行编辑:

好了,今天就写到这里。希望我们都学到如何使用 ES|QL 这个工具在未来我们的工作中提供效率。

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

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

相关文章

鸿蒙原生应用开发-DevEco Studio中HarmonyOS与OpenHarmony项目的切换

一、找到该目录 二、修改操作系统类型 三、分别进行开发,一些常规的应用功能实现后,相互切换后都可以正常运行的。前期OpenHarmony项目如果连接开发板比较困难的化,开发完成后,切换成为HarmonyOS后就可以比较详细地看看效果了。

视频封装格式

FLV(Flash Video) FLV封装格式 Tag Data分为Audio,Video,Script三种 TS(Transport Stream)传输流 TS文件分为三层,(倒叙更好理解) TS层:在PES层基础上加入…

[RK3568][Android12.0]--- 系统自带预置第三方APK方法

Platform: RK3568 OS: Android 12.0 Kernel: 4.19 Rockchip默认提供了机制来预置第三方APK, 方法很简单: 1. 在device/rockchip/rk3568创建preinstall目录(如果要可卸载,那就创建preinstall_del目录) 2. 将你要预安装的APK放进此目录即可 preinstall 不…

[SIGGRAPH2023-best]3D Gaussian Splatting for Real-Time Radiance Field Rendering

标题:3D Gaussian Splatting for Real-Time Radiance Field Rendering 链接:https://arxiv.org/pdf/2308.04079.pdf 本文提出了一种基于3D高斯体进行场景重建的方案,并提供了高效的渲染器实现。其重建精度,训练速度和推理速度均…

社区分享|杭银消费金融基于MeterSphere开展接口自动化测试

杭银消费金融有限公司(以下简称“杭银消费金融”)成立于2015年12月,是经中国银保监会批准,由杭州银行作为主发起人,联合滴滴出行、中国银泰等企业组建的持牌消费金融机构,注册资本为25.61亿元。杭银消费金融…

【C语法学习】23 - strlen()函数

文章目录 1 函数原型2 参数3 返回值4 示例4.1 示例1 1 函数原型 strlen():计算指针str所指向的字符串的长度,函数原型如下: size_t strlen(const char *str);2 参数 strlen()函数只有一个参数str: 参数str是指向待计算长度的字…

Web安全:Vulfocus 靶场搭建.(漏洞集成平台)

Web安全:Vulfocus 靶场搭建.(漏洞集成平台) Vulfocus 是一个包含了多种漏洞靶场的镜像。每个靶场都有具体的漏洞环境和攻击点。Vulfocus 的靶场包括了 Web 安全漏洞、系统安全漏洞、网络安全漏洞、密码学漏洞等多种类型。通关这个靶场我们可以…

Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks - 翻译学习

知识密集型NLP任务的检索增强生成 - 论文学习 文章目录 Abstract1 Introduction2 Methods2.1 Models2.2 Retriever: DPR2.3 Generator: BART2.4 Training2.5 Decoding 3 Experiments3.1 Open-domain Question Answering3.2 Abstractive Question Answering3.3 Jeopardy Questio…

十方影视后期“领进门”,成长与成就还得靠自身

在这个充满视觉冲击的时代,影视后期制作已经成为了一种炙手可热的艺术形式。而在这个领域,Adobe After Effects(AE)这款软件无疑是王者之一。十方影视后期作为十方教育科技旗下的艺术设计学科,不仅培养了数万名优秀的后…

Windows如何正确设置PHP环境变量以在Git Bash中运行命令

1、随便找一个目录,鼠标右键打开git bash here 2、cd的根目录 3、找到php安装目录 4、 在根目录下打开 vim .bash_profile ,添加环境变量,php地址根据自己的本地地址而定 PATH$PATH:/d/phpstudy_pro/Extensions/php/php7.3.4nts 添加后保存…

算法笔记——递归(1)

这里写目录标题 递归的思想序列求最大值翻转字符串斐波那契数列数塔回文字符串上楼汉诺塔棋盘覆盖问题数字螺旋矩阵盒分形 递归的思想 子问题须与原始问题为同样的事,且更为简单。 不能无限制地调用本身,须有个出口,化简为非递归状况处理 序…

【原创】java+swing+mysql车辆维修管理系统设计与实现

摘要: 车辆维修管理系统是一个用于管理和追踪车辆维修过程的系统,它能够提高效率,减少错误,并提供详细的车辆历史记录,可以帮助车辆维修企业实现信息化管理,提高工作效率和客户满意度,降低运营…

系列八、Mybatis一对多查询,只查询出了一条记录

一、Mybatis一对多查询,只查询出了一条记录 1.1、问题说明 典型的权限管理框架的数据库表中,一般会存在这样3种角色的表,即用户表、角色表、用户角色关联表,表设计好之后,往这三张表中初始化了一些测试数据&#xff0…

在抖音电商,他们帮女性实现了L码自由

“很多(女装)店铺只做到L,甚至L(其实)是M码。”身高1米6、体重60公斤的达人鸭嗓明明120斤 在抖音上吐槽道,“尤其是夏天的连衣裙,胸围很多不超过85厘米,那它的意思就是你可以胖&…

Elasticsearch docker-compose 使用 Logstash 从 JSON 文件中预加载数据

在我们创建 Elasticsearch 进行开发时,最简单的办法就是在本地使用 docker-compose 来一键部署一个 Elasticsearch 集群。有时,特别是在准备测试环境时,开发人员希望从一开始就创建包含一些测试数据的数据库容器。我们可以使用 Logstash 来很…

3分钟带你了解前端缓存-HTTP缓存

前情提要 前端缓存分为下面三大类,本文主要讲解HTTP缓存~ 1. HTTP缓存 强缓存协商缓存 2. 浏览器缓存 本地小容量缓存本地大容量缓存 3. 应用程序缓存 HTML5应用程序缓存 缓存作用 减少了冗余的数据传输减少服务器的负担提高了网站的性能加快加载网页速度 …

IDEA 2023搭建 SpringMVC +FreeMarker+JDBC

1.IDEA的版本,目前最新是2023,要选择旗舰版。笔者曾选择社区版,发现少了很多功能。只能重新安装。 2.安装好以后的第1件事,是设置Maven,并将下载地址改为淘定站,参照这篇一次包会——最新IDEA配置Maven指南…

嵌入式LINUX——环境搭建 windows、虚拟机、开发板 互ping

摘要: 本文包含,如何设置linux开发板和虚拟机、windows 互ping成功 以及设置过程中出现的虚拟机、开发板查询不到eth0 windows ping开发板出项丢包等问题的解决方式。 windows端设置 windows端插入USB转网卡 打开windows桌面下右下角的网络标识 打…

51单片机+DS1302设计一个电子钟(LCD1602显示时间)

一、前言 电子钟是一种能够准确显示时间的设备,广泛应用于家庭、办公场所和公共场所,为人们提供了方便和准确的时间信息。本项目设计一个基于51单片机的电子钟,使用DS1302作为RTC时钟芯片,LCD1602作为显示屏,并通过串…

uniapp开发ios上线(在win环境下使用三方)

苹果 1、win环境下无法使用苹果os编译器所以使用第三方上传工具,以下示例为 初雪云 (单次收费,一元一次) 初雪云(注册p12证书):https://www.chuxueyun.com/#/pages/AppleCertificate 苹果开发者…