按logtype

时间:2017-02-06 10:10:29

标签: elasticsearch aggregate

我的日志有多种类型。每种日志类型都有按日期组织的多个索引。日志类型共享相似的字段(这意味着我可以在多个日志类型+指示上运行单个查询来过滤掉结果)。我想通过“日志类型”得到与某些标准组匹配的计数。

解决此问题的一种方法是并行运行多个查询。每个查询都像普通的_search查询一样,在单个log_type上使用过滤条件。然后我们可以返回_count。但它需要运行多个查询 - 多次往返。

是否有更好的方法只在单个查询中获得结果。

- 下面是我的简化映射 -

   "logstash-2017.01.09": {
      "mappings": {
         "typeA": {
            "properties": {
                "IP": {
                  "type": "ip",
                  "fields": {
                     "raw": {
                        "type": "string",
                        "index": "not_analyzed"
                     }
                  }
               },
               "COUNTRY": {
                  "type": "string",
                  "norms": {
                     "enabled": false
                  },
                  "fields": {
                     "raw": {
                        "type": "string",
                        "index": "not_analyzed"
                     }
                  }
               }
           }
        },
        "typeB": {
            "properties": {
                "IP": {
                  "type": "ip",
                  "fields": {
                     "raw": {
                        "type": "string",
                        "index": "not_analyzed"
                     }
                  }
               },
               "COUNTRY": {
                  "type": "string",
                  "norms": {
                     "enabled": false
                  },
                  "fields": {
                     "raw": {
                        "type": "string",
                        "index": "not_analyzed"
                     }
                  }
               }
           }
        }
    }
}

有多个索引,例如logstash-(按日期组织)。我想为日志匹配条件找到COUNT(按日志类型分组),例如country ='US';

样本响应应该是这样的:

{  typeA:30000,  typeB:50000 }

或者有30000个类型A的记录匹配'country = US';等...

我正在使用elasticsearch nodejs客户端。以下是我的尝试:

elasticClient.search({
    index: indices.join(","), //['logstash-2017.01.09', 'logstash-2017.01.10'] -- all indices within time interval
    type: logTypes.join(","), //['typeA'] -- run for each type separatedly and in parallel
    body: {
        "query": {
            "filtered":{
                "query": {
                    "query_string" : {
                        "query": 'COUNTRY:"US"' // example only
                    }
                },
                "filter": { 
                     "range" : {
                        "@timestamp" : {
                            "from" : startIso,
                            "to" : endIso
                        }
                    }
                }
            }
        },
        "from"   : 0,
        "size"   : 0
    }
})

0 个答案:

没有答案