日志服务扫描(Scan)查询功能支持免配置索引进行目标字段的扫描,用于查询相关日志。本文介绍扫描查询功能的相关信息。

背景信息

日志服务基于索引技术,提供快速查询日志功能,但在某些场景下可能会遇到如下限制,无法创建或使用索引。
  • 为降低使用费用,而未对某些字段建立索引,但临时急需查询历史日志。
  • 字段值长度超过了索引限制,超出部分无法被查询。
  • 字段名较多,事先无法获取具体的字段名,无法建立字段索引。
  • 字段类型发生变化,无法查询。

针对上述问题,日志服务推出扫描查询和扫描分析功能,用于查询和分析日志,无需对扫描的目标字段建立索引。关于扫描分析的更多信息,请参见扫描(Scan)分析概述

基本语法

  • 基本语法
    查询语句 | WHERE bool_expression
  • 使用示例
    status:200 | WHERE userId = '123'

工作流程

日志服务接收到扫描请求后,执行流程主要分为如下两步。
  1. 先执行对应的查询语句进行日志查询。
    重要 查询语句仍依赖于索引。例如执行status:200 | WHERE userId = '123'语句前,您需为status字段创建索引,但无需为userId字段创建索引。
  2. 通过WHERE子句,在上述查询结果中挑选符合扫描条件的日志,并返回最终的查询结果。

查询与扫描的对比

对比项索引查询扫描查询
语法查询语句。更多信息,请参见查询语法查询语句 | where bool_expression
是否需要配置索引需要。不需要。
重要 竖线(|)前的查询语句仍依赖于索引。
是否支持搭配分析语句支持。支持。
是否支持随机翻页支持。不支持。

只能连续翻页(前翻或后翻)。

日志直方图基于查询语句的查询结果进行展示。基于查询语句的查询结果、扫描进度进行展示。
运算符与函数支持逻辑、数学运算;支持模糊查询;不支持SQL函数。支持LIKE、IN、BETWEEN、IS NULL、IS NOT NULL、EXISTS等关键词;支持部分SQL函数,具体请参见支持的函数
字段类型由索引配置中的数据类型决定。更多信息,请参见数据类型无论字段是否已配置索引,在扫描模式下 WHERE子句中出现的字段均按照text类型处理。
说明 如果您需要使用某个入参为非text的函数(例如abs),则需要通过cast函数转换字段类型。更多信息,请参见cast函数
结果集大小通过控制台或SDK指定,最大100条。满足下述任一条件,本次扫描结束并返回扫描结果。
  • 达到您所指定的结果条数。

    您可以控制台或SDK指定返回的结果条数。

  • 扫描超过了单次系统设定的最大条数(基于查询语句的结果集,默认10万条。)
  • 扫描执行时间超过45秒。
费用索引流量和索引存储费用。更多信息,请参见计费项扫描部分按照流量收费,即基于索引查询后扫描命中的数据量收费。

优点

  • 节省费用:无需创建索引,节省索引流量和存储空间费用。
  • 灵活:在使用时按需定义列的类型,不受是否创建索引及索引类型限制。
  • 搜索能力增强,新支持多种函数。

使用限制

不支持随机翻页。

支持的函数

数学函数

