Elasticsearch新手求助:SQL转ES查询及Curl调用问题
把SQL查询转换为Elasticsearch查询(附Curl执行命令)
嘿,作为Elasticsearch新手不用慌,我来一步步帮你搞定这条SQL转ES查询的需求,同时解答你关于当前日期处理的疑问~
一、Elasticsearch中GetDate()的等效写法
在ES里,你不需要像SQL那样用GetDate()来获取当前日期,直接用内置关键字now就可以啦!它会自动获取ES节点的当前时间。如果要像你的SQL那样取当天的某个时间点,还可以结合日期数学表达式:
now/d:表示当天的00:00:00(午夜)- 你需要的当天07:40:00可以写成
now/d+7h40m - 当天22:15:00则是
now/d+22h15m
二、SQL转Elasticsearch查询语句
你的原SQL是统计符合条件的文档总数,对应ES里我们可以用bool组合查询,加上size:0(不需要返回具体文档)和聚合来实现。下面是标准的DSL查询:
{ "size": 0, "query": { "bool": { "must": [ { "wildcard": { "Message": "*Communication has failed.*" } }, { "range": { "@timestamp": { "gt": "now/d+7h40m", "lt": "now/d+22h15m" } } } ] } }, "aggs": { "total_count": { "value_count": { "field": "_id" } } } }
小提示:
如果你的Message字段是text类型(默认分词),用wildcard可能效率不高,更推荐用match_phrase来精确匹配短语:
{ "match_phrase": { "Message": "Communication has failed." } }
如果Message有对应的keyword子字段(比如Message.keyword),用这个字段查询会更高效哦!
三、用Curl执行查询的命令
把上面的DSL放到curl里执行,注意替换你的ES地址、索引名(原SQL的table对应ES里的索引名):
curl -X GET "http://your-es-host:9200/your-index-name/_search?pretty" -H "Content-Type: application/json" -d' { "size": 0, "query": { "bool": { "must": [ { "wildcard": { "Message": "*Communication has failed.*" } }, { "range": { "@timestamp": { "gt": "now/d+7h40m", "lt": "now/d+22h15m" } } } ] } }, "aggs": { "total_count": { "value_count": { "field": "_id" } } } }'
执行后,你会在返回的aggregations.total_count.value里看到统计的总数。
另外,如果你只想快速计数,也可以用ES的_count API,更简洁:
curl -X GET "http://your-es-host:9200/your-index-name/_count?pretty" -H "Content-Type: application/json" -d' { "query": { "bool": { "must": [ { "wildcard": { "Message": "*Communication has failed.*" } }, { "range": { "@timestamp": { "gt": "now/d+7h40m", "lt": "now/d+22h15m" } } } ] } } }'
这个返回的count字段就是你要的总数啦!
内容的提问来源于stack exchange,提问作者flalar




