Elasticsearch:ES|QL 查询语言简介

news2024/11/20 8:46:48

警告:此功能处于技术预览阶段,可能会在未来版本中更改或删除。 Elastic 将尽最大努力解决任何问题,但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。在目前的 Elastic Stack 8.10 中此功能还没有提供。

Elasticsearch 查询语言 (ES|QL) 是一种支持迭代探索数据的查询语言。

ES|QL 查询由一系列由管道分隔的命令组成。 每个查询都以源命令(FROM, ROW, SHOW <item>)开始。 源命令会生成一个表,通常包含来自 Elasticsearch 的数据。

源命令后面可以跟一个或多个处理命令。 处理命令通过添加、删除或更改行和列来更改输入表。

你可以链接处理命令,并用竖线字符分隔:|。 每个处理命令都作用于前一个命令的输出表。

查询的结果是最终处理命令生成的表。

运行 ES|QL 查询

ES|QL API

使用 _query 端点运行 ES|QL 查询:

POST /_query
{
  "query": """
    FROM library
    | EVAL year = DATE_TRUNC(1 YEARS, release_date)
    | STATS MAX(page_count) BY year
    | SORT year
    | LIMIT 5
  """
}

结果按行返回:

{
  "columns": [
    { "name": "MAX(page_count)", "type": "integer"},
    { "name": "year"           , "type": "date"}
  ],
  "values": [
    [268, "1932-01-01T00:00:00.000Z"],
    [224, "1951-01-01T00:00:00.000Z"],
    [227, "1953-01-01T00:00:00.000Z"],
    [335, "1959-01-01T00:00:00.000Z"],
    [604, "1965-01-01T00:00:00.000Z"]
  ]
}

默认情况下,结果以 JSON 形式返回。 要返回文本、CSV 或 TSV 格式的结果,请使用 format 参数:

POST /_query?format=txt
{
  "query": """
    FROM library
    | EVAL year = DATE_TRUNC(1 YEARS, release_date)
    | STATS MAX(page_count) BY year
    | SORT year
    | LIMIT 5
  """
}

上述查询的 LIMIT 命令将结果限制为 5 行。

如果未指定,LIMIT 默认为 500。无论 LIMIT 值如何,单个查询都不会返回超过 10,000 行。

Kibana

在 Discover 中使用 ES|QL 探索数据集。 从数据视图下拉列表中,选择 Try ES|QL 开始。

注意:Discover 和 Lens 中的 ES|QL 查询受时间过滤器选择的时间范围的限制。

限制

  • ES|QL 目前支持以下字段类型:
    • alias
    • boolean
    • data
    • double(float、half_float、scaled_float 表示为 double)
    • ip
    • keyword 系列,包括 keyword、constant_keyword 和 wildcard
    • int(short 和 byte 均表示为 int)
    • long
    • null
    • text
    • unsigned_long
    • version
  • 无论 LIMIT 命令的值如何,单个查询都不会返回超过 10,000 行。

ES|QL 语法参考

基本语法

ES|QL 查询由一个源命令组成,后跟一系列可选的处理命令,并用竖线字符分隔:|。 例如:

source-command
| processing-command1
| processing-command2

查询的结果是最终处理命令生成的表。

为了便于阅读,本文档将每个处理命令放在一个新行中。 但是,你可以将 ES|QL 查询编写为一行。 以下查询与前一个查询相同:

source-command | processing-command1 | processing-command2

注释

ES|QL 使用 C++ 风格的注释:

  • 双斜杠 // 用于单行注释
  • /* 和 */ 用于块注释
// Query the employees index
FROM employees
| WHERE height > 2
FROM /* Query the employees index */ employees
| WHERE height > 2
FROM employees
/* Query the
 * employees
 * index */
| WHERE height > 2

运算符

支持以下二进制比较运算符:

  • 平等:==
  • 不等式:!=
  • 小于:<
  • 小于或等于:<=
  • 大于:>
  • 大于或等于:>=

IN 运算符允许测试字段或表达式是否等于文字 (literals)、字段 (fields) 或表达式 (expressions) 列表中的元素:

ROW a = 1, b = 4, c = 3
| WHERE c-a IN (3, b / 2, a)

对于使用通配符或正则表达式的字符串比较,请使用 LIKE 或 RLIKE:

  • 使用 LIKE 来匹配使用通配符的字符串。 支持以下通配符:
    • * 匹配零个或多个字符。
    • ? 匹配一个字符。
FROM employees
| WHERE first_name LIKE "?b*"
| KEEP first_name, last_name
  • 使用 RLIKE 使用正则表达式来匹配字符串:
FROM employees
| WHERE first_name RLIKE ".leja.*"
| KEEP first_name, last_name

支持以下布尔运算符:

  • AND
  • OR
  • NOT

Predicates - 谓词

对于 NULL 比较,请使用 IS NULL 和 IS NOT NULL 谓词:

FROM employees
| WHERE birth_date IS NULL
| KEEP first_name, last_name
| SORT first_name
| LIMIT 3
first_name:keywordlast_name:keyword

Basil

Tramer

Florian

Syrotiuk

Lucien

Rosenbaum

FROM employees
| WHERE is_rehired IS NOT NULL
| STATS count(emp_no)
count(emp_no):long

84

Timespan literals

日期时间间隔和时间跨度可以使用时间跨度文字来表示。 时间跨度文字是数字和限定符的组合。 支持这些限定符:

  • millisecond/milliseconds
  • second/seconds
  • minute/minutes
  • hour/hours
  • day/days
  • week/weeks
  • month/months
  • year/years

时间跨度文字对空格不敏感。 这些表达式都是有效的:

  • 1day
  • 1 day
  • 1 day

ES|QL 源命令

ES|QL 源命令会生成一个表,通常包含来自 Elasticsearch 的数据。

ES|QL 支持以下源命令:

  • FROM
  • ROW
  • SHOW <item>

FROM

FROM source 命令返回一个表,其中包含来自数据流、索引或别名的最多 10,000 个文档。 结果表中的每一行代表一个文档。 每列对应一个字段,并且可以通过该字段的名称进行访问。

FROM employees

你可以使用 date math 来引用索引、别名和数据流。 这对于时间序列数据很有用,例如访问今天的索引:

FROM <logs-{now/d}>

使用逗号分隔的列表或通配符查询多个数据流、索引或别名:

FROM employees-00001,other-employees-*

使用 METADATA 指令启用元数据字段:

FROM employees [METADATA _id]

ROW

ROW source 命令生成一行,其中包含一个或多个列,这些列具有你指定的值。 这对于测试很有用。

ROW a = 1, b = "two", c = null
a:integerb:keywordc:null

1

"two"

null

使用方括号创建多值列:

ROW a = [2, 1]

ROW 支持使用函数:

ROW a = ROUND(1.23, 0)

SHOW <item>

SHOW <item> source 命令返回有关部署及其功能的信息:

  • 使用 SHOW INFO 返回部署的版本、构建日期和哈希值。
  • 使用 SHOW FUNCTIONS 返回所有支持的函数的列表以及每个函数的概要。

ES|QL 处理命令

ES|QL 处理命令通过添加、删除或更改行和列来更改输入表。

ES|QL 支持这些处理命令:

  • DISSECT
  • DROP
  • ENRICH
  • EVAL
  • GROK
  • KEEP
  • LIMIT
  • MV_EXPAND
  • RENAME
  • SORT
  • STATS ... BY
  • WHERE

DISSECT

DISSECT 使你能够从字符串中提取结构化数据。 DISSECT 将字符串与基于分隔符的模式进行匹配,并将指定的键提取为列。

有关 dissect 模式的语法,请参阅 dissect processor 文档。

ROW a = "1953-01-23T12:15:00Z - some text - 127.0.0.1;"
| DISSECT a "%{Y}-%{M}-%{D}T%{h}:%{m}:%{s}Z - %{msg} - %{ip};"
| KEEP Y, M, D, h, m, s, msg, ip
Y:keywordM:keywordD:keywordh:keywordm:keywords:keywordmsg:keywordip:keyword

1953

01

23

12

15

00

DROP

使用 DROP 删除列:

FROM employees
| DROP height

你可以使用通配符删除名称与模式匹配的所有列,而不是按名称指定每个列:

FROM employees
| DROP height*


ENRICH

你可以使用 ENRICH 将现有索引中的数据添加到传入记录中。 它与 ingest enrich 类似,但它在查询时工作。

ROW language_code = "1"
| ENRICH languages_policy
language_code:keywordlanguage_name:keyword

1

English

ENRICH 需要执行 enrich policy。 丰富策略定义了一个匹配字段(关键字段)和一组丰富字段。

ENRICH 将根据匹配字段值在 enrich index 中查找记录。 输入数据集中的匹配键可以使用 ON <field-name> 定义; 如果未指定,则将在与 enrich policy 中定义的匹配字段同名的字段上执行匹配。

ROW a = "1"
| ENRICH languages_policy ON a
a:keywordlanguage_name:keyword