函数名称语法说明
abs函数abs(x)计算x的绝对值。
cbrt函数cbrt(x)计算x的立方根。
ceil函数ceil(xx进行向上取整数。

ceil函数是ceiling函数的别名。

ceiling函数ceiling(xx进行向上取整数。
e函数e()返回自然底数e的值。
exp函数exp(x)计算自然底数e的x次幂。
floor函数floor(x)x进行向下取整数。
from_base函数from_base(x, y)根据BASE编码将x转为y进制的数字。
ln函数ln(x)计算x的自然对数。
log2函数log2(x)计算x以2为底的对数。
log10函数log10(x)计算x以10为底的对数。
mod函数mod(x, y)计算xy相除的余数。
pi函数pi()返回π值,精确到小数点后15位。
pow函数pow(x, y)计算xy次幂。

pow函数是power函数的别名。

power函数power(x, y)计算xy次幂。
radians函数radians(x)将度转换为弧度。
rand函数rand()返回随机数。
random函数random()返回[0,1)之间的随机数。
random(x)返回[0,x)之间的随机数。
round函数round(x)x进行四舍五入取整数。
round(x, n)x进行四舍五入且保留n位小数。
sqrt函数sqrt(x)计算x的平方根。
to_base函数to_base(x, y)根据BASE编码将x转为y进制的字符串。
truncate函数truncate(x)截断x的小数部分。
width_bucket函数width_bucket(x, bound1, bound2, numBuckets)将一段数值范围划分成大小相同的多个Bucket,然后返回x所属的Bucket。
width_bucket(x, bins)使用数组指定Bucket的范围,然后返回x所属的Bucket。

字符串函数

函数名称语法说明
chr函数chr(x)将ASCII码转换为字符。
codepoint函数codepoint(x)将字符转换为ASCII码。
concat函数concat(x, y...)将多个字符串拼接成一个字符串。
length函数length(x)计算字符串的长度。
lower函数lower(x)将字符串转换为小写形式。
lpad函数lpad(x, length, lpad_string)在字符串的开头填充指定字符,直到指定长度后返回结果字符串。
ltrim函数ltrim(x)删除字符串开头的空格。
replace函数replace(x, sub_string )删除字符串中匹配的字符。
replace(x, sub_string, replace_string)将字符串中所匹配的字符替换为其他指定字符。
reverse函数reverse(x)返回反向顺序的字符串。
rpad函数rpad(x, length, rpad_string)在字符串的尾部填充指定字符,直到指定长度后返回结果字符串。
rtrim函数rtrim(x)删除字符串中结尾的空格。
split函数split(x, delimeter)使用指定的分隔符拆分字符串,并返回子串集合。
split(x, delimeter, limit)通过指定的分隔符拆分字符串并使用limit限制字符串拆分的个数,然后返回拆分后的子串集合。
split_part函数split_part(x, delimeter, part)使用指定的分隔符拆分字符串,并返回指定位置的内容。
strpos函数strpos(x, sub_string)返回目标子串在字符串中的位置。
strpos(x, sub_string, instance)返回第instance个目标子串的在字符串中的位置,instance必须是正数。子串从1开始计数,如果没有找到,返回0。
substr函数substr(x, start)返回字符串中指定位置的子串。
substr(x, start, length)返回字符串中指定位置的子串,并指定子串长度。
to_utf8函数to_utf8(x)将字符串转换为UTF-8编码格式。
trim函数trim(x)删除字符串中开头和结尾的空格。
upper函数upper(x)将字符串转化为大写形式。

日期和时间函数

函数类型函数名称语法说明
日期和时间函数date_format函数date_format(x, format)将timestamp类型的日期和时间表达式转化为指定格式的日期和时间表达式。
from_unixtime函数from_unixtime(x)将UNIX时间戳转化为无时区的timestamp类型的日期和时间表达式。
from_unixtime(x, time zone)将UNIX时间戳转化为带时区的timestamp类型的日期和时间表达式。
from_unixtime(x, hours, minutes)将UNIX时间戳转化为带时区的timestamp类型的日期和时间表达式,其中hoursminutes为时区偏移量。
to_unixtime函数to_unixtime(x)将timestamp类型的日期和时间表达式转化成UNIX时间戳。
parse_datetime函数parse_datetime(x, format)根据format将字符串转化为带时区的timestamp类型的日期和时间表达式。
日期和时间提取函数day函数day(x)提取日期和时间表达式中的天数,按月计算。

day函数等同于day_of_month函数。

day_of_month函数day_of_month(x)提取日期和时间表达式中的天数,按月计算。

day_of_month函数等同于day函数。

day_of_week函数day_of_week(x)提取日期和时间表达式中的天数,按周计算。

day_of_week函数等同于dow函数。

day_of_year函数day_of_year(x)提取日期和时间表达式中的天数,按年计算。

day_of_year函数等同于doy函数。

dow函数dow(x)提取日期和时间表达式中的天数,按周计算。

dow函数等同于day_of_week函数。

doy函数doy(x)提取日期和时间表达式中的天数,按年计算。

doy函数等同于day_of_year函数。

extract函数extract(field from x)通过指定的field,提取日期和时间表达式中的日期或时间部分。
hour函数hour(x)提取日期和时间表达式中的小时数,按24小时制计算。
minute函数minute(x)提取日期和时间表达式中的分钟数。
millisecond函数millisecond(x)提取日期和时间表达式中的毫秒数。
month函数month(x)提取日期和时间表达式中的月份。
quarter函数quarter(x)计算目标日期所属的季度。
second函数second(x)提取日期和时间表达式中的秒数。
year函数year(x)提取目标日期中的年份。
year_of_week函数year_of_week(x)提取目标日期在ISO周日历中的年份。

year_of_week函数等同于yow函数。

yow函数yow(x)提取目标日期在ISO周日历中的年份。

yow函数等同于year_of_week函数。

时间间隔函数date_trunc函数date_trunc(unit, x)根据您指定的时间单位截断日期和时间表达式,并按照毫秒、秒、分钟,小时、日、月或年对齐。
date_add函数date_add(unit, N, x)x上加上N个时间单位(unit)。
date_diff函数date_diff(unit, x, y)返回两个时间表达式之间的时间差值,例如计算xy之间相差几个时间单位(unit)。

正则式函数

函数名称语法说明
regexp_extract_all函数regexp_extract_all(x, regular expression)提取目标字符串中符合正则表达式的子串,并返回所有子串的合集。
regexp_extract_all(x, regular expression, n)提取目标字符串中符合正则表达式的子串,然后返回与目标捕获组匹配的子串合集。
regexp_extract函数regexp_extract(x, regular expression)提取并返回目标字符串中符合正则表达式的第一个子串。
regexp_extract(x, regular expression, n)提取目标字符串中符合正则表达式的子串,然后返回与目标捕获组匹配的第一个子串。
regexp_like函数regexp_like(x, regular expression)判断目标字符串是否符合正则表达式。
regexp_replace函数regexp_replace(x, regular expression)删除目标字符串中符合正则表达式的子串,返回未被删除的子串。
regexp_replace(x, regular expression, replace string)替换目标字符串中符合正则表达式的子串,返回被替换后的字符串。

JSON函数

函数名称语法说明
json_extract_scalar函数json_extract_scalar(x, json_path)从JSON对象或JSON数组中提取一组标量值(字符串、整数或布尔值)。