Elasticsearch:ES|QL 函数及操作符

如果你对 ES|QL 还不是很熟悉的话,请阅读之前的文章 “Elasticsearch:ES|QL 查询语言简介​​​​​​​”。ES|QL 提供了一整套用于处理数据的函数和运算符。 功能分为以下几类:

目录

ES|QL 聚合函数

AVG

COUNT

COUNT_DISTINCT

计数为近似值

精度可配置

MAX

MEDIAN

MEDIAN_ABSOLUTE_DEVIATION

MIN

PERCENTILE

PERCENTILE(通常)是近似值

SUM

ES|QL 数学函数

ABS

ACOS

ASIN

ATAN

ATAN2

CEIL

COS

COSH

E

FLOOR

LOG10

PI

POW

类型规则

算术错误

分数指数

支持的输入和输出类型表

ROUND

SIN

SINH

SQRT

TAN

TANH

TAU

ES|QL 字符串函数

CONCAT

LEFT

LENGTH

LTRIM

REPLACE

RIGHT

RTRIM

SPLIT

SUBSTRING

TRIM

ES|QL 日期时间函数

AUTO_BUCKET

数字字段

DATE_EXTRACT

DATE_FORMAT

DATE_PARSE

DATE_TRUNC

NOW

ES|QL 类型转换函数

TO_BOOLEAN

TO_DATETIME

TO_DEGREES

TO_DOUBLE

TO_INTEGER

TO_IP

TO_LONG

TO_RADIANS

TO_STRING

TO_UNSIGNED_LONG

TO_VERSION

ES|QL 条件函数和表达式

CASE

COALESCE

GREATEST

LEAST

ES|QL 多值函数

MV_AVG

MV_CONCAT

MV_COUNT

MV_DEDUPE

MV_MAX

MV_MEDIAN

MV_MIN

MV_SUM

ES|QL 操作符

Binary operators

逻辑运算符

IS NULL 和 IS NOT NULL 谓词

CIDR_MATCH

ENDS_WITH

IN

IS_FINITE

IS_INFINITE

IS_NAN

LIKE

RLIKE

STARTS_WITH


ES|QL 聚合函数

STATS ... BY 函数支持以下聚合函数:

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

AVG

数值字段的平均值。

FROM employees
| STATS AVG(height)
AVG(height):double

1.7682

无论输入类型如何,结果始终是双精度值。

COUNT

计算字段值。

FROM employees
| STATS COUNT(height)
COUNT(height):long

100

可以采用任何字段类型作为输入,并且无论输入类型如何,结果总是 long 类型。

要计算行数,请使用 COUNT(*):

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

10

null

21

5

18

4

17

3

19

2

15

1

COUNT_DISTINCT

独特值的近似数量。

FROM hosts
| STATS COUNT_DISTINCT(ip0), COUNT_DISTINCT(ip1)
COUNT_DISTINCT(ip0):longCOUNT_DISTINCT(ip1):long

7

8

可以采用任何字段类型作为输入,并且无论输入类型如何,结果总是 long 类型。

计数为近似值

计算精确计数需要将值加载到集合中并返回其大小。 当处理高基数集和/或大的数据集时,这不会扩展,因为所需的内存使用量以及在节点之间通信这些每个分片集的需要将利用集群的太多资源。

此 COUNT_DISTINCT 函数基于 HyperLogLog++ 算法,该算法基于具有一些有趣属性的值的哈希值进行计数:

  • 可配置的精度,决定如何用内存换取准确性,
  • 在低基数集上具有出色的准确性,
  • 固定内存使用:无论有数百个还是数十亿个唯一值,内存使用仅取决于配置的精度。

对于 c 的精度阈值,我们使用的实现需要大约 c * 8 字节。

下图显示了阈值前后误差的变化情况:

对于所有 3 个阈值,计数均准确至配置的阈值。 尽管不能保证,但情况很可能如此。 实践中的准确性取决于所讨论的数据集。 一般来说,大多数数据集都显示出一致的良好准确性。 另请注意,即使阈值低至 100,即使计算数百万个项目,误差仍然非常低(如上图所示,为 1-6%)。

HyperLogLog++ 算法取决于哈希值的前导零,数据集中哈希值的精确分布会影响基数的准确性。

精度可配置

COUNT_DISTINCT 函数采用可选的第二个参数来配置前面讨论的精度。

FROM hosts
| STATS COUNT_DISTINCT(ip0, 80000), COUNT_DISTINCT(ip1, 5)
COUNT_DISTINCT(ip0,80000):longCOUNT_DISTINCT(ip1,5):long

7

9

MAX

数字字段的最大值。

FROM employees
| STATS MAX(languages)
MAX(languages):integer

5

MEDIAN

大于所有值一半且小于所有值一半的值,也称为 50% PERCENTILE。

FROM employees
| STATS MEDIAN(salary), PERCENTILE(salary, 50)
MEDIAN(salary):doublePERCENTILE(salary,50):double

47003

47003

注意:与  PERCENTILE 一样,MEDIAN 通常是近似值。

警告:MEDIAN 也是不确定的(non-deterministic)。 这意味着使用相同的数据可能会得到略有不同的结果。

MEDIAN_ABSOLUTE_DEVIATION

Median 绝对偏差,变异性的测量。 它是一个稳健的统计数据,这意味着它对于描述可能具有异常值或可能不呈正态分布的数据很有用。 对于此类数据,它比标准差更具描述性。

它的计算方法是每个数据点与整个样本中值的偏差的中值。 即,对于随机变量 X,中值绝对偏差为 median(|median(X) - Xi|)。

FROM employees
| STATS MEDIAN(salary), MEDIAN_ABSOLUTE_DEVIATION(salary)
MEDIAN(salary):doubleMEDIAN_ABSOLUTE_DEVIATION(salary):double

47003

10096.5

注意:与 PERCENTILE 一样,MEDIAN_ABSOLUTE_DEVIATION 通常是近似值。

警告:MEDIAN_ABSOLUTE_DEVIATION 也是不确定的(non-disterministic)。 这意味着使用相同的数据可能会得到略有不同的结果。

MIN

数值字段的最小值。

FROM employees
| STATS MIN(languages)
MIN(languages):integer

1

PERCENTILE

观察值出现一定百分比时的值。 例如,第 95 个百分位数是大于观测值 95% 的值,第 50 个百分位数是中位数 (MEDIAN)。

FROM employees
| STATS p0 = PERCENTILE(salary,  0)
     , p50 = PERCENTILE(salary, 50)
     , p99 = PERCENTILE(salary, 99)
p0:doublep50:doublep99:double

25324

47003

74970.29

PERCENTILE(通常)是近似值

