You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动