从 SQL 转换为 elasticsearch 查询

Converting from SQL to elasticsearch query

Elasticsearch 菜鸟,需要查询方面的帮助。我有以下 SQL 查询,我需要将其转换为对 Elasticsearch

的查询
SELECT COUNT(*) 
FROM table 
WHERE Message LIKE '%Communication  has failed.%'
  AND [Date] > CONVERT( CHAR(8), GetDate(), 112) + ' 07:40:00'
  AND [Date] < CONVERT( CHAR(8), GetDate(), 112) + ' 22:15:00'

我想 运行 使用 curl 对 elasticsearch 进行查询,需要帮助编写查询。

[Date] 等于 Elasticsearch 文档中的 @timestamp。如果弹性查询语法具有 getdate() 与当前数据的等价物,那也很好。

获取所有结果的最简单方法是使用结果集中的 hits 字段。如果你想这样做,你的查询将是:

POST /my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "message": "*Communication  has failed*"
          }
        },
        {
          "range": {
            "my_date_field": {
              "gte": "01/01/2018",
              "lt": "01/02/2018",
              "format": "dd/MM/yyyy"
            }
          }
        }
      ]
    }
  },
  "size": 0
}

请注意,我正在对 date 进行范围查询,对 message 进行匹配查询。 我还将 size 设置为零 b/c 我只想取回 hits 值。结果将如下所示:

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 346,
    "max_score": 0,
    "hits": []
  }
}

您也可以使用聚合查询,但在这种情况下,您可能希望在一个字段上进行聚合,并且聚合结果将与命中字段值相同。将聚合想象成 SQL 中的 GROUP BY 函数。如果你只给GROUP BY一组,那么你的组就等于COUNT(*)的值。如果您有兴趣了解有关聚合的更多信息,请参阅此处的文档: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-valuecount-aggregation.html