有许多不同的算法来计算百分位数。 简单的实现只是将所有值存储在排序数组中。 要查找第 50 个百分位数,只需查找 my_array[count(my_array) * 0.5] 处的值即可。

显然,简单的实现不会扩展 —— 排序数组随着数据集中值的数量线性增长。 为了计算 Elasticsearch 集群中可能数十亿个值的百分位数,需要计算近似百分位数。

百分位数度量使用的算法称为 TDigest(由 Ted Dunning 在使用 T-Digests 计算准确分位数中介绍)。

使用此指标时,需要牢记一些准则:

  • 准确度与 q(1-q) 成正比。 这意味着极端百分位数(例如 99%)比不太极端的百分位数(例如中位数)更准确
  • 对于较小的值集,百分位数非常准确(如果数据足够小,则可能 100% 准确)。
  • 随着桶中值数量的增加,算法开始近似百分位数。 它实际上是用准确性来换取内存节省。 准确的不准确程度很难概括,因为它取决于你的数据分布和聚合的数据量

下图显示了均匀分布的相对误差,具体取决于收集值的数量和请求的百分位数:

它显示了极端百分位数的精度如何更好。 对于大量值,误差会减小的原因是大数定律使值的分布越来越均匀,并且 t-digest 树可以更好地进行汇总。 如果分布更加倾斜,情况就不会如此。

警告:PERCENTILE 也是不确定的(non-deterministic)。 这意味着使用相同的数据可能会得到略有不同的结果。

SUM

数字字段的总和。

FROM employees
| STATS SUM(languages)
SUM(languages):long

281

ES|QL 数学函数

ES|QL 支持这些数学函数:

  • ABS
  • ACOS
  • ASIN
  • ATAN
  • ATAN2
  • CEIL
  • COS
  • COSH
  • E
  • FLOOR
  • LOG10
  • PI
  • POW
  • ROUND
  • SIN
  • SINH
  • SQRT
  • TAN
  • TANH
  • TAU

ABS

返回绝对值。

FROM employees
| KEEP first_name, last_name, height
| EVAL abs_height = ABS(0.0 - height)

支持的类型:

nresult

double

double

integer

integer

long

long

unsigned_long

unsigned_long

ACOS

语法

参数

n: 数字表达。 如果为 null,则该函数返回 null。

描述

角度形式返回 n 的反余弦,以弧度表示。

支持的类型

nresult

double

double

integer

double

long

double

unsigned_long

double

例子

ROW a=.9
| EVAL acos=ACOS(a)

a:double	acos:double
.9

0.45102681179626236

ASIN

反正弦三角函数。

ROW a=.9
| EVAL asin=ASIN(a)
a:doubleasin:double

.9

1.1197695149986342

支持的类型

nresult

double

double

integer

double

long

double

unsigned_long

double

ATAN

反正切三角函数。

ROW a=12.9
| EVAL atan=ATAN(a)
a:doubleatan:double

12.9

1.4934316673669235

支持的类型

nresult

double

double

integer

double

long

double

unsigned_long

double

ATAN2

笛卡尔平面中正 x 轴与从原点到点 (x , y) 的射线之间的角度。

ROW y=12.9, x=.6
| EVAL atan2=ATAN2(y, x)
y:doublex:doubleatan2:double

12.9

0.6

1.5243181954438936

支持的类型

yxresult

double

double

double

double

integer

double

double

long

double

double

unsigned_long

double

integer

double

double

integer

integer

double

integer

long

double

integer

unsigned_long

double

long

double

double

long

integer

double

long

long

double

long

unsigned_long

double

unsigned_long

double

double

unsigned_long

integer

double

unsigned_long

long

double

unsigned_long

unsigned_long

double

CEIL

将数字向上舍入到最接近的整数。

ROW a=1.8
| EVAL a=CEIL(a)
a:double

2

支持的类型

nresult

double

double

integer

integer

long

long

unsigned_long

unsigned_long

COS

余弦三角函数。

ROW a=1.8
| EVAL cos=COS(a)
a:doublecos:double

1.8

-0.2272020946930871

支持的类型

nresult

double

double

integer

double

long

double

unsigned_long

double

COSH

余弦双曲函数。

ROW a=1.8
| EVAL cosh=COSH(a)
a:doublecosh:double

1.8

3.1074731763172667

支持的类型

nresult

double

double

integer

double

long

double

unsigned_long

double

E

欧拉数。

ROW E()
E():double

2.718281828459045

FLOOR

将数字向下舍入到最接近的整数。

ROW a=1.8
| EVAL a=FLOOR(a)
a:double

1

注意:这是长整型(包括无符号)和整数的 noop (no operation, 不做任何处理)。 对于双精度,这会选择最接近双精度值的整数(Math.floor)。

支持的类型

nresult

double

double

integer

integer

long

long

unsigned_long

unsigned_long

LOG10

返回以 10 为底的对数。输入可以是任何数值,返回值始终是双精度型。

负数的对数为 NaN。 无穷大的对数是无穷大的,就像 0 的对数一样。

ROW d = 1000.0
| EVAL s = LOG10(d)
d: doubles:double

1000.0

3.0

支持的类型

nresult

double

double

integer

double

long

double

unsigned_long

double

PI

圆的周长与其直径的比率。

ROW PI()
PI():double

3.141592653589793

POW

返回基数(第一个参数)的指数(第二个参数)次方的值。 两个参数都必须是数字。

ROW base = 2.0, exponent = 2
| EVAL result = POW(base, exponent)
base:doubleexponent:integerresult:double

2.0

2

4.0

类型规则

返回值的类型由底数和指数的类型决定。 应用以下规则来确定结果类型:

  • 如果基数或指数中有一个是浮点类型,则结果将为 double
  • 否则,如果基数或指数是 64 位(长整型或无符号长整型),则结果将为 long
  • 否则,结果将是一个 32 位整数(这涵盖所有其他数字类型,包括 int、short 和 byte)

例如,使用简单整数作为参数将产生整数结果:

ROW base = 2, exponent = 2
| EVAL s = POW(base, exponent)
base:integerexponent:integers:integer

2

2

4

注意:对于所有情况,实际 pow 函数均使用双精度值执行。 这意味着,对于非常大的非浮点值,该操作导致结果与预期略有不同的可能性很小。 然而,非常大的非浮点值更可能的结果是数值溢出。

算术错误

算术错误和数字溢出不会导致错误。 相反,结果将为 null,并添加 ArithmeticException 警告。 例如:

ROW x = POW(9223372036854775808, 2)
warning:Line 1:9: evaluation of [POW(9223372036854775808, 2)] failed, treating result as null. Only first 20 failures recorded.

warning:Line 1:9: java.lang.ArithmeticException: long overflow

x:long