1

English

你可以使用 WITH <field1>, <field2>... 语法指定必须将哪些属性(在策略中定义为丰富字段的属性之间)添加到结果中。

ROW a = "1"
| ENRICH languages_policy ON a WITH language_name
a:keywordlanguage_name:keyword

1

English

还可以使用 WITH new_name=<field1> 重命名属性

ROW a = "1"
| ENRICH languages_policy ON a WITH name = language_name
a:keywordname:keyword

1

English

默认情况下(如果未定义 WITH),ENRICH 会将 enrich policy 中定义的所有丰富字段添加到结果中。

如果发生名称冲突,新创建的字段将覆盖现有字段。

EVAL

EVAL 使你能够附加新列:

FROM employees
| SORT emp_no
| KEEP first_name, last_name, height
| EVAL height_feet = height * 3.281, height_cm = height * 100
first_name:keywordlast_name:keywordheight:doubleheight_feet:doubleheight_cm:double

Georgi

Facello

2.03

6.66043

202.99999999999997

如果指定的列已存在,则现有列将被删除,新列将追加到表中:

FROM employees
| SORT emp_no
| KEEP first_name, last_name, height
| EVAL height = height * 3.281
first_name:keywordlast_name:keywordheight:double

Georgi

Facello

6.66043

Functions

EVAL 支持各种计算值的函数。 请参阅函数了解更多信息。

GROK

GROK 使你能够从字符串中提取结构化数据。 GROK 基于正则表达式将字符串与模式进行匹配,并将指定的模式提取为列。

有关 grok 模式的语法,请参阅 grok 处理器文档。

例如:

ROW a = "1953-01-23T12:15:00Z 127.0.0.1 some.email@foo.com 42"
| GROK a "%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num:int}"
| KEEP date, ip, email, num
date:keywordip:keywordemail:keywordnum:integer

1953-01-23T12:15:00Z

127.0.0.1

some.email@foo.com

42

KEEP

KEEP 命令使你能够指定返回哪些列以及返回它们的顺序。

要限制返回的列,请使用以逗号分隔的列名称列表。 列按指定顺序返回:

FROM employees
| KEEP emp_no, first_name, last_name, height
emp_no:integerfirst_name:keywordlast_name:keywordheight:double

10001

Georgi

Facello

2.03

10002

Bezalel

Simmel

2.08

10003

Parto

Bamford

1.83

10004

Chirstian

Koblick

1.78

10005

Kyoichi

Maliniak

2.05

你可以使用通配符返回名称与模式匹配的所有列,而不是按名称指定每个列:

FROM employees
| KEEP h*

星号通配符 (*) 本身会转换为与其他参数不匹配的所有列。 此查询将首先返回名称以 h 开头的所有列,然后是所有其他列:

FROM employees
| KEEP h*, *

LIMIT

LIMIT 处理命令使你能够限制行数:

FROM employees
| SORT emp_no ASC
| LIMIT 5

如果未指定,LIMIT 默认为 500。无论 LIMIT 值如何,单个查询都不会返回超过 10,000 行。

MV_EXPAND

MV_EXPAND 处理命令将多值(multivalued)字段扩展为每个值一行,并复制其他字段:

ROW a=[1,2,3], b="b", j=["a","b"]
| MV_EXPAND a
a:integerb:keywordj:keyword

1

b

["a", "b"]

2

b

["a", "b"]

3

b

["a", "b"]

RENAME

使用 RENAME 使用以下语法重命名列:

RENAME <old-name> AS <new-name>

例如:

FROM employees
| KEEP first_name, last_name, still_hired
| RENAME  still_hired AS employed

如果具有新名称的列已存在,它将被新列替换。

可以使用单个 RENAME 命令重命名多个列:

FROM employees
| KEEP first_name, last_name
| RENAME first_name AS fn, last_name AS ln

SORT

使用 SORT 命令对一个或多个字段上的行进行排序:

FROM employees
| KEEP first_name, last_name, height
| SORT height

默认排序顺序为升序。 使用 ASC 或 DESC 设置显式排序顺序:

FROM employees
| KEEP first_name, last_name, height
| SORT height DESC

具有相同排序键的两行被视为相等。 你可以提供额外的排序表达式来分裁定:

FROM employees
| KEEP first_name, last_name, height
| SORT height DESC, first_name ASC

null values

默认情况下,null 值被视为大于任何其他值。 对于升序排序,空值排在最后,而对于降序排序,空值排在最前面。 你可以通过提供 NULLS FIRST 或 NULLS LAST 来更改它:

FROM employees
| KEEP first_name, last_name, height
| SORT first_name ASC NULLS FIRST

STATS ... BY

使用 STATS ... BY 根据公共值对行进行分组,并计算分组行上的一个或多个聚合值。

FROM employees
| STATS count = COUNT(emp_no) BY languages
| SORT languages
count:longlanguages:integer

15

1

19

2

17

3

18

4

21

5

10

null

如果省略 BY,则输出表仅包含一行,并且聚合应用于整个数据集:

FROM employees
| STATS avg_lang = AVG(languages)
avg_lang:double

3.1222222222222222

可以计算多个值:

FROM employees
| STATS avg_lang = AVG(languages), max_lang = MAX(languages)

还可以按多个值进行分组(仅支持 long 字段和 keyword 族字段):

FROM employees
| EVAL hired = DATE_FORMAT("YYYY", hire_date)
| STATS avg_salary = AVG(salary) BY hired, languages.long
| EVAL avg_salary = ROUND(avg_salary)
| SORT hired, languages.long

支持以下聚合函数:

  • AVG
  • COUNT
  • COUNT_DISTINCT
  • MAX
  • MEDIAN
  • MEDIAN_ABSOLUTE_DEVIATION
  • MIN
  • PERCENTILE
  • SUM

WHERE

使用 WHERE 生成一个表,其中包含输入表中所提供的条件评估为 true 的所有行:

FROM employees
| KEEP first_name, last_name, still_hired
| WHERE still_hired == true

如果 still_hired 是布尔字段,则可以简化为:

FROM employees
| KEEP first_name, last_name, still_hired
| WHERE still_hired

运算符

有关支持的运算符的概述,请参阅上面的运算符部分。

函数

WHERE 支持各种计算值的函数。 请参阅函数了解更多信息。

FROM employees
| KEEP first_name, last_name, height
| WHERE length(first_name) < 4

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

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

相关文章

3D孪生场景搭建:3D漫游

上一篇 文章介绍了如何使用 NSDT 编辑器 制作模拟仿真应用场景&#xff0c;今天这篇文章将介绍如何使用NSDT 编辑器 设置3D漫游。 1、什么是3D漫游 3D漫游是指基于3D技术&#xff0c;将用户带入一个虚拟的三维环境中&#xff0c;通过交互式的手段&#xff0c;让用户可以自由地…

RK3568平台开发系列讲解(AI篇)车辆检测车道线识别可行驶区域分割 模型对比检测结果

&#x1f680;返回专栏总目录 文章目录 模型对比检测结果 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f4e2;在当今的自动驾驶领域&#xff0c;车辆检测、车道线识别&#xff0c;可行驶区域分割等任务起着至关重要的作用。车辆检测…

Labview 实战 99乘法表

基于新手小白&#xff0c;使用Labview实现99乘法表&#xff0c;敢于发表自己的一点方法&#xff0c;还请各位大侠放过&#xff01; 如下&#xff1a; 运行效果如下&#xff1a; 思路为&#xff1a;将要显示出来的数据&#xff0c;全部转换为字符串形式&#xff0c;再塞入到数组…

搭建在线python运行环境

常遇到需要一个小工具&#xff0c;比如生成作息时间表&#xff0c;今天就搭建一个可在线使用的python运行环境 当然也可以交给ChatGPT完成 1、安装canda wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2019.03-Linux-x86_64.shyum install -y bzi…

黑马点评-01基于Redis实现短信登陆的功能

环境准备 当前模型 nginx服务器的作用 手机或者app端向nginx服务器发起请求,nginx基于七层模型走的是HTTP协议,可以实现基于Lua直接绕开tomcat访问Redis nginx也可以作为静态资源服务器,轻松扛下上万并发并负载均衡到下游的tomcat服务器,利用集群支撑起整个项目 使用nginx部…

volatile使用方法

volatile使用方法 编译优化。使用等级3的话&#xff0c;可能将优化了一些变量。 这为什么会开启等第三呢&#xff1f;这是关于单片机的内存容量比较小&#xff0c;所以开启优化的话&#xff0c;可以可以省一些空间&#xff0c;但是如果。会出现些变量的问题&#xff0c;需要通过…

基于A4988/DRV8825的四路步进电机驱动器

概述 简化板的CNC sheild V3.0&#xff0c;仅保留步进电机速度与方向的控制引脚STEP/DIR、使能端EN、芯片供电VCC\GND&#xff0c;共计11个引脚。PCB四周开设四个M3通孔&#xff0c;以便于安装固定。此外&#xff0c;将板载的焊死的保险丝更改为可更换的保险座保险丝&#xff…

