如何在比赛中使用AND运算符(Kibana开发工具)

时间:2019-09-14 17:30:08

标签: elasticsearch kibana

我正在使用开发工具,波纹管查询在Kibana Discover中可以正常工作

public TokenController(IHttpClientFactory clientFactory) : base (clientFactory)
{
  /* other initializations */
}

但是当我在开发工具中执行相同操作时,它仅使用HEARTBEAT,但显示所有数据的位置均为0和1,但是我只需要0

log.file.path:*MY.log*    AND "[COMMAND:HEARTBEAT]"  AND "[CHARGING:0]"

日志映射 我正在用相同的方法记录2 一条消息,并使用logstash将我转换为Json,我在这里都添加了


GET filebeat-*/_search
{
  "size": 1000,
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "log.file.path": "LOG.log"
          }
        },
        {
          "term": {
            "COMMAND": {
              "value": "HEARTBEAT"
            }
          }
        },
        {
          "term": {
            "CHARGING": {
              "value": "0"
            }
          }
        }
      ],
      "filter": {
        "range": {
          "@timestamp": {
            "gte": "now-15m"
          }
        }
      }
    }
  }
}

我的真实日志是

{
  "_index": "filebeat-7.2.0-2019.09.14",
  "_type": "_doc",
  "_id": "Aps9MW0BBmrGS9dAswgZ",
  "_version": 1,
  "_score": null,
  "_source": {
    "ecs": {
      "version": "1.0.0"
    },
    "@version": "1",
    "message": "[COMMAND:HEARTBEAT],[GPS STATUS:true],[INFO:false],[SIGNAL:false],[ENGINE:0],[DOOR:0],[LON:0],[LAT:0],[SPEED:0.0],[HEADING:-1.0],[BATTERY:100.0%],[CHARGING:0],[O&E:CONNECTED],",


    "GPS-LOG": {
      "O&E": "CONNECTED",
      "GPS POS": "true",
      "ENGINE": "0",
      "COMMAND": "HEARTBEAT",
      "GSM_SIGNAL": "75",

      "CHARGING": "0",
      "HEADING": "-1.0",
      "FUEL": "0.0V/0.0%",
      "SPEED": "0.0",
      "GPS STATUS": "true",
      "ALARM": "NONE",
      "BATTERY": "100.0%",
      "TIMESTAMP": "null",
      "LON": "0",
      "LAT": "0",
      "DOOR": "0",
      "SERIAL": "1670",
      "SIGNAL": "false",
      "INFO": "false",
      "GPS_SATS": "11"
    },

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

Kibana Discovery使用Lucene语法(Lucene是Elasticsearch所基于的搜索引擎/技术)来查询数据。但是,当您通过DevTool发送请求时,您基本上会调用 Elasticsearch REST API 。您可以在此处使用Lucene语法。

您的第二个匹配查询是问题所在

我假设您要搜索完全匹配的内容(命令== HEARTBEAT;收费== 0)。但是,通过匹配查询,您可以在字段上进行全文搜索

您需要使用term query来代替匹配查询。因此,在第一个匹配查询之后,您将在必备条款内定义两个术语查询(一个用于命令字段,一个用于收费字段)。请注意,使用必须子句时,它将自动对其中的所有查询应用AND运算符。

这是您的查询(未经测试)的样子:

GET filebeat-*/_search
{
  "size": 1000,
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "log.file.path": "MYlog"
          }
        },
        {
          "term": {
            "command": {
              "value": "HEARTBEAT"
            }
          }
        },
        {
          "term": {
            "charging": {
              "value": 0
            }
          }
        }
      ],
      "filter": {
        "range": {
          "@timestamp": {
            "gte": "now-15m"
          }
        }
      }
    }
  }
}

或者,您可以在命令中进行搜索。关键字字段。