null

如果需要防止数字溢出,请在任一参数上使用 TO_DOUBLE:

ROW x = POW(9223372036854775808, TO_DOUBLE(1))
x:double

9.223372036854776E18

分数指数

指数可以是分数,这类似于求根。 例如,0.5 的指数将给出底数的平方根:

ROW base = 4, exponent = 0.5
| EVAL s = POW(base, exponent)
base:integerexponent:doubles:double

4

0.5

2.0

支持的输入和输出类型表

为了清楚起见,下表描述了所有数字输入类型组合的输出结果类型:

baseexponentresult

double

double

double

double

integer

double

integer

double

double

integer

integer

integer

long

double

double

long

integer

long

ROUND

将数字四舍五入为最接近指定位数的数字。 如果未提供位数,则默认为 0 位。 如果指定的位数为负数,则四舍五入到小数点左边的位数。

FROM employees
| KEEP first_name, last_name, height
| EVAL height_ft = ROUND(height * 3.281, 1)
first_name:keywordlast_name:keywordheight:doubleheight_ft:double

Arumugam

Ossenbruggen

2.1

6.9

Kwee

Schusler

2.1

6.9

Saniya

Kalloufi

2.1

6.9

SIN

正弦三角函数。

ROW a=1.8
| EVAL sin=SIN(a)
a:doublesin:double

1.8

0.9738476308781951

支持的类型

nresult

double

double

integer

double

long

double

unsigned_long

double

SINH

正弦双曲函数。

ROW a=1.8
| EVAL sinh=SINH(a)
a:doublesinh:double

1.8

2.94217428809568

支持的类型

nresult

double

double

integer

double

long

double

unsigned_long

double

SQRT

返回数字的平方根。 输入可以是任何数值,返回值始终是双精度值。

负数的平方根为 NaN。 无穷大的平方根是无穷大。

ROW d = 100.0
| EVAL s = SQRT(d)
d: doubles:double

100.0

10.0

支持的类型

nresult

double

double

integer

double

long

double

unsigned_long

double

TAN

正切三角函数。

ROW a=1.8
| EVAL tan=TAN(a)
a:doubletan:double

1.8

-4.286261674628062

支持的类型

nresult

double

double

integer

double

long

double

unsigned_long

double

TANH

正切双曲函数。

ROW a=1.8
| EVAL tanh=TANH(a)
a:doubletanh:double

1.8

0.9468060128462683

支持的类型

nresult

double

double

integer

double

long

double

unsigned_long

double

TAU

圆的周长与其半径之比。

ROW TAU()
TAU():double

6.283185307179586

ES|QL 字符串函数

ES|QL 支持以下字符串函数:

  • CONCAT
  • LEFT
  • LENGTH
  • LTRIM
  • REPLACE
  • RIGHT
  • RTRIM
  • SPLIT
  • SUBSTRING
  • TRIM

CONCAT

连接两个或多个字符串。

FROM employees
| KEEP first_name, last_name, height
| EVAL fullname = CONCAT(first_name, " ", last_name)

LEFT

返回从字符串左侧开始提取长度字符的子字符串。

FROM employees
| KEEP last_name
| EVAL left = LEFT(last_name, 3)
| SORT last_name ASC
| LIMIT 5
last_name:keywordleft:keyword

Awdeh

Awd

Azuma

Azu

Baek

Bae

Bamford

Bam

Bernatsky

Ber

支持的类型

stringlengthresult

keyword

integer

keyword

LENGTH

返回字符串的字符长度。

FROM employees
| KEEP first_name, last_name, height
| EVAL fn_length = LENGTH(first_name)

LTRIM

从字符串中删除前导空格。

ROW message = "   some text  ",  color = " red "
| EVAL message = LTRIM(message)
| EVAL color = LTRIM(color)
| EVAL message = CONCAT("'", message, "'")
| EVAL color = CONCAT("'", color, "'")
message:keywordcolor:keyword

'some text '

'red '

REPLACE

该函数将字符串(第一个参数)中正则表达式(第二个参数)的任何匹配项替换为替换字符串(第三个参数)。

如果任何参数为 NULL,则结果为 NULL。

此示例将出现的单词 “World” 替换为单词 “Universe”:

ROW str = "Hello World"
| EVAL str = REPLACE(str, "World", "Universe")
| KEEP str
str:keyword

Hello Universe

返回从右侧开始的字符串中提取 length 字符的子字符串。

FROM employees
| KEEP last_name
| EVAL right = RIGHT(last_name, 3)
| SORT last_name ASC
| LIMIT 5
last_name:keywordright:keyword

Awdeh

deh

Azuma

uma

Baek

aek

Bamford

ord

Bernatsky

sky

支持的类型:

stringlengthresult

keyword

integer

keyword

RTRIM

删除字符串中的尾随空格。

ROW message = "   some text  ",  color = " red "
| EVAL message = RTRIM(message)
| EVAL color = RTRIM(color)
| EVAL message = CONCAT("'", message, "'")
| EVAL color = CONCAT("'", color, "'")
message:keywordcolor:keyword

' some text'

' red'

SPLIT

将单个值字符串拆分为多个字符串。 例如:

ROW words="foo;bar;baz;qux;quux;corge"
| EVAL word = SPLIT(words, ";")

将 “foo;bar;baz;qux;quux;corge” 以 ; 进行分割, 并返回一个数组:

words:keywordword:keyword

foo;bar;baz;qux;quux;corge

[foo,bar,baz,qux,quux,corge]

警告:目前仅支持单字节分隔符。

SUBSTRING

返回字符串的子字符串,由起始位置和可选长度指定。 此示例返回每个姓氏的前三个字符:

FROM employees
| KEEP last_name
| EVAL ln_sub = SUBSTRING(last_name, 1, 3)
last_name:keywordln_sub:keyword

Awdeh

Awd

Azuma

Azu

Baek

Bae

Bamford

Bam

Bernatsky

Ber

负的起始位置被解释为相对于字符串的结尾。 此示例返回每个姓氏的最后三个字符:

FROM employees
| KEEP last_name
| EVAL ln_sub = SUBSTRING(last_name, -3, 3)
last_name:keywordln_sub:keyword

Awdeh

deh

Azuma

uma

Baek

aek

Bamford

ord

Bernatsky

sky

如果省略 length,则 substring 返回字符串的剩余部分。 此示例返回除第一个字符之外的所有字符:

FROM employees
| KEEP last_name
| EVAL ln_sub = SUBSTRING(last_name, 2)
last_name:keywordln_sub:keyword

Awdeh

wdeh

Azuma

zuma

Baek

aek

Bamford

amford

Bernatsky

ernatsky

TRIM

从字符串中删除前导和尾随空格。

