日志服务扫描(Scan)查询功能支持免配置索引进行目标字段的扫描,用于查询相关日志。本文介绍扫描查询功能的相关信息。
背景信息
日志服务基于索引技术,提供快速查询日志功能,但在某些场景下可能会遇到如下限制,无法创建或使用索引。
- 为降低使用费用,而未对某些字段建立索引,但临时急需查询历史日志。
- 字段值长度超过了索引限制,超出部分无法被查询。
- 字段名较多,事先无法获取具体的字段名,无法建立字段索引。
- 字段类型发生变化,无法查询。
针对上述问题,日志服务推出扫描查询和扫描分析功能,用于查询和分析日志,无需对扫描的目标字段建立索引。关于扫描分析的更多信息,请参见扫描(Scan)分析概述。
基本语法
- 基本语法
查询语句 | WHERE bool_expression
- 使用示例
status:200 | WHERE userId = '123'
工作流程
日志服务接收到扫描请求后,执行流程主要分为如下两步。
- 先执行对应的查询语句进行日志查询。重要 查询语句仍依赖于索引。例如执行
status:200 | WHERE userId = '123'
语句前,您需为status字段创建索引,但无需为userId字段创建索引。 - 通过WHERE子句,在上述查询结果中挑选符合扫描条件的日志,并返回最终的查询结果。
查询与扫描的对比
对比项 | 索引查询 | 扫描查询 |
---|---|---|
语法 | 查询语句 。更多信息,请参见查询语法。 | 查询语句 | where bool_expression |
是否需要配置索引 | 需要。 | 不需要。 重要 竖线(|)前的查询语句仍依赖于索引。 |
是否支持搭配分析语句 | 支持。 | 支持。 |
是否支持随机翻页 | 支持。 | 不支持。 只能连续翻页(前翻或后翻)。 |
日志直方图 | 基于查询语句的查询结果进行展示。 | 基于查询语句的查询结果、扫描进度进行展示。 |
运算符与函数 | 支持逻辑、数学运算;支持模糊查询;不支持SQL函数。 | 支持LIKE、IN、BETWEEN、IS NULL、IS NOT NULL、EXISTS等关键词;支持部分SQL函数,具体请参见支持的函数。 |
字段类型 | 由索引配置中的数据类型决定。更多信息,请参见数据类型。 | 无论字段是否已配置索引,在扫描模式下 WHERE子句中出现的字段均按照text类型处理。 说明 如果您需要使用某个入参为非text的函数(例如abs),则需要通过cast函数转换字段类型。更多信息,请参见cast函数。 |
结果集大小 | 通过控制台或SDK指定,最大100条。 | 满足下述任一条件,本次扫描结束并返回扫描结果。
|
费用 | 索引流量和索引存储费用。更多信息,请参见计费项。 | 扫描部分按照流量收费,即基于索引查询后扫描命中的数据量收费。 |
优点
- 节省费用:无需创建索引,节省索引流量和存储空间费用。
- 灵活:在使用时按需定义列的类型,不受是否创建索引及索引类型限制。
- 搜索能力增强,新支持多种函数。
使用限制
不支持随机翻页。
支持的函数
数学函数
函数名称 | 语法 | 说明 |
---|---|---|
abs函数 | abs(x) | 计算x的绝对值。 |
cbrt函数 | cbrt(x) | 计算x的立方根。 |
ceil函数 | ceil(x) | 对x进行向上取整数。 ceil函数是ceiling函数的别名。 |
ceiling函数 | ceiling(x) | 对x进行向上取整数。 |
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) | 计算x与y相除的余数。 |
pi函数 | pi() | 返回π值,精确到小数点后15位。 |
pow函数 | pow(x, y) | 计算x的y次幂。 pow函数是power函数的别名。 |
power函数 | power(x, y) | 计算x的y次幂。 |
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类型的日期和时间表达式,其中hours和minutes为时区偏移量。 | ||
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) | 返回两个时间表达式之间的时间差值,例如计算x和y之间相差几个时间单位(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数组中提取一组标量值(字符串、整数或布尔值)。 |