Linux系统之安装cook菜谱工具

Linux系统之安装cook菜谱工具 一、cook菜谱工具介绍二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查系统是否安装pnpm 四、部署Node.js环境4.1 下载Node.js安装包4.2 解压Node.js安装包4.3 复制二进制…

蓝桥杯每日一题2023.10.6

题目描述 门牌制作 - 蓝桥云课 (lanqiao.cn) 题目分析 #include<bits/stdc.h> using namespace std; int ans; int main() {for(int i 1; i < 2020; i ){int x i;while(x){int a x % 10;if(a 2)ans ;x / 10;}}cout << ans;return 0; } 题目描述 既约分数…

Python3操作Redis最新版|CRUD基本操作(保姆级)

Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 Python3数据科学包系列(三):数据分析实战 Win11查看安装的Python路…

数据结构P46(2-1~2-4)

2-1编写算法查找顺序表中值最小的结点&#xff0c;并删除该结点 #include <stdio.h> #include <stdlib.h> typedef int DataType; struct List {int Max;//最大元素 int n;//实际元素个数 DataType *elem;//首地址 }; typedef struct List*SeqList;//顺序表类型定…

一年一度的国庆节又结束了

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Iphone文件传到电脑用什么软件,看这里

在数字化时代&#xff0c;文件传输已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;苹果用户在将手机文件传输到电脑时&#xff0c;往往会面临一些困扰。曾经的“文件传输助手”并不能完全满足用户的需求。于是&#xff0c;很多人开始寻找更便捷的解决方案。在本文中…

MySQL概念

原理定义概念 定义 数据库(Database)是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库 数据库是长期储存在计算机内、有组织的、可共享的数据集合 分类&#xff1a; &#xff08;1&#xff09;非结构化数据&#xff1a; 数据相对来讲没有固定的特点&#…

充分理清限制与条件+构造二分图+最小割:ARC142E

https://www.luogu.com.cn/problem/AT_arc142_e 他的充要条件是是什么&#xff1a; a i , a j ≥ m i n ( b i , b j ) a_i,a_j\ge min(b_i,b_j) ai​,aj​≥min(bi​,bj​)存在 a i ≥ m a x ( b i , b j ) a_i\ge max(b_i,b_j) ai​≥max(bi​,bj​) 第一个条件直接预处理一…

【目标检测】——PE-YOLO精读

yolo&#xff0c;暗光目标检测 论文&#xff1a;PE-YOLO 1. 简介 卷积神经网络&#xff08;CNNs&#xff09;在近年来如何推动了物体检测的发展。许多检测器已经被提出&#xff0c;而且在许多基准数据集上的性能正在不断提高。然而&#xff0c;大多数现有的检测器都是在正常条…

初识jmeter及简单使用

目录 1、打开页面&#xff1a; 2、添加线程组&#xff1a; 3、线程组中设置参数&#xff1a; 4、添加请求 5、添加一个http请求后&#xff0c;设置请求内容 6、添加察看结果树 7、执行&#xff0c;查看结果 一般步骤是&#xff1a;在测试计划下面新建一个线程组&#xf…

【Java项目推荐之黑马头条】项目中的内容安全和自动审核如何实现的?

前言 在学习Java的路上还是遇到了很多不错的好项目的&#xff0c;今天分享给大家&#xff0c;希望能对大家面试有所帮助&#xff01; 后续会继续推荐其他好的项目&#xff0c;这次推荐的是B站开源的视频黑马头条项目&#xff0c;来吧学会它一起去虐面试官&#xff01;&#x…

mac清理垃圾的软件有哪些?这三款我最推荐

没错&#xff0c;Mac电脑真的好用&#xff0c;但是清理系统垃圾可不是件容易的事。由于Mac系统的封闭性&#xff0c;系统的缓存垃圾常常隐藏得让人发现不了。不过&#xff0c;别担心&#xff01;有一些专业的Mac清理软件可以帮你解决这一系列问题&#xff0c;让清理垃圾变得轻松…

【面试】C/C++面试八股

C/C面试八股 编译过程的四个阶段C和C语言的区别简单介绍一下三大特性多态的实现原理虚函数的构成原理虚函数的调用原理虚表指针在什么地方进行初始化的&#xff1f;构造函数为什么不能是虚函数为什么建议将析构函数设为虚函数虚函数和纯虚函数的区别抽象类类对象的对象模型内存…