ROW message = "   some text  ",  color = " red "
| EVAL message = TRIM(message)
| EVAL color = TRIM(color)
message:scolor:s

some text

red

支持的类型

arg1result

keyword

keyword

text

text

ES|QL 日期时间函数

ES|QL 支持以下日期时间函数:

  • AUTO_BUCKET
  • DATE_EXTRACT
  • DATE_FORMAT
  • DATE_PARSE
  • DATE_TRUNC
  • NOW

AUTO_BUCKET

创建人性化的桶并为每行返回与该行所属的结果桶相对应的日期时间值。 将 AUTO_BUCKET 与 STATS ... BY 结合起来创建日期直方图。

你提供目标桶数量、开始日期和结束日期,它会选择适当的桶大小来生成目标数量或更少的桶。 例如,这要求全年最多 20 个桶,其中选择每月桶:

ROW date=TO_DATETIME("1985-07-09T00:00:00.000Z")
| EVAL bucket=AUTO_BUCKET(date, 20, "1985-01-01T00:00:00Z", "1986-01-01T00:00:00Z")
date:datetimebucket:datetime

1985-07-09T00:00:00.000Z

1985-07-01T00:00:00.000Z

我们的目标不是提供准确的目标桶数,而是选择一个人们感到满意的范围,最多提供目标桶数。

如果你要求更多的存储桶,那么 AUTO_BUCKET 可以选择较小的范围。 例如,一年内最多请求 100 个桶将为你提供一周的桶:

ROW date=TO_DATETIME("1985-07-09T00:00:00.000Z")
| EVAL bucket=AUTO_BUCKET(date, 100, "1985-01-01T00:00:00Z", "1986-01-01T00:00:00Z")
date:datetimebucket:datetime

1985-07-09T00:00:00.000Z

1985-07-08T00:00:00.000Z

AUTO_BUCKET 不过滤任何行。 它仅使用提供的时间范围来选择合适的桶大小。 对于日期超出范围的行,它返回与范围之外的存储桶对应的日期时间。 将 AUTO_BUCKET 与 WHERE 结合起来以过滤行。

更完整的示例可能如下所示:

FROM employees
| WHERE hire_date >= "1985-01-01T00:00:00Z" AND hire_date < "1986-01-01T00:00:00Z"
| EVAL bucket = AUTO_BUCKET(hire_date, 20, "1985-01-01T00:00:00Z", "1986-01-01T00:00:00Z")
| STATS AVG(salary) BY bucket
| SORT bucket
AVG(salary):doublebucket:date

46305.0

1985-02-01T00:00:00.000Z

44817.0

1985-05-01T00:00:00.000Z

62405.0

1985-07-01T00:00:00.000Z

49095.0

1985-09-01T00:00:00.000Z

51532.0

1985-10-01T00:00:00.000Z

54539.75

1985-11-01T00:00:00.000Z

注意:AUTO_BUCKET 不会创建与任何文档都不匹配的存储桶。 这就是上面的示例缺少 1985-03-01 和其他日期的原因。

数字字段

auto_bucket 还可以对数字字段进行操作,如下所示:

FROM employees
| WHERE hire_date >= "1985-01-01T00:00:00Z" AND hire_date < "1986-01-01T00:00:00Z"
| EVAL bs = AUTO_BUCKET(salary, 20, 25324, 74999)
| SORT hire_date, salary
| KEEP hire_date, salary, bs
hire_date:datesalary:integerbs:double

1985-02-18T00:00:00.000Z

66174

65000.0

1985-02-24T00:00:00.000Z

26436

25000.0

1985-05-13T00:00:00.000Z

44817

40000.0

1985-07-09T00:00:00.000Z

62405

60000.0

1985-09-17T00:00:00.000Z

49095

45000.0

1985-10-14T00:00:00.000Z

54329

50000.0

1985-10-20T00:00:00.000Z

48735

45000.0

1985-11-19T00:00:00.000Z

52833

50000.0

1985-11-20T00:00:00.000Z

33956

30000.0

1985-11-20T00:00:00.000Z

74999

70000.0

1985-11-21T00:00:00.000Z

56371

55000.0

与上面的示例不同,你有意在日期范围上进行过滤,你很少想在数字范围上进行过滤。 所以你必须分别找到最小值和最大值。 我们还没有一种简单的方法来自动做到这一点。 改进即将到来!

DATE_EXTRACT

提取日期的部分内容,例如年、月、日、小时。 支持的字段类型是 java.time.temporal.ChronoField 提供的字段类型。

ROW date = DATE_PARSE("yyyy-MM-dd", "2022-05-06")
| EVAL year = DATE_EXTRACT("year", date)
date:dateyear:long

2022-05-06T00:00:00.000Z

2022

DATE_FORMAT

以提供的格式返回日期的字符串表示形式。 如果未指定格式,则使用 yyyy-MM-dd'T'HH:mm:ss.SSSZ 格式。

FROM employees
| KEEP first_name, last_name, hire_date
| EVAL hired = DATE_FORMAT("YYYY-MM-dd", hire_date)

DATE_PARSE

语法

DATE_PARSE([format,] date_string)

参数

format日期格式。 有关语法,请参阅 DateTimeFormatter 文档。 如果为 null,则该函数返回 null。
date_string作为字符串的日期表达式。 如果为 null 或空字符串,则该函数返回 null。

描述

通过使用第一个参数中指定的格式解析第二个参数来返回日期。

ROW date_string = "2022-05-06"
| EVAL date = DATE_PARSE("yyyy-MM-dd", date_string)
date_string:keyworddate:date

2022-05-06

2022-05-06T00:00:00.000Z

DATE_TRUNC

将日期向下舍入到最接近的间隔。 间隔可以使用时间跨度文字语法来表达。

FROM employees
| EVAL year_hired = DATE_TRUNC(1 year, hire_date)
| STATS COUNT(emp_no) BY year_hired
| SORT year_hired
ROW date_string = "2022-05-06"
| EVAL date = DATE_PARSE("yyyy-MM-dd", date_string)
| EVAL year_hired = DATE_TRUNC(1 year, date)
| keep date, year_hired

NOW

返回当前日期和时间。

ROW current_date = NOW()

ES|QL 类型转换函数

ES|QL 支持以下类型转换函数:

  • TO_BOOLEAN
  • TO_DATETIME
  • TO_DEGREES
  • TO_DOUBLE
  • TO_INTEGER
  • TO_IP
  • TO_LONG
  • TO_RADIANS
  • TO_STRING
  • TO_UNSIGNED_LONG
  • TO_VERSION

TO_BOOLEAN

将输入值转换为布尔值。

输入可以是单值或多值字段或表达式。 输入类型必须是字符串或数字类型。

