ELK查詢指令-類似where的搜索條件-數字和日期搜索
前言
在用MySQL時,常常會用到類似底下的語法
SELECT 'name', 'id' FROM 'mytable' WHERE name = 'myname'
SELECT 'name', 'id' FROM 'mytable' WHERE id BETWEEN 10 AND 20
這邊牽涉到文字的比對和數字的比對
ELK在數字的比對,與SQL的思維很像,只是語法不同
但ELK在文字的比對有一些眉角在,需要先知道ELK怎麼處理文字,才能知道怎麼下條件
先從簡單的數字和日期比對開始
PS : 從這篇開始不會提到URL的部分,如想了解URL格式可參考此文章
數字的比對
GET myindex/_search
{
"query": {
"range": {
"欄位": {
"gte": "12",
"lt": "15"
}
}
}
}
時間的比對
如果目標欄位的類型是 date,可以直接進行時間的搜索
GET myindex/_search
{
"query": {
"range": {
"timestamp": {
"gt": "2020-03-02",
"le": "now-2h"
}
}
}
}
range
搜索一個範圍內的東西,包括數字、時間和文字
不建議使用range的方式搜索文字,elasticsearch實際上還是會對個別的可能性進行term搜索
gt
大於,不等於
gte
大於,等於
lt
小於,不等於
lte
小於,等於
日期運算方法有兩種
日期的加減
日期 + 時間 或 日期 - 時間
2020-02-05+1M
變成 2020-03-05
2020-02-05T15:33:12-1m
變成 2020-03-05T15:32:12
round down
重設日期為相對單位的初始值
日期/時間單位
2020-02-05/M
變成 2020-02-01
2020-02-05+1M/M
變成 2020-03-01
2020-02-05T15:33:12/d
變成 2020-02-05T00:00:00
日期的運算格式在這邊可以看到
PS : T只是一個符號,代表從這個符號之後是時間
日期運算的寫法也有兩種
PS : 兩者沒有差異
直接加上運算符號
2020-02-05+1M/M
使用 || 符號
2020-02-05||+1M/M
範例參考
分數大於等於80
{
"query": {
"range": {
"score": {
"gte": "80"
}
}
}
}
速度不足50,不包括50
{
"query": {
"range": {
"speed": {
"lt": "50"
}
}
}
}
花費在100-200之間,包含100和200
{
"query": {
"range": {
"cost": {
"gte": 100,
"lte": "200"
}
}
}
}
10分鐘之前
{
"query": {
"range": {
"timestamp": {
"gte": "now-10m",
"lte": "now"
}
}
}
}
從現在往前回算1個月
{
"query": {
"range": {
"timestamp": {
"gte": "now-1M",
"lte": "now"
}
}
}
}
上個月初到這個月初,不包括這個月初
{
"query": {
"range": {
"timestamp": {
"gte": "now-1M/M",
"lt": "now/M"
}
}
}
}
昨天零時到今天零時,不包括今天零時
{
"query": {
"range": {
"timestamp": {
"gte": "now-1d/d",
"lt": "now/d"
}
}
}
}
在用MySQL時,常常會用到類似底下的語法
SELECT 'name', 'id' FROM 'mytable' WHERE name = 'myname'
SELECT 'name', 'id' FROM 'mytable' WHERE id BETWEEN 10 AND 20
這邊牽涉到文字的比對和數字的比對
ELK在數字的比對,與SQL的思維很像,只是語法不同
但ELK在文字的比對有一些眉角在,需要先知道ELK怎麼處理文字,才能知道怎麼下條件
先從簡單的數字和日期比對開始
PS : 從這篇開始不會提到URL的部分,如想了解URL格式可參考此文章
數字的比對
GET myindex/_search
{
"query": {
"range": {
"欄位": {
"gte": "12",
"lt": "15"
}
}
}
}
時間的比對
如果目標欄位的類型是 date,可以直接進行時間的搜索
GET myindex/_search
{
"query": {
"range": {
"timestamp": {
"gt": "2020-03-02",
"le": "now-2h"
}
}
}
}
range
搜索一個範圍內的東西,包括數字、時間和文字
不建議使用range的方式搜索文字,elasticsearch實際上還是會對個別的可能性進行term搜索
gt
大於,不等於
gte
大於,等於
lt
小於,不等於
lte
小於,等於
日期運算方法有兩種
日期的加減
日期 + 時間 或 日期 - 時間
2020-02-05+1M
變成 2020-03-05
2020-02-05T15:33:12-1m
變成 2020-03-05T15:32:12
round down
重設日期為相對單位的初始值
日期/時間單位
2020-02-05/M
變成 2020-02-01
2020-02-05+1M/M
變成 2020-03-01
2020-02-05T15:33:12/d
變成 2020-02-05T00:00:00
日期的運算格式在這邊可以看到
PS : T只是一個符號,代表從這個符號之後是時間
日期運算的寫法也有兩種
PS : 兩者沒有差異
直接加上運算符號
2020-02-05+1M/M
使用 || 符號
2020-02-05||+1M/M
範例參考
分數大於等於80
{
"query": {
"range": {
"score": {
"gte": "80"
}
}
}
}
速度不足50,不包括50
{
"query": {
"range": {
"speed": {
"lt": "50"
}
}
}
}
花費在100-200之間,包含100和200
{
"query": {
"range": {
"cost": {
"gte": 100,
"lte": "200"
}
}
}
}
10分鐘之前
{
"query": {
"range": {
"timestamp": {
"gte": "now-10m",
"lte": "now"
}
}
}
}
從現在往前回算1個月
{
"query": {
"range": {
"timestamp": {
"gte": "now-1M",
"lte": "now"
}
}
}
}
上個月初到這個月初,不包括這個月初
{
"query": {
"range": {
"timestamp": {
"gte": "now-1M/M",
"lt": "now/M"
}
}
}
}
昨天零時到今天零時,不包括今天零時
{
"query": {
"range": {
"timestamp": {
"gte": "now-1d/d",
"lt": "now/d"
}
}
}
}
留言
發佈留言