字符串值 “true” 将不区分大小写地转换为布尔值 true。 对于其他任何内容,包括空字符串,该函数将返回 false。 例如:

ROW str = ["true", "TRuE", "false", "", "yes", "1"]
| EVAL bool = TO_BOOLEAN(str)
str:keywordbool:boolean

["true", "TRuE", "false", "", "yes", "1"]

[true, true, false, false, false, false]

数值 0 将转换为 false,其他值将转换为 true。

别名:TO_BOOL

TO_DATETIME

将输入值转换为日期值。

输入可以是单值或多值字段或表达式。 输入类型必须是字符串或数字类型。

仅当字符串遵循 yyyy-MM-dd'T'HH:mm:ss.SSS'Z' 格式时才会成功转换(要转换其他格式的日期,请使用 DATE_PARSE)。 例如:

ROW string = ["1953-09-02T00:00:00.000Z", "1964-06-02T00:00:00.000Z", "1964-06-02 00:00:00"]
| EVAL datetime = TO_DATETIME(string)
string:keyworddatetime:date

["1953-09-02T00:00:00.000Z", "1964-06-02T00:00:00.000Z", "1964-06-02 00:00:00"]

[1953-09-02T00:00:00.000Z, 1964-06-02T00:00:00.000Z]

请注意,在此示例中,源多值字段中的最后一个值尚未转换。 原因是,如果不遵守日期格式,转换将导致空值。 发生这种情况时,警告标头将添加到响应中。 标头将提供有关失败来源的信息:

"Line 1:112: evaluation of [TO_DATETIME(string)] failed, treating result as null. Only first 20 failures recorded."

以下标头将包含失败原因和违规值:

"java.lang.IllegalArgumentException: failed to parse date field [1964-06-02 00:00:00] with format [yyyy-MM-dd'T'HH:mm:ss.SSS'Z']"

如果输入参数是数字类型,则其值将被解释为自 Unix 纪元以来的毫秒数。 例如:

ROW int = [0, 1]
| EVAL dt = TO_DATETIME(int)
int:integerdt:date

[0, 1]

[1970-01-01T00:00:00.000Z, 1970-01-01T00:00:00.001Z]

别名:TO_DT

TO_DEGREES

将弧度数转换为度数。

输入可以是单值或多值字段或表达式。 输入类型必须是数字类型,并且结果始终为 double。

例子:

ROW rad = [1.57, 3.14, 4.71]
| EVAL deg = TO_DEGREES(rad)
rad:doubledeg:double

[1.57, 3.14, 4.71]

[89.95437383553924, 179.9087476710785, 269.86312150661774]

TO_DOUBLE

将输入值转换为双精度值。

输入可以是单值或多值字段或表达式。 输入类型必须是布尔型、日期型、字符串型或数字型。

例子:

ROW str1 = "5.20128E11", str2 = "foo"
| EVAL dbl = TO_DOUBLE("520128000000"), dbl1 = TO_DOUBLE(str1), dbl2 = TO_DOUBLE(str2)
str1:keywordstr2:keyworddbl:doubledbl1:doubledbl2:double

5.20128E11

foo

5.20128E11

5.20128E11

null

请注意,在此示例中,不可能对字符串进行最后一次转换。 发生这种情况时,结果为空值。 在这种情况下,警告标头将添加到响应中。 标头将提供有关失败来源的信息:

"Line 1:115: evaluation of [TO_DOUBLE(str2)] failed, treating result as null. Only first 20 failures recorded."

以下标头将包含失败原因和违规值:

"java.lang.NumberFormatException: For input string: \"foo\""

如果输入参数是日期类型,则其值将被解释为自 Unix 纪元以来的毫秒数,并转换为双精度。

布尔值 true 将转换为 double 1.0, false 则转换为 0.0。

别名:TO_DBL

TO_INTEGER

将输入值转换为整数值。

输入可以是单值或多值字段或表达式。 输入类型必须是布尔型、日期型、字符串型或数字型。

例子:

ROW long = [5013792, 2147483647, 501379200000]
| EVAL int = TO_INTEGER(long)
long:longint:integer

[5013792, 2147483647, 501379200000]

[5013792, 2147483647]

请注意,在此示例中,多值字段的最后一个值无法转换为整数。 发生这种情况时,结果为空值。 在这种情况下,警告标头将添加到响应中。 标头将提供有关失败来源的信息:

"Line 1:61: evaluation of [TO_INTEGER(long)] failed, treating result as null. Only first 20 failures recorded."

以下标头将包含失败原因和违规值:

"org.elasticsearch.xpack.ql.QlIllegalArgumentException: [501379200000] out of [integer] range"

如果输入参数是日期类型,则其值将被解释为自 Unix 纪元以来的毫秒数,并转换为整数。

布尔值 true 将转换为整数 1, false 将转换为 0。

别名:TO_INT

TO_IP

将输入字符串转换为 IP 值。

输入可以是单值或多值字段或表达式。

例子:

ROW str1 = "1.1.1.1", str2 = "foo"
| EVAL ip1 = TO_IP(str1), ip2 = TO_IP(str2)
| WHERE CIDR_MATCH(ip1, "1.0.0.0/8")
str1:keywordstr2:keywordip1:ipip2:ip

1.1.1.1

foo

1.1.1.1

null

请注意,在上面的示例中,字符串的最后一次转换是不可能的。 发生这种情况时,结果为空值。 在这种情况下,警告标头将添加到响应中。 标头将提供有关失败来源的信息:

"Line 1:68: evaluation of [TO_IP(str2)] failed, treating result as null. Only first 20 failures recorded."

以下标头将包含失败原因和违规值:

"java.lang.IllegalArgumentException: 'foo' is not an IP string literal."

TO_LONG

将输入值转换为长整型值。

输入可以是单值或多值字段或表达式。 输入类型必须是布尔型、日期型、字符串型或数字型。

例子:

ROW str1 = "2147483648", str2 = "2147483648.2", str3 = "foo"
| EVAL long1 = TO_LONG(str1), long2 = TO_LONG(str2), long3 = TO_LONG(str3)
str1:keywordstr2:keywordstr3:keywordlong1:longlong2:longlong3:long

2147483648

2147483648.2

foo

2147483648

2147483648

null

请注意,在此示例中,不可能对字符串进行最后一次转换。 发生这种情况时,结果为空值。 在这种情况下,警告标头将添加到响应中。 标头将提供有关失败来源的信息:

"Line 1:113: evaluation of [TO_LONG(str3)] failed, treating result as null. Only first 20 failures recorded."

以下标头将包含失败原因和违规值:

"java.lang.NumberFormatException: For input string: \"foo\""

如果输入参数是日期类型,则其值将被解释为自 Unix 纪元以来的毫秒数,并转换为 long。

布尔值 true 将转换为 long 1, false 将转换为 0。

TO_RADIANS

将度数转换为弧度。

输入可以是单值或多值字段或表达式。 输入类型必须是数字类型,并且结果始终为 double。

例子:

ROW deg = [90.0, 180.0, 270.0]
| EVAL rad = TO_RADIANS(deg)
deg:doublerad:double

[90.0, 180.0, 270.0]

[1.5707963267948966, 3.141592653589793, 4.71238898038469]

TO_STRING

将字段转换为字符串。 例如:

ROW a=10
| EVAL j = TO_STRING(a)
a:integerj:keyword

10

"10"

它也适用于多值字段:

ROW a=[10, 9, 8]
| EVAL j = TO_STRING(a)
a:integerj:keyword

[10, 9, 8]

["10", "9", "8"]

别名:TO_STR

支持的类型:

vresult

boolean

keyword

datetime

keyword

double

keyword

integer

keyword

ip

keyword

keyword

keyword

long

keyword

text

keyword

unsigned_long

keyword

version

keyword

TO_UNSIGNED_LONG

将输入值转换为无符号长整型值。

输入可以是单值或多值字段或表达式。 输入类型必须是布尔型、日期型、字符串型或数字型。

例子:

ROW str1 = "2147483648", str2 = "2147483648.2", str3 = "foo"
| EVAL long1 = TO_UNSIGNED_LONG(str1), long2 = TO_ULONG(str2), long3 = TO_UL(str3)
str1:keywordstr2:keywordstr3:keywordlong1:unsigned_longlong2:unsigned_longlong3:unsigned_long

2147483648

2147483648.2

foo

2147483648

2147483648

null

请注意,在此示例中,不可能对字符串进行最后一次转换。 发生这种情况时,结果为空值。 在这种情况下,警告标头将添加到响应中。 标头将提供有关失败来源的信息:

"Line 1:133: evaluation of [TO_UL(str3)] failed, treating result as null. Only first 20 failures recorded."

以下标头将包含失败原因和违规值:

"java.lang.NumberFormatException: Character f is neither a decimal digit number, decimal point, nor \"e\" notation exponential mark."

如果输入参数是日期类型,则其值将被解释为自 Unix 纪元以来的毫秒数,并转换为 unsigned long。

Boolean true 将转换为 unsigned long 1, false 则转换为 0。

别名:TO_ULONG、TO_UL

TO_VERSION

将输入字符串转换为版本值。 例如:

ROW v = TO_VERSION("1.2.3")
v:version

1.2.3

输入可以是单值或多值字段或表达式。

别名:TO_VER

支持的类型:

vresult

keyword

version

text

version

version

version

ES|QL 条件函数和表达式

条件函数通过以 if-else 方式求值来返回其参数之一。 ES|QL 支持这些条件函数:

  • CASE
  • COALESCE
  • GREATEST
  • LEAST

CASE

语法:

CASE(condition1, value1[, ..., conditionN, valueN][, default_value])

参数

conditionX一个条件
valueX当相应条件第一个评估为 true 时返回的值。
default_value没有条件匹配时返回的默认值。

描述

接受条件和值对。 该函数返回属于第一个值为 true 的条件的值。

如果参数数量为奇数,则最后一个参数为默认值,当没有条件匹配时返回该默认值。

FROM employees
| EVAL type = CASE(
    languages <= 1, "monolingual",
    languages <= 2, "bilingual",
     "polyglot")
| KEEP emp_no, languages, type
emp_no:integerlanguages:integertype:keyword

10001

2

bilingual

10002

5

polyglot

10003

4

polyglot

10004

5

polyglot

10005

1

monolingual

COALESCE

返回第一个非空值。

ROW a=null, b="b"
| EVAL COALESCE(a, b)
a:nullb:keywordCOALESCE(a,b):keyword

null

b

b

GREATEST

返回许多列中的最大值。 这与 MV_MAX 类似,只是它旨在一次在多个列上运行。

ROW a = 10, b = 20
| EVAL g = GREATEST(a, b)
a:integerb:integerg:integer

10

20

20

注意:当在 keyword 或 text 字段上运行时,这将按字母顺序返回最后一个字符串。 当在布尔列上运行时,如果任何值为 true,则返回 true。

支持的类型

firstrestresult

boolean

boolean

boolean

double

double

double

integer

integer

integer

ip

ip

ip

keyword

keyword

keyword

long

long

long

text

text

text

version

version

version

LEAST

返回许多列中的最小值。 这与 MV_MIN 类似,只是它旨在一次在多个列上运行。

ROW a = 10, b = 20
| EVAL l = LEAST(a, b)
a:integerb:integerl:integer

10

20

10

注意:当在 keyword 或 text 字段上运行时,这将按字母顺序返回第一个字符串。 当在布尔列上运行时,如果任何值为 false,则返回 false。

支持的类型

firstrestresult

boolean

boolean

boolean

double

double

double

integer

integer

integer

ip

ip

ip

keyword

keyword

keyword

long

long

long

text

text

text

version

version

version

ES|QL 多值函数

ES|QL 支持以下多值函数:

  • MV_AVG
  • MV_CONCAT
  • MV_COUNT
  • MV_DEDUPE
  • MV_MAX
  • MV_MEDIAN
  • MV_MIN
  • MV_SUM

MV_AVG

将多值字段转换为包含所有值的平均值的单值字段。 例如:

ROW a=[3, 5, 1, 6]
| EVAL avg_a = MV_AVG(a)
a:integeravg_a:double

[3, 5, 1, 6]

3.75

注意:输出类型始终为 double,输入类型可以是任意数字。

MV_CONCAT

将多值字符串字段转换为单值字段,其中包含由分隔符分隔的所有值的串联:

ROW a=["foo", "zoo", "bar"]
| EVAL j = MV_CONCAT(a, ", ")
a:keywordj:keyword

["foo", "zoo", "bar"]

"foo, zoo, bar"

如果要连接非字符串字段,请先对它们调用 TO_STRING:

ROW a=[10, 9, 8]
| EVAL j = MV_CONCAT(TO_STRING(a), ", ")
a:integerj:keyword

[10, 9, 8]

"10, 9, 8"

MV_COUNT

将多值字段转换为包含值数量的单值字段:

ROW a=["foo", "zoo", "bar"]
| EVAL count_a = MV_COUNT(a)
a:keywordcount_a:integer

["foo", "zoo", "bar"]

3

MV_DEDUPE

从多值字段中删除重复项。 例如:

ROW a=["foo", "foo", "bar", "foo"]
| EVAL dedupe_a = MV_DEDUPE(a)
a:keyworddedupe_a:keyword

["foo", "foo", "bar", "foo"]

["foo", "bar"]

注意:MV_DEDUPE 可能(但并不总是)对字段中的值进行排序。

MV_MAX

将多值字段转换为包含最大值的单值字段。 例如:

ROW a=[3, 5, 1]
| EVAL max_a = MV_MAX(a)
a:integermax_a:integer

[3, 5, 1]

5

它可以由任何字段类型使用,包括 keyword 字段。 在这种情况下,选择最后一个字符串,逐字节比较它们的 utf-8 表示形式:

ROW a=["foo", "zoo", "bar"]
| EVAL max_a = MV_MAX(a)
a:keywordmax_a:keyword

["foo", "zoo", "bar"]

"zoo"

MV_MEDIAN

将多值字段转换为包含中值的单值字段。 例如:

ROW a=[3, 5, 1]
| EVAL median_a = MV_MEDIAN(a)
a:integermedian_a:integer

[3, 5, 1]

3

它可以被任何数字字段类型使用并返回相同类型的值。 如果该行的一列有偶数个值,则结果将是中间两个条目的平均值。 如果该字段不是浮点型,则平均值向下舍入:

ROW a=[3, 7, 1, 6]
| EVAL median_a = MV_MEDIAN(a)
a:integermedian_a:integer

[3, 7, 1, 6]

4

MV_MIN

将多值字段转换为包含最小值的单值字段。 例如:

ROW a=[2, 1]
| EVAL min_a = MV_MIN(a)
a:integermin_a:integer

[2, 1]

1

它可以由任何字段类型使用,包括 keyword 字段。 在这种情况下,选择第一个字符串,逐字节比较它们的 utf-8 表示形式:

ROW a=["foo", "bar"]
| EVAL min_a = MV_MIN(a)
a:keywordmin_a:keyword

["foo", "bar"]

"bar"

MV_SUM

将多值字段转换为包含所有值之和的单值字段。 例如:

ROW a=[3, 5, 6]
| EVAL sum_a = MV_SUM(a)
a:integersum_a:integer

[3, 5, 6]

14

ES|QL 操作符

用于与一个或多个表达式进行比较的布尔运算符。

  • Binary operators
  • Logical operators
  • IS NULL and IS NOT NULL predicates
  • CIDR_MATCH
  • ENDS_WITH
  • IN
  • IS_FINITE
  • IS_INFINITE
  • IS_NAN
  • LIKE
  • RLIKE
  • STARTS_WITH

Binary operators

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

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

逻辑运算符

支持以下逻辑运算符:

  • AND
  • OR
  • NOT

IS NULL 和 IS NOT NULL 谓词

对于 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

CIDR_MATCH

如果提供的 IP 包含在提供的 CIDR 块之一中,则返回 true。

CIDR_MATCH 接受两个或多个参数。 第一个参数是 ip 类型的 IP 地址(支持 IPv4 和 IPv6)。 后续参数是用于测试 IP 的 CIDR 块。

FROM hosts
| WHERE CIDR_MATCH(ip, "127.0.0.2/32", "127.0.0.3/32")

ENDS_WITH

返回一个布尔值,指示关键字字符串是否以另一个字符串结尾:

FROM employees
| KEEP last_name
| EVAL ln_E = ENDS_WITH(last_name, "d")
last_name:keywordln_E:boolean

Awdeh

false

Azuma

false

Baek

false

Bamford

true

Bernatsky

false

支持的类型:

arg1arg2result

keyword

keyword

boolean

IN

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

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

IS_FINITE

返回一个布尔值,指示其输入是否是有限数。

ROW d = 1.0
| EVAL s = IS_FINITE(d/0)

IS_INFINITE

返回一个布尔值,指示其输入是否是无限的。

ROW d = 1.0
| EVAL s = IS_INFINITE(d/0)

IS_NAN

返回一个布尔值,指示其输入是否不是数字。

ROW d = 1.0
| EVAL s = IS_NAN(d)

LIKE

使用 LIKE 使用通配符根据字符串模式过滤数据。 LIKE 通常作用于位于运算符左侧的字段,但它也可以作用于常量(文字)表达式。 运算符的右侧代表模式。

支持以下通配符:

  • * 匹配零个或多个字符。
  • ? 匹配一个字符。
FROM employees
| WHERE first_name LIKE "?b*"
| KEEP first_name, last_name

RLIKE

使用 RLIKE 使用正则表达式根据字符串模式过滤数据。 RLIKE 通常作用于位于运算符左侧的字段,但它也可以作用于常量(文字)表达式。 运算符的右侧代表模式。

FROM employees
| WHERE first_name RLIKE ".leja.*"
| KEEP first_name, last_name

STARTS_WITH

返回一个布尔值,指示关键字字符串是否以另一个字符串开头:

FROM employees
| KEEP last_name
| EVAL ln_S = STARTS_WITH(last_name, "B")
last_name:keywordln_S:boolean

Awdeh

false

Azuma

false

Baek

true

Bamford

true

Bernatsky

true

支持的类型

arg1arg2result

keyword

keyword

boolean

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

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

相关文章

【计算机网络笔记】数据链路层概述

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

IAR为恩智浦S32M2提供全面支持,提升电机控制能力

IAR Embedded Workbench for Arm已全面支持恩智浦最新的S32系列&#xff0c;可加速软件定义汽车的车身和舒适性应用的开发 瑞典乌普萨拉&#xff0c;2023年11月22日 – 嵌入式开发软件和服务的全球领导者IAR现已全面支持恩智浦半导体&#xff08;NXP Semiconductors&#xff0…

好工具|datamap,一个好用的地图可视化Excel插件,在Excel中实现地理编码、拾取坐标

在做VRP相关研究的时候&#xff0c;需要对地图数据做很多处理&#xff0c;比如地理编码&#xff0c;根据“重庆市沙坪坝区沙正街174号”这样的一个文本地址知道他的经纬度&#xff1b;再比如绘制一些散点图&#xff0c;根据某个位置的经纬度在地图上把它标注出来。还有有的时候…

Redis-Redis高可用集群之水平扩展

Redis3.0以后的版本虽然有了集群功能&#xff0c;提供了比之前版本的哨兵模式更高的性能与可用性&#xff0c;但是集群的水平扩展却比较麻烦&#xff0c;今天就来带大家看看redis高可用集群如何做水平扩展&#xff0c;原始集群(见下图)由6个节点组成&#xff0c;6个节点分布在三…

一致性 Hash 算法 Hash 环发生偏移怎么解决

本篇是对文章《一文彻底读懂一致性哈希算法》的重写&#xff0c;图文并茂&#xff0c;篇幅较长&#xff0c;欢迎阅读完提供宝贵的建议&#xff0c;一起提升文章质量。如果感觉不错不要忘记点赞、关注、转发哦。原文链接&#xff1a; 《一文彻底读懂一致性Hash 算法》 通过阅读本…

界面组件Telerik UI for WinForms中文教程 - 创建明暗模式的桌面应用

黑暗模式现在在很多应用程序中都挺常见的&#xff0c;但如何在桌面应用程序中实现它呢&#xff1f;这很简单&#xff0c;本文将为大家介绍如何使用一个类和命令行调用来实现&#xff01; Telerik UI for WinForms拥有适用Windows Forms的110多个令人惊叹的UI控件。所有的UI fo…

绝地求生:PGC 2023 赛事直播期间最高可获:2000万G-Coins,你还不来吗?

今年PGC直播期间将有最高2000万G-Coin掉落&#xff0c;究竟花落谁家咱们拭目以待 公告原文&#xff1a;Watch PGC 2023 Live And Earn G-Coins! 如何赚取高额G-Coin&#xff1f; Throughout the PGC 2023, an astounding 20,000,000 G-Coins will be up for grabs as part of …

关于「光学神经网络」的一切:理论、应用与发展

/目录/ 一、线性运算的光学实现 1.1. 光学矩阵乘法器 1.2. 光的衍射实现线性运行 1.3. 基于Rayleigh-Sommerfeld方程的实现方法 1.4. 基于傅立叶变换的实现 1.5. 通过光干涉实现线性操作 1.6. 光的散射实现线性运行 1.7. 波分复用&#xff08;WDM&#xff09;实现线性运…

OpenCV快速入门:图像分析——傅里叶变换、积分图像

文章目录 前言一、傅里叶变换1.1 离散傅里叶变换1.1.1 离散傅里叶变换原理1.1.2 离散傅里叶变换公式1.1.3 代码实现1.1.4 cv2.dft 函数解析 1.2 傅里叶变换进行卷积1.2.1 傅里叶变换卷积原理1.2.2 傅里叶变换卷积公式1.2.3 代码实现1.2.4 cv2.mulSpectrums 函数解析 1.3 离散余…

Unity机器学习 ML-Agents第一个例子

上一节我们安装了机器学习mlagents的开发环境&#xff0c;本节我们创建第一个例子&#xff0c;了解什么是机器学习。 我们的例子很简单&#xff0c;就是让机器人自主移动到目标位置&#xff0c;不能移动到地板范围外。 首先我们来简单的了解以下机器学习的过程。 机器学习的过…

读像火箭科学家一样思考笔记07_探月思维

1. 挑战“不可能”的科学与企业 1.1. 互联网 1.1.1. 和电网一样具有革命性&#xff0c;一旦你插上电源&#xff0c;就能让自己的生活充满活力 1.1.2. 互联网的接入可以帮助人们摆脱贫困&#xff0c;拯救生命 1.1.3. 互联网还可以提供与天气相关的信息 1.2. 用廉价、可靠的…

搭配:基于OpenCV的边缘检测实战

引言 计算机中的目标检测与人类识别物体的方式相似。作为人类&#xff0c;我们可以分辨出狗的形象&#xff0c;因为狗的特征是独特的。尾巴、形状、鼻子、舌头等特征综合在一起&#xff0c;帮助我们把狗和牛区分开来。 同样&#xff0c;计算机能够通过检测与估计物体的结构和性…

【Django使用】10大章31模块md文档,第5篇:Django模板和数据库使用

当你考虑开发现代化、高效且可扩展的网站和Web应用时&#xff0c;Django是一个强大的选择。Django是一个流行的开源Python Web框架&#xff0c;它提供了一个坚实的基础&#xff0c;帮助开发者快速构建功能丰富且高度定制的Web应用 全套Django笔记直接地址&#xff1a; 请移步这…

【Docker】从零开始:8.Docker命令:Commit提交命令

【Docker】从零开始&#xff1a;8.Docker命令:Commit命令 基本概念镜像镜像分层什么是镜像分层为什么 Docker 镜像要采用这种分层结构 本章要点commit 命令命令格式docker commit 操作参数实例演示1.下载一个新的ubuntu镜像2.运行容器3.查看并安装vim4.退出容器5提交自己的镜像…

51单片机应用从零开始(八)·循环语句(for循环、while 语句、do‐while 语句)

51单片机应用从零开始&#xff08;七&#xff09;循环语句&#xff08;if语句&#xff0c;swtich语句&#xff09;-CSDN博客 目录 1. 用for 语句控制蜂鸣器鸣笛次数 2. 用while 语句控制 LED 3. 用 do‐while 语句控制 P0 口 8 位 LED 流水点亮 1. 用for 语句控制蜂鸣器鸣笛…

009 OpenCV 二值化 threshold

一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、二值化算法 2.1、概述 在机器视觉应用中&#xff0c;OpenCV的二值化函数threshold具有不可忽视的作用。主要的功能是将一幅灰度图进行二值化处理&#xff0c;以此大幅降低图像的数…

Linux:文件系统初步理解

文章目录 文件的初步理解C语言中对文件的接口系统调用的接口位图的理解open调用接口 文件和进程的关系进程和文件的低耦合 如何理解一切皆文件&#xff1f; 本篇总结的是关于Linux中文件的各种知识 文件的初步理解 在前面的文章中有两个观点&#xff0c;1. 文件 内容 属性&…

手撕A*算法(详解A*算法)

A*算法原理 全局路径规划算法&#xff0c;根据给定的起点和终点在全局地图上进行总体路径规划。 导航中使用A*算法计算出机器人到目标位置的最优路线&#xff0c;一般作为规划的参考路线 // 定义地图上的点 struct Point {int x,y; // 栅格行列Point(int x, int y):x(x),y(y){…

51单片机利用I/O口高阻状态实现触摸控制LED灯

51单片机利用I/O口高阻状态实现触摸控制LED灯 1.概述 这篇文章介绍使用I/O口的高阻状态实现一个触摸控制LED灯亮灭的实验。该实验通过手触摸P3.7引脚&#xff0c;改变电平信号控制灯的亮灭。 2.实验过程 2.1.实验材料 名称型号数量单片机STC12C20521LED彩灯无1晶振12MHZ1电…

PDF 批量处理软件BatchOutput PDF mac中文版介绍

BatchOutput PDF mac是一款适用于 Mac 的 PDF 批量处理软件。它可以帮助用户将多个 PDF 文件进行异步处理&#xff0c;提高工作效率。 BatchOutput PDF 可以自动化执行许多任务&#xff0c;包括 PDF 文件的打印、转换、分割、压缩、加密、重命名等&#xff0c;而且它还